#include <windows.h>
#include <stdio.h>
//声明窗口回调函数
LRESULT CALLBACK WinParentProc(
HWND hWnd, // 窗口句柄
UINT uMsg, // 消息ID
WPARAM wParam, // 第1个消息参数
LPARAM lParam // 第2个消息参数
);
LRESULT CALLBACK WinChildProc(
HWND hWnd, // 窗口句柄
UINT uMsg, // 消息ID
WPARAM wParam, // 第1个消息参数
LPARAM lParam // 第2个消息参数
);
HWND hParentWnd;
HWND hChildWnd;
HWND CreateParentWindows(HINSTANCE hInstance)
{
//1. 注册窗口
WNDCLASS wc; //定义并填充窗口类
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //CreateSolidBrush
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WinParentProc; //重点:指定窗口消息的处理函数
wc.lpszClassName = "Itjob2010";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
if(0 == RegisterClass(&wc)) return NULL; //注册窗口
//2. 创建窗口
HWND hWnd = CreateWindow(
wc.lpszClassName, //窗口类名称
"一个简单的Win32程序", //窗口标题
WS_OVERLAPPEDWINDOW, //窗口风格,定义为普通型
0, //窗口位置的x坐标
0, //窗口位置的y坐标
900, //窗口的宽度
700, //窗口的高度
NULL, //父窗口句柄
NULL, //菜单句柄
hInstance, //应用程序实例句柄
NULL); //窗口创建数据指针
if (hWnd == NULL) return NULL;
//3. 显示窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
//4. 更新窗口
UpdateWindow(hWnd);
return hWnd;
}
HWND CreateChildWindows(HINSTANCE hInstance)
{
//1. 注册窗口
WNDCLASS wc; //定义并填充窗口类
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //CreateSolidBrush
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WinChildProc; //重点:指定窗口消息的处理函数
wc.lpszClassName = "wuciqiu12";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
RegisterClass(&wc);
// if(0 == )
// {
// DWORD err = ::GetLastError();
// return NULL;
// //注册窗口
// }
//2. 创建窗口
HWND hWnd = CreateWindow(
wc.lpszClassName, //窗口类名称
"第二个窗口", //
WS_OVERLAPPEDWINDOW | WS_CHILD , //窗口风格,定义为普通型
0, //窗口位置的x坐标
0, //窗口位置的y坐标
600, //窗口的宽度
400, //窗口的高度
hParentWnd , //父窗口句柄
NULL, //菜单句柄
hInstance, //应用程序实例句柄
NULL); //窗口创建数据指针
if (hWnd == NULL) return NULL;
//3. 显示窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
//4. 更新窗口
UpdateWindow(hWnd);
return hWnd;
}
//程序入口
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例句柄
HINSTANCE hPrevInstance, // 前一实例句柄
LPSTR lpCmdLine, // 命令行参数
int nCmdShow // 窗口显示方式
)
{
hParentWnd = CreateParentWindows(hInstance);
hChildWnd = CreateChildWindows(hInstance);
//5. 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); //把虚键消息翻译成字符消息(WM_CHAR),
//再把WM_CHAR消息放到消息队列中去
DispatchMessage(&msg); //指示操作系统把这条消息发送到窗口
//过程WinProc进行处理
}
return msg.wParam;
}
//窗口回调函数,由操作系统调用,程序员
//不要调用,但程序员需要编写其实现代码
LRESULT CALLBACK WinParentProc(
HWND hWnd, // 窗口句柄
UINT uMsg, // 消息ID
WPARAM wParam, // 第1个消息参数
LPARAM lParam // 第2个消息参数
)
{
switch (uMsg)
{
case WM_RBUTTONDOWN://当右键点击父窗口时,就会把之前隐藏的子窗口显示出来 ::ShowWindow(hChildWnd,SW_SHOW);
{
// ::ShowWindow(hChildWnd,SW_SHOW);
hChildWnd = CreateChildWindows(NULL);//当关闭子窗口时,没有隐藏它case WM_CLOSE:,而是真的关闭了,点击它时就会不断生新窗口
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0; //return 1
}
LRESULT CALLBACK WinChildProc(
HWND hWnd, // 窗口句柄
UINT uMsg, // 消息ID
WPARAM wParam, // 第1个消息参数
LPARAM lParam // 第2个消息参数
)
{
switch (uMsg)
{
// case WM_CLOSE://这样做只是点击子窗口的关闭时,只是隐藏例如,而没有真的关闭
// {
// ::ShowWindow(hWnd,SW_HIDE);
// }
// break;
// case WM_DESTROY:
// PostQuitMessage(0);
// break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0; //return 1
}
创建父窗口和子窗口,子窗口在父窗口里
最新推荐文章于 2021-10-28 20:15:18 发布