至今为止,我们的程序都是建立在一个窗口类,一个窗口回调函数的基础上的。但是我们的程序往往不止一个窗口,我们在程序中有着多个窗口。多个按钮等(按钮也是窗口,之后解释)。那么,如果要生成多个窗口,我们可能就需要不止一个窗口回调函数,下面我们首先来介绍一下子窗口的概念,之后,再来了解windows系统为我们提供的一些控件窗口的使用。
子窗口
我们在程序中,往往需要多个窗口。这些窗口把客户区划分成多个逻辑区域。每个子窗口都有自己的窗口句柄。窗口过程和客户区。每个窗口过程接受只适用于它的子窗口鼠标消息。使用子窗口能够有助于我们程序的结构化和模块化。不同的窗口可以使用不同的窗口类。下面我们首先演示一下,如何手动的去创建一个子窗口。
假设我们建立四个子窗口,每个子窗口都响应鼠标左键单击消息,当单击下左键,程序将在子窗口绘制一个黑色的实心圆。
我们首先声明子窗口处理函数,如下所示:
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);
之后,如果我们想要生成一个窗口,根据第一篇文章可知,我们应该首先注册一个窗口类,然后才能去创建它,如下所示:
if( !RegisterClassEx(&wcex) )
{
MessageBox( NULL, TEXT( "ERROR"), TEXT("ERROR" ), MB_ICONERROR );
}
wcex.lpfnWndProc = ChildProc;
wcex.hIcon = NULL;
wcex.lpszClassName = TEXT( "ChildWindow");
wcex.cbWndExtra = sizeof(long );
if( !RegisterClassEx(&wcex) )
{
MessageBox( NULL, TEXT( "ERROR"), TEXT("ERROR" ), MB_ICONERROR );
}
第一次注册的窗口类是我们的父窗口,第二次注册的窗口类是我们子窗口。其中父窗口的窗口回调函数如下所示:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND HChildWnd[2][2];
int x, y;
int cxSize, cySize, cxBlock, cyBlock;
switch( message )
{
case WM_CREATE: