创建父窗口和子窗口,子窗口在父窗口里

来源:互联网 发布:淘宝达人大v认证包过 编辑:程序博客网 时间:2024/06/05 16:32
#include <windows.h>#include <stdio.h>//声明窗口回调函数LRESULT CALLBACK WinParentProc(HWND hWnd,// 窗口句柄UINT uMsg,// 消息IDWPARAM wParam,// 第1个消息参数LPARAM lParam// 第2个消息参数);LRESULT CALLBACK WinChildProc(HWND hWnd,// 窗口句柄UINT uMsg,// 消息IDWPARAM 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);//CreateSolidBrushwc.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);//CreateSolidBrushwc.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,// 消息IDWPARAM 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,// 消息IDWPARAM 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}

0 0