• 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/               
      *************************************************************************/

  • 相关阅读:
    今日小结
    Delphi 框架Frames的使用
    Delphi窗体显示后弹出一个对话框的方法
    Structs2学习笔记1
    使用 LaravelExcel 进行 CSV/EXCEL 文件读写
    Mysql函数FIND_IN_SET()的使用方法
    Laravel数据库操作的三种方式
    Laravel5.5 支付宝手机网站支付的教程
    Python之路3【知识点】白话Python编码和文件操作
    艾伟_转载:利用jQuery实现的Ajax 验证用户名是否存在 狼人:
  • 原文地址:https://www.cnblogs.com/submarinex/p/2843325.html
Copyright © 2020-2023  润新知