2024年4月3日发(作者:)
子窗口的设计
一、概述
生成子窗口的过程如下:
1. 编写窗口过程
2. 注册子窗口类
3. 产生子窗口
4. 显示子窗口
二、实验1:
实验内容:在主窗口的左上角生成一个100X100子窗口,在子窗口中显示一个内切椭圆。
实验过程:
1. 新建Win32项目(ChildWndApp)
2. 编写窗口过程
将自动产生的窗口过程复制一份粘贴在文件的最后,并修改名称(例如WndChildProc)。
修改代码在子窗口的客户区中心,显示一个内切椭圆;由于子窗口通常没有菜单,删除对
WM_COMMAND的处理代码;子窗口通常不发送WM_QUIT消息,删除PostQuitMessage。
完成的代码如下
LRESULT CALLBACK WndChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
}
PAINTSTRUCT ps;
HDC hdc; RECT rt;
switch (message)
{
case WM_PAINT:
}
return 0;
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
GetClientRect(hWnd,&rt);
Ellipse(hdc,,,,);
EndPaint(hWnd, &ps);
break;
return DefWindowProc(hWnd, message, wParam, lParam);
default:
3. 将子窗口的函数声明加到文件的声明部分(WndProc的声明语句后)
LRESULT CALLBACK WndChildProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM
lParam);
4. 在程序的开始部分增加对存储子窗口类名称数组的声明(放到szWindowClass语句之后)
TCHAR szChildWindowClass[]=TEXT("ColorSelectBtn");//名称根据自己的需要修改
5. 修改MyRegisterClass过程
在这个过程中增加子窗口类的注册代码。
首先将最后一句
return RegisterClassEx(&wcex); 修改为:
if(!RegisterClassEx(&wcex)) //为什么?
return false;
然后增加对子窗口类的注册代码如下:
dProc=WndChildProc;
nuName=NULL;
assName=szChildWindowClass;
if(!RegisterClassEx(&wcex))
return false;
return true;
6. 生成子窗口
首先在主窗口过程(WndProc)的声明部分增加子窗口句柄变量的声明(由于子窗口句柄要在多个窗口
消息中使用,故声明为静态变量)
static HWND hChildWnd;
在主窗口过程中增加对WM_CREATE消息处理,在这个消息中生成生成子窗口;
case WM_CREATE:
hChildWnd = CreateWindow(szChildWindowClass, TEXT("子窗口"), WS_CHILD,
0, 0, 100, 100, hWnd,(HMENU) 1,hInst, NULL);
ShowWindow(hChildWnd,SW_NORMAL);
UpdateWindow(hChildWnd);
break;
7. 注意CreateWindow函数的第3个参数,
WS_CHILD生成子窗口
WS_POPUP生成弹出式窗口
WS_OVERLAPPED生成重叠窗口(通常为一个应用程序的第一个窗口)
以上三个选项只能选择一个且必须选择一个
WS_CAPTION 生成的窗口带有标题栏
WS_BORDER 带有边框
第7个参数:父窗口句柄
第8个参数:对于弹出式窗口和重叠窗口,传入的是菜单句柄,如果传入NULL则使用窗口类中指定的
菜单,对于子窗口,传入的是控件ID,同一个窗口的子窗口的ID不能重复。
第10个参数:类型为LPVOID,向窗口过程的WM_CREATE消息传递的参数。
修改第三个参数,观察不同的效果。
三、实验2
实验内容:在主窗口的中心显示一个半径为30的填充椭圆,初始颜色为红色,在主窗口的顶部显示5
个子窗口,每个子窗口中显示一个颜色的椭圆,用鼠标单击子窗口时主窗口的颜色跟随改变,运行效
果见附件的程序
实验步骤:
1. 自定义消息
在的第一个#define语句后增加一个宏定义
#define WM_CHANGECOLOR WM_USER+1
WM_USER是用户能够使用的第一个自定义消息
2. 增加变量
将static HWND hChildWnd; 修改为


发布评论