Win32应用中创建多窗口

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 }

  。


/**************************************************************************
                  原文来自博客园——Submarinex的博客: www.cnblogs.com/submarinex/               
  *************************************************************************/

原文地址:https://www.cnblogs.com/submarinex/p/2843325.html