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; 修改为