第一个建立一个窗口的程序,也是windows建立窗口的核心代码,具体代码注释,已在下面代码中标注:
#include <tchar.h> #include <windows.h> LRESULT CALLBACK WinProc(HWND hWnd, UINT UMsg, WPARAM wParam, LPARAM lParam) //窗口回调函数 { switch (UMsg) { case WM_CLOSE: //关闭窗口触发 { ::DestroyWindow(hWnd); //发送WM_DESTROY给消息队列 } break; case WM_DESTROY: { ::PostQuitMessage(0); //发送出WM_QUIT消息, } break; } //处理默认消息 return ::DefWindowProc(hWnd, UMsg, wParam, lParam); } //__in代表参数是输入参数,__out代表参数是输出参数 int WINAPI WinMain( __in HINSTANCE hInstance, //当前应用程序实例 __in_opt HINSTANCE hPrevInstance, //先前应用程序实例,在Win32中始终为NULL __in LPSTR lpCmdLine, //命令行参数 __in int nShowCmd //显示方式 ) { TCHAR pszClassName[] = _T("First Windows"); //窗口类名 WNDCLASSEX wcex; //定义一个窗口类 wcex.cbSize = sizeof(WNDCLASSEX); //窗口类大小 wcex.style = CS_HREDRAW | CS_VREDRAW; //窗口风格 wcex.lpfnWndProc = WinProc; //窗口回调函数 wcex.cbClsExtra = 0; //窗口类额外参数,一般为0 wcex.cbWndExtra = 0; //窗口类额外参数,一般为0 wcex.hInstance = hInstance; //窗口类实例 wcex.hIcon = (HICON)::LoadIcon(NULL, IDI_APPLICATION); //窗口上的小图标,如果使用系统,LoadIcon第一个参数为NULL wcex.hCursor = (HCURSOR)::LoadCursor(NULL, IDC_ARROW); //窗口中的光标样式 wcex.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH); //窗口背景色 wcex.lpszMenuName = NULL; //窗口菜单,没有菜单,为NULL wcex.lpszClassName = pszClassName; //窗口类名 wcex.hIconSm = (HICON)::LoadIcon(NULL, IDI_APPLICATION); //这里的图标一般没有用,一般和hIcon相同 bool ret = ::RegisterClassEx(&wcex); //注册窗口类 if (ret == NULL) { ::MessageBox(NULL, _T("注册窗口失败"), _T("提示框"), MB_OK); return -1; } //创建窗口 HWND hWnd = ::CreateWindowEx(0, pszClassName, _T("First Windows!"), WS_VISIBLE| WS_OVERLAPPEDWINDOW ,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance, NULL); if (hWnd == NULL) { ::MessageBox(NULL, _T("创建窗口失败"), _T("提示框"), MB_OK); return -1; } //显示和更新窗口 ShowWindow(hWnd,SW_SHOW); UpdateWindow(hWnd); MSG msg; //消息循环 while (GetMessage(&msg, NULL, NULL,NULL)) //当接受WM_QUIT消息,消息队列退出 { ::TranslateMessage(&msg); //翻译消息 ::DispatchMessage(&msg); //路由消息给OS } return 0; }