当前位置:C++技术网 > 资讯 > MFC窗口消息的深入学习

MFC窗口消息的深入学习

更新时间:2015-12-22 15:08:10浏览次数:1+次

在MFC中封装了很多的消息,WM_PAINT等,我们也可以自定义自己的消息:
#define WM_CLOSE_ME WM_USER+1
请注意WM_USER宏,他表示用户可自定义的最小的消息代码,上面这种形式定义的好处就是可以保证系统中消息的唯一性。
窗口可以分为如下四类:
1,可重叠(Overlapped)窗口:
这种窗口是有标题栏,边框,客户区域的顶层窗口。他可以充当应用程序的主窗口,这类窗口还可以有窗口菜单,最大化,最小化按钮以及滚动条。
在调用CreateWindowEx创建窗口的时候,指定窗口风格类型参数为WS_OVERLAPPED或WS_OVERLAPPEDWINDOW,就能创建一个可重叠窗口。
WS_OVERLAPPED风格的窗口有标题栏和边框;WS_OVERLAPPEDWINDOW风格的创建偶有标题栏,可变大小的边框,窗口菜单,最大化,最小化按钮。
弹出(Pop-up)按钮:
这类窗口具有可重叠窗口的全部特征,但其标题栏是可选的。
在用CreateWindowEx创建窗口的时候,指定风格参数为WS_POPUP就会创建一个有边框和窗口的弹出窗口。为了拥有标题栏,需要同时指定WS_CAPTION;为了使菜单可见,须同时制定WS_POPUPWINDOW风格。
子窗口:
子窗口具有WS_CHLD风格,并限制在父窗口的客户区区域绘制。
在用CreateWindowEx创建窗口的时候,指定风格参数为WS_CHILD就行了。


定位窗口
CWnd提供了一组成员函数负责管理窗口的位置和大小。最主要的成员函数是MoveWindow和SetWindowPos.
先考察下MoveWindow,它能改变窗口的位置和大小。
void MoveWindow(int x,int y,int nWidth, int nHeight,BOOL bRepaint=TRUE);
bRepaint=TRUE,使窗体移动后会向窗体发送一个WM_PAINT消息,从而重绘窗体内容。对于,顶层窗口而言,新设定的窗口位置是相对于屏幕的,而对于子窗体而言,该位置则是相对于父窗体的客户区的左上角。

代码演示如何将一个编辑框控件移动到静态文本框控件。

void CText1Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	////获得占位的静态文本
	CWnd* pHolder=this->GetDlgItem(IDC_STATIC);
	ASSERT(pHolder);
	CRect rect;
	////获得相对于屏幕的坐标
	pHolder->GetWindowRect(&rect);
	////转换为相对于父窗口客户区的坐标
	this->ScreenToClient(&rect);
	CWnd* pEdit=this->GetDlgItem(IDC_EDIT1);
	ASSERT(pEdit);
	pEdit->MoveWindow(&rect);
	//pEdit->SetWindowPos(NULL,rect.TopLeft().x,rect.TopLeft().y,rect.Size().cx,rect.Size().cy,SWP_NOZORDER|SWP_SHOWWINDOW);
}

代码实现:

删除SetWindowPos注释,尝试用SetWindowPos函数实现。看看SetWindowPos:

SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cs,int cx,int cy,UINT nFlags)