窗口操作的一些技巧

本文深入探讨了 Windows 应用程序中窗口的管理与操作,包括实例句柄获取、主窗口指针获取、其他程序图标获取、最高窗口实现、窗口图标与默认风格更改、窗口居中显示、窗口最大化与最小化、窗口极小状态保持、窗口大小限制、窗口移动与重置大小、控件禁用与使能、窗口设置改变、通用控件显示窗口、移动窗口、重置窗口大小、禁止与使能控件以及窗口相关设置等关键概念。
 1. 如何获取应用程序的实例句柄?
应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用
AfxGetInstancdHandle获得句柄.
Example: HANDLE hInstance=AfxGetInstanceHandle();

//------------------------------------------------------------------------------
2. 如何通过代码获得应用程序主窗口的指针?
主窗口的 指针保存在CWinThread::m_pMainWnd中,调用 AfxGetMainWnd实现。
AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化.

//------------------------------------------------------------------------------
3. 如何在程序中获得其他程序的 图标?
两种方法:
(1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle,
(2) SDK函数 SHGetFileInfo获得有关文件的 很多信息,如大小图标,属性,类型等.
Example(1): 在程序窗口左上角显示 NotePad图标.
void CSampleView: OnDraw(CDC * pDC)
{
if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon);
}
}
Example(2): 同样功能,Use ExtractIcon Function
void CSampleView:: OnDraw(CDC *pDC)
{
HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon);
}
说明: 获得notepad.exe 的路径正规上来说用GetWindowsDirectory 函数得到,如果是
调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程
序,考虑应该全面点.

//------------------------------------------------------------------------------
4.最高窗口的实现 

VC++中对基于SDI、MDI的运用程序,要实现最高窗口,只要在框架窗口类CMainFrame中的PreCreateWindow()函数中加入“cs.dwExStyle =WS_EX_TOPMOST;”即可。
而对基于对话框的运用程序,如何实现最高窗口却很少论及,以下便是一种实现方法。
重载要实观最高窗口的对话框的OnInitDialog()函数,方法是进入ClassWizard,在Object ID列表框中选择该对话框的ID,在Message列表框中选择WM_INITDIALOGG,单击Add Function按钮后,即对onlnitDialog函数进行了重载。再按下Edit code按钮,加入以下语句:
const CWnd * pWndInsertAfter;
pWndInsertAfter = &wndTopMost;
SetWindowPos(pWndInsertAfter,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
函数SetWindowPos原型为BOOL SetWindowPos(const CWnd * pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
pWndInsertAfter为指向标识窗口类型的CWnd对象的指针。
x,y为窗口左上角的坐标。
cx,cy为窗口的宽与高。
nFlags确定窗口的大小及位置。当为SWP_NOSIZE时,忽略cx,cy。当为SWP_NOMOVE时,忽略x,y。

//------------------------------------------------------------------------------
5. 如何改变窗口的图标?
向窗口发送 WM_SECTION消息。
Example:
HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON);
ASSERT(hIcon);
AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon);

//------------------------------------------------------------------------------
6. 如何改变窗口的缺省风格?
重栽 CWnd:: PreCreateWindow 并修改CREATESTRUCT 结构来指定窗口风格和其他创建
信息.
Example: Delete "Max" Button and Set Original Window's Position and Size
BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT &cs)
{
cs.style &=~WS_MAXINIZEMOX;
cs.x=cs.y=0;
cs.cx=GetSystemMetrics(SM_CXSCREEN/2);
cs.cy=GetSystemMetrics(SM_CYSCREEN/2);
return CMDIFramewnd ::PreCreateWindow(cs);
}

//------------------------------------------------------------------------------
7. 如何将窗口居中显示?
Easy, Call Function CWnd:: Center Windows
Example(1): Center Window( ); //Relative to it's parent
// Relative to Screen
Example(2): Center Window(CWnd:: GetDesktopWindow( ));
//Relative to Application's MainWindow
AfxGetMainWnd( ) -> Center Window( );

//------------------------------------------------------------------------------
8. 如何让窗口和 MDI窗口一启动就最大化和最小化?
先说窗口。
在 InitStance 函数中设定 m_nCmdShow的 取值.
m_nCmdShow=SW_SHOWMAXMIZED ; //最大化
m_nCmdShow=SW_SHOWMINMIZED ; //最小化
m_nCmdShow=SW_SHOWNORMAL ; //正常方式
MDI窗口:
如果是创建新的应用程序,可以用 MFC AppWizard 的Advanced 按钮并在MDI 子窗口风
格组中检测最大化或最小化; 还可以重载 MDI Window 的PreCreateWindow函数,设置
WS_MAXMIZE or WS_MINMIZE;如果从 CMDIChildWnd 派生,调用 OnInitialUpdate函数中
的 CWnd::Show Window来指定 MDI Child Window的 风格。

//------------------------------------------------------------------------------
9. 如何使程序保持极小状态?
在恢复程序窗体大小时, Windows会发送WM_QUERY-OPEN消息, 用 ClassWizard设置成员函数 OnQueryOpen() ,add following code:
Bool CMainFrame:: OnQueryOpen( )
{
Return false;
}

//------------------------------------------------------------------------------
10. 如何将窗口的大小限制为特定值:
Windows发送一个WM_GETMAXMININFO消息来确定窗口的位置、大小以及跟踪尺寸,下面将窗口的追踪尺寸限制为1/4屏幕大小:
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR *LPmmI)
{
lpMMI->ptMaxTrackSize.x=GetSystemMetrics(SM_CXSCREEN)/2;
lpMMI->ptMaxTrackSize.Y=GetSystemMetrics(SM_CYSCREEN)/2;
CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
}


//------------------------------------------------------------------------------
11. 如何使窗口不可见?
很简单,用SW_HIDE 隐藏窗口,可以结合 FindWindow,ShowWindow 控制.

//------------------------------------------------------------------------------
12. 通用控件的显示窗口

MFC提供了几个CView 派生的视窗类, 封装了通用控件的功能,但仍然使用工作框文档
显示窗口体系结构:CEditView 封装了编辑控件,CTreeView 保持了树列表控件,
CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。

//------------------------------------------------------------------------------
13. 移动窗口

调用CWnd : : SetWindowPos 并指定SWP_NOSIZE 标志。目的位置与_____父窗口有关(顶层
窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口的大小。
//Move window to positoin 100 , 100 of its parent window .
SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE |SWP_NOAORDER);

//------------------------------------------------------------------------------
14. 重置窗口的大小

调用CWnd: : SetWindowPos 并指定SWP_NOMOVE标志, 也可调用CWnd : : MoveWindow
但必须指定窗口的位置。
// Get the size of the window .
Crect reWindow ;
GetWindowRect (reWindow );
//Make the window twice as wide and twice as tall .
SetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2,
reWindow . Height () * 2, SWP_NOMOVE |SWP_NOZORDER );

//------------------------------------------------------------------------------
15. 如何禁止和使能控件

控件也是窗口,所以可以调用CWnd : : EnableWindow使能和禁止控件。
//Disable button controls .
m_wndOK.EnableWindow (FALSE ) ;
m_wndApply.EnableWindow (FALSE ) ;

//------------------------------------------------------------------------------
16. 改变程序的窗口设置
可以在视图类的PRECREATEWINDOW中加入语句改变程序的窗口设置。程序在生成窗口之前调用这个函数。此函数接受CREATESTRUCT结构的引用,这个结构的字段存放生成窗口时MFC指定的窗口特性。如果赋值这个结构的一个或几个字段,则MFC用所赋值而不是缺省值。CREATESTRUCT结构的IpszClass字段存放WINDOWS窗口类名,这是WINDOWS系统维护的数据结构,存放窗口生成时一组一般特性。加入的AfxRegisterWndClass生成新的WINDOWS窗口类,然后将类名赋予结构的IpszClass字段,使视图窗口用存放在这个WINDWOS窗口类中的用户化特性生成。AfxRegisterWndClass是MFC提供的全局函数。
BOOL CminiDrawView::PreCreateWindow(CREATESTRUCT &cs)
{
M_Class=AfxRegisterWndClass
(CS_HREDRAW|CS_VREDRAW,
0,
(HBRUSH)::GetStockObject(WHITE_BRUSH);
0);
cs.lpszClass=m_ClassName;
returen cview::precreatewindow(cs);
}
第一个参数指定类样式。第二个参数指定WINDOWS在窗口内自动显示的鼠标光标,赋值为0则是不准备显示光标。第三个参数提供标准的白色刷笔。最后一个参数指定窗口图标,由于视图窗口不显示图标,他赋值为0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值