Win32应用中创建多窗口,创建同一个窗口类的多个窗口对象和不同窗口类的窗口对象。
1 // win32_多窗口.cpp : Defines the entry point for the application. 2 // 3 4 #include "stdafx.h" 5 #include "resource.h" 6 7 #define MAX_LOADSTRING 100 8 9 // Global Variables: 10 HINSTANCE hInst; // current instance 11 TCHAR szTitle[MAX_LOADSTRING]; // The title bar text 12 TCHAR szTitle2[MAX_LOADSTRING] = {"同一个窗口类的第二个窗口"}; 13 TCHAR szTitle3[MAX_LOADSTRING] = {"不同窗口类的窗口"}; 14 TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text 15 TCHAR szWindowClass2[MAX_LOADSTRING] = {"Submarine"}; // 第二个窗口类的类名 16 HWND hWnd, hWnd2, hWnd3; // 保存窗口句柄 17 18 // Foward declarations of functions included in this code module: 19 ATOM MyRegisterClass(HINSTANCE hInstance); 20 BOOL InitInstance(HINSTANCE, int); 21 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 22 LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM); 23 LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); 24 25 int APIENTRY WinMain(HINSTANCE hInstance, 26 HINSTANCE hPrevInstance, 27 LPSTR lpCmdLine, 28 int nCmdShow) 29 { 30 // TODO: Place code here. 31 MSG msg; 32 HACCEL hAccelTable; 33 34 // Initialize global strings 35 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 36 LoadString(hInstance, IDC_WIN32_, szWindowClass, MAX_LOADSTRING); 37 MyRegisterClass(hInstance); 38 39 // Perform application initialization: 40 if (!InitInstance (hInstance, nCmdShow)) 41 { 42 return FALSE; 43 } 44 45 hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WIN32_); 46 47 // Main message loop: 48 while (GetMessage(&msg, NULL, 0, 0)) 49 { 50 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 51 { 52 TranslateMessage(&msg); 53 DispatchMessage(&msg); 54 } 55 } 56 57 return msg.wParam; 58 } 59 60 61 62 // 63 // FUNCTION: MyRegisterClass() 64 // 65 // PURPOSE: Registers the window class. 66 // 67 // COMMENTS: 68 // 69 // This function and its usage is only necessary if you want this code 70 // to be compatible with Win32 systems prior to the 'RegisterClassEx' 71 // function that was added to Windows 95. It is important to call this function 72 // so that the application will get 'well formed' small icons associated 73 // with it. 74 // 75 ATOM MyRegisterClass(HINSTANCE hInstance) 76 { 77 WNDCLASSEX wcex, wcex2; 78 79 // 第一个窗口类的定义 80 wcex.cbSize = sizeof(WNDCLASSEX); 81 82 wcex.style = CS_HREDRAW | CS_VREDRAW; 83 wcex.lpfnWndProc = (WNDPROC)WndProc; 84 wcex.cbClsExtra = 0; 85 wcex.cbWndExtra = 0; 86 wcex.hInstance = hInstance; 87 wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_WIN32_); 88 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 89 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 90 wcex.lpszMenuName = (LPCSTR)IDC_WIN32_; 91 wcex.lpszClassName = szWindowClass; 92 wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); 93 94 // 第二个窗口类的定义 95 wcex2.cbSize = sizeof(WNDCLASSEX); 96 97 wcex2.style = CS_HREDRAW | CS_VREDRAW; 98 wcex2.lpfnWndProc = (WNDPROC)WndProc2; 99 wcex2.cbClsExtra = 0; 100 wcex2.cbWndExtra = 0; 101 wcex2.hInstance = hInstance; 102 wcex2.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_WIN32_); 103 wcex2.hCursor = LoadCursor(NULL, IDC_ARROW); 104 wcex2.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 105 wcex2.lpszMenuName = (LPCSTR)IDC_WIN32_; 106 wcex2.lpszClassName = szWindowClass2; 107 wcex2.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); 108 109 return (RegisterClassEx(&wcex) && RegisterClassEx(&wcex2)); 110 } 111 112 // 113 // FUNCTION: InitInstance(HANDLE, int) 114 // 115 // PURPOSE: Saves instance handle and creates main window 116 // 117 // COMMENTS: 118 // 119 // In this function, we save the instance handle in a global variable and 120 // create and display the main program window. 121 // 122 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 123 { 124 // HWND hWnd; 125 126 hInst = hInstance; // Store instance handle in our global variable 127 128 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 129 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 130 hWnd2 = CreateWindow(szWindowClass, szTitle2, WS_OVERLAPPEDWINDOW, 131 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 132 hWnd3 = CreateWindow(szWindowClass2, szTitle3, WS_OVERLAPPEDWINDOW, 133 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 134 135 if (!hWnd || !hWnd2 || !hWnd3) 136 { 137 return FALSE; 138 } 139 140 ShowWindow(hWnd, nCmdShow); 141 UpdateWindow(hWnd); 142 ShowWindow(hWnd2, nCmdShow); 143 UpdateWindow(hWnd2); 144 ShowWindow(hWnd3, nCmdShow); 145 UpdateWindow(hWnd3); 146 147 return TRUE; 148 } 149 150 // 151 // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) 152 // 153 // PURPOSE: Processes messages for the main window. 154 // 155 // WM_COMMAND - process the application menu 156 // WM_PAINT - Paint the main window 157 // WM_DESTROY - post a quit message and return 158 // 159 // 160 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 161 { 162 int wmId, wmEvent; 163 PAINTSTRUCT ps; 164 HDC hdc; 165 166 switch (message) 167 { 168 case WM_COMMAND: 169 wmId = LOWORD(wParam); 170 wmEvent = HIWORD(wParam); 171 // Parse the menu selections: 172 switch (wmId) 173 { 174 case IDM_ABOUT: 175 DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); 176 break; 177 case IDM_EXIT: 178 DestroyWindow(hWnd); 179 break; 180 default: 181 return DefWindowProc(hWnd, message, wParam, lParam); 182 } 183 break; 184 case WM_PAINT: 185 hdc = BeginPaint(hWnd, &ps); 186 // TODO: Add any drawing code here... 187 // RECT rt; 188 // GetClientRect(hWnd, &rt); 189 EndPaint(hWnd, &ps); 190 break; 191 case WM_DESTROY: 192 PostQuitMessage(0); 193 break; 194 default: 195 return DefWindowProc(hWnd, message, wParam, lParam); 196 } 197 return 0; 198 } 199 200 LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 201 { 202 int wmId, wmEvent; 203 PAINTSTRUCT ps; 204 HDC hdc; 205 206 switch (message) 207 { 208 case WM_COMMAND: 209 wmId = LOWORD(wParam); 210 wmEvent = HIWORD(wParam); 211 // Parse the menu selections: 212 switch (wmId) 213 { 214 case IDM_ABOUT: 215 DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); 216 break; 217 case IDM_EXIT: 218 DestroyWindow(hWnd); 219 break; 220 default: 221 return DefWindowProc(hWnd, message, wParam, lParam); 222 } 223 break; 224 case WM_PAINT: 225 hdc = BeginPaint(hWnd, &ps); 226 // TODO: Add any drawing code here... 227 // RECT rt; 228 // GetClientRect(hWnd, &rt); 229 EndPaint(hWnd, &ps); 230 break; 231 case WM_DESTROY: 232 MessageBox(hWnd, "不是同一个窗口类", "Note", MB_OK); 233 // PostQuitMessage(0); // 此处未调用该函数,应用的消息队列中也就未添加WM_QUIT消息, 234 // 在WinMain函数的消息循环中继续等待用户或系统消息, 235 // 消息循环没结束,整个主函数WinMan也就没结束。 236 break; 237 default: 238 return DefWindowProc(hWnd, message, wParam, lParam); 239 } 240 return 0; 241 } 242 243 // Mesage handler for about box. 244 LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 245 { 246 switch (message) 247 { 248 case WM_INITDIALOG: 249 return TRUE; 250 251 case WM_COMMAND: 252 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 253 { 254 EndDialog(hDlg, LOWORD(wParam)); 255 return TRUE; 256 } 257 break; 258 } 259 return FALSE; 260 }
。