2010-05-22 48 views
8

我看到大量的教程和文章向我展示瞭如何製作一個簡單的Windows程序,這很棒,但沒有人告訴我如何製作多個窗口。如何使用Win32 API製作多個窗口

創建並繪製一個分層的窗口,我可以使用GDI畫什麼我想它的blit東西,現在我已經工作的代碼,拖動它,甚至使之透明,等等

但我想我可以畫的第二個矩形區域,拖動等等。換句話說,第二個窗口。可能希望它是一個兒童窗口。問題是,我該如何做到?另外,如果有人知道Windows API中窗口管理的文章或教程等任何良好資源(最好在線),請分享。

回答

6

你可以打CreateWindow的()不止一次如果你想。 WinMain中的消息循環會將事件傳遞給WinMain創建的所有窗口。如果需要,甚至可以創建兩個重疊窗口,並將第二個窗口的父窗口設置爲第一個窗口的句柄。

+0

我終於明白了。它工作時,我修改我創建窗口的例程,允許它使用不同的ClassName字符串註冊窗口類。爲什麼我需要爲第二個窗口創建一個單獨的窗口類,如果功能應該保持不變? – 2010-05-22 02:29:48

+0

@Steven Lu:不確定。我運行測試只檢查註冊一個窗口類,並能夠CreateWindow兩次。當然,這意味着他們共享一個WndProc。 WndProc中沒有靜態數據,對嗎? – JustJeff 2010-05-22 03:03:29

+0

我仍然使用相同的窗口過程,但它必須是一個不同的窗口類,即我不得不調用具有不同'WNDCLASSEX :: lpszClassName'的'RegisterClassEx'。這是正常的嗎? – 2010-05-22 18:50:30

2

您可以使用CreateWindow/CreateWindowEx創建任意數量的窗口,並根據需要(所有者/子級)使用它們之間的關係。

你可以做一個窗口「擁有」其他有:

SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR) hwndParent); 

要將窗口轉變爲兒童,使用SetParent

請注意SetWindowLongPtrGWLP_HWNDPARENT調用不會像SetParent(MSDN在這個我認爲是錯誤的)。 GWLP_HWNDPARENT不會將窗口轉換爲「子」,而是轉換爲「擁有」。

+0

通過將所有者窗口句柄傳遞給'CreateWindow [Ex]'調用('hWndParent'參數)來創建所有者/擁有關係。如果'WS_CHILD'窗口樣式不存在,'hWndParent'將是所有者。如果是,'hWndParent'將指定父窗口,並建立父/子關係。 – IInspectable 2015-02-06 12:53:15

7

要創建多個窗口,請重複在創建第一個窗口以創建第二個窗口時所做的所有步驟。一個好辦法是從第一個窗口複製並粘貼所有代碼。然後進行搜索並替換,在其中將第一個窗口的所有名稱替換爲第二個窗口的唯一名稱。下面我就是這樣做的代碼。

最重要的是要注意的是,第二個窗口的窗口類應該在代碼 行「windowclassforwindow2.lpszClassName =」window class2「中具有唯一的名稱。如果它沒有唯一的名稱,則窗口註冊將失敗。

#include <windows.h> 

LRESULT CALLBACK windowprocessforwindow1(HWND handleforwindow1,UINT message,WPARAM wParam,LPARAM lParam); 
LRESULT CALLBACK windowprocessforwindow2(HWND handleforwindow2,UINT message,WPARAM wParam,LPARAM lParam); 

bool window1closed=false; 
bool window2closed=false; 

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd) 
{ 
    bool endprogram=false; 

    //create window 1 

    WNDCLASSEX windowclassforwindow1; 
    ZeroMemory(&windowclassforwindow1,sizeof(WNDCLASSEX)); 
    windowclassforwindow1.cbClsExtra=NULL; 
    windowclassforwindow1.cbSize=sizeof(WNDCLASSEX); 
    windowclassforwindow1.cbWndExtra=NULL; 
    windowclassforwindow1.hbrBackground=(HBRUSH)COLOR_WINDOW; 
    windowclassforwindow1.hCursor=LoadCursor(NULL,IDC_ARROW); 
    windowclassforwindow1.hIcon=NULL; 
    windowclassforwindow1.hIconSm=NULL; 
    windowclassforwindow1.hInstance=hInst; 
    windowclassforwindow1.lpfnWndProc=(WNDPROC)windowprocessforwindow1; 
    windowclassforwindow1.lpszClassName=L"windowclass 1"; 
    windowclassforwindow1.lpszMenuName=NULL; 
    windowclassforwindow1.style=CS_HREDRAW|CS_VREDRAW; 

    if(!RegisterClassEx(&windowclassforwindow1)) 
    { 
     int nResult=GetLastError(); 
     MessageBox(NULL, 
      L"Window class creation failed", 
      L"Window Class Failed", 
      MB_ICONERROR); 
    } 

    HWND handleforwindow1=CreateWindowEx(NULL, 
     windowclassforwindow1.lpszClassName, 
      L"Parent Window", 
      WS_OVERLAPPEDWINDOW, 
      200, 
      150, 
      640, 
      480, 
      NULL, 
      NULL, 
      hInst, 
      NULL    /* No Window Creation data */ 
); 

    if(!handleforwindow1) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL, 
      L"Window creation failed", 
      L"Window Creation Failed", 
      MB_ICONERROR); 
    } 

    ShowWindow(handleforwindow1,nShowCmd); 

    // create window 2 

    WNDCLASSEX windowclassforwindow2; 
    ZeroMemory(&windowclassforwindow2,sizeof(WNDCLASSEX)); 
    windowclassforwindow2.cbClsExtra=NULL; 
    windowclassforwindow2.cbSize=sizeof(WNDCLASSEX); 
    windowclassforwindow2.cbWndExtra=NULL; 
    windowclassforwindow2.hbrBackground=(HBRUSH)COLOR_WINDOW; 
    windowclassforwindow2.hCursor=LoadCursor(NULL,IDC_ARROW); 
    windowclassforwindow2.hIcon=NULL; 
    windowclassforwindow2.hIconSm=NULL; 
    windowclassforwindow2.hInstance=hInst; 
    windowclassforwindow2.lpfnWndProc=(WNDPROC)windowprocessforwindow2; 
    windowclassforwindow2.lpszClassName=L"window class2"; 
    windowclassforwindow2.lpszMenuName=NULL; 
    windowclassforwindow2.style=CS_HREDRAW|CS_VREDRAW; 

    if(!RegisterClassEx(&windowclassforwindow2)) 
    { 
     int nResult=GetLastError(); 
     MessageBox(NULL, 
      L"Window class creation failed for window 2", 
      L"Window Class Failed", 
      MB_ICONERROR); 
    } 

    HWND handleforwindow2=CreateWindowEx(NULL, 
     windowclassforwindow2.lpszClassName, 
      L"Child Window", 
      WS_OVERLAPPEDWINDOW, 
      200, 
      150, 
      640, 
      480, 
      NULL, 
      NULL, 
      hInst, 
      NULL); 

    if(!handleforwindow2) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL, 
      L"Window creation failed", 
      L"Window Creation Failed", 
      MB_ICONERROR); 
    } 

    ShowWindow(handleforwindow2,nShowCmd); 
    SetParent(handleforwindow2,handleforwindow1); 
    MSG msg; 
    ZeroMemory(&msg,sizeof(MSG)); 
    while (endprogram==false) { 
     if (GetMessage(&msg,NULL,0,0)); 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
     if (window1closed==true && window2closed==true) { 
      endprogram=true; 
     } 
    } 
    MessageBox(NULL, 
    L"Both Windows are closed. Program will now close.", 
    L"", 
    MB_ICONINFORMATION); 
    return 0; 
} 

LRESULT CALLBACK windowprocessforwindow1(HWND handleforwindow,UINT msg,WPARAM wParam,LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_DESTROY: { 
      MessageBox(NULL, 
      L"Window 1 closed", 
      L"Message", 
      MB_ICONINFORMATION); 

      window1closed=true; 
      return 0; 
     } 
     break; 
    } 

    return DefWindowProc(handleforwindow,msg,wParam,lParam); 
} 

LRESULT CALLBACK windowprocessforwindow2(HWND handleforwindow,UINT msg,WPARAM wParam,LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_DESTROY: { 
      MessageBox(NULL, 
      L"Window 2 closed", 
      L"Message", 
      MB_ICONINFORMATION); 

      window2closed=true; 
      return 0; 
     } 
     break; 
    } 

    return DefWindowProc(handleforwindow,msg,wParam,lParam); 
} 

更復雜的例子,使用函數來創建窗口。

創建不具有功能,每個窗口可以使代碼雜亂,特別是如果它是在if語句。下面的代碼使用一個單獨的f創建每個窗口。前三個窗口有一個創建窗口按鈕來創建下一個窗口。

#include <Windows.h> 

LRESULT CALLBACK windowprocessforwindow1(HWND handleforwindow1,UINT message,WPARAM wParam,LPARAM lParam); 
LRESULT CALLBACK windowprocessforwindow2(HWND handleforwindow1,UINT message,WPARAM wParam,LPARAM lParam); 
LRESULT CALLBACK windowprocessforwindow3(HWND handleforwindow1,UINT message,WPARAM wParam,LPARAM lParam); 
LRESULT CALLBACK windowprocessforwindow4(HWND handleforwindow1,UINT message,WPARAM wParam,LPARAM lParam); 

#define createwindowbuttoninwindow1 101 
#define createwindowbuttoninwindow2 201 
#define createwindowbuttoninwindow3 301 

bool window1open,window2open,window3open,window4open=false; 
bool windowclass1registeredbefore,windowclass2registeredbefore, 
    windowclass3registeredbefore,windowclass4registeredbefore=false; 

enum windowtoopenenumt {none,window2,window3,window4}; 

windowtoopenenumt windowtoopenenum=none; 

void createwindow2(WNDCLASSEX& wc,HWND& hwnd,HINSTANCE hInst,int nShowCmd); 
void createwindow3(WNDCLASSEX& wc,HWND& hwnd,HINSTANCE hInst,int nShowCmd); 
void createwindow4(WNDCLASSEX& wc,HWND& hwnd,HINSTANCE hInst,int nShowCmd); 

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd) 
{ 
    bool endprogram=false; 
    WNDCLASSEX windowclassforwindow2; 
    WNDCLASSEX windowclassforwindow3; 
    WNDCLASSEX windowclassforwindow4; 
    HWND handleforwindow2; 
    HWND handleforwindow3; 
    HWND handleforwindow4; 

    //create window 1 
    MSG msg; 
    WNDCLASSEX windowclassforwindow1; 
    ZeroMemory(&windowclassforwindow1,sizeof(WNDCLASSEX)); 
    windowclassforwindow1.cbClsExtra=NULL; 
    windowclassforwindow1.cbSize=sizeof(WNDCLASSEX); 
    windowclassforwindow1.cbWndExtra=NULL; 
    windowclassforwindow1.hbrBackground=(HBRUSH)COLOR_WINDOW; 
    windowclassforwindow1.hCursor=LoadCursor(NULL,IDC_ARROW); 
    windowclassforwindow1.hIcon=NULL; 
    windowclassforwindow1.hIconSm=NULL; 
    windowclassforwindow1.hInstance=hInst; 
    windowclassforwindow1.lpfnWndProc=(WNDPROC)windowprocessforwindow1; 
    windowclassforwindow1.lpszClassName=L"window class 1"; 
    windowclassforwindow1.lpszMenuName=NULL; 
    windowclassforwindow1.style=CS_HREDRAW|CS_VREDRAW; 

    if(!RegisterClassEx(&windowclassforwindow1)) 
    { 
     int nResult=GetLastError(); 
     MessageBox(NULL, 
      L"Window class creation failed", 
      L"Window Class Failed", 
      MB_ICONERROR); 
    } 

    HWND handleforwindow1=CreateWindowEx(NULL, 
      windowclassforwindow1.lpszClassName, 
      L"Window 1", 
      WS_OVERLAPPEDWINDOW, 
      200, 
      150, 
      640, 
      480, 
      NULL, 
      NULL, 
      hInst, 
      NULL    /* No Window Creation data */ 
); 

    if(!handleforwindow1) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL, 
      L"Window creation failed", 
      L"Window Creation Failed", 
      MB_ICONERROR); 
    } 

    ShowWindow(handleforwindow1,nShowCmd); 
    bool endloop=false; 
    while (endloop==false) { 
     if (GetMessage(&msg,NULL,0,0)); 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 

     if (windowtoopenenum !=none) { 
      switch (windowtoopenenum) { 
       case window2: 
        if (window2open==false) {              
         createwindow2(windowclassforwindow2,handleforwindow2,hInst,nShowCmd); 
        } 
        break; 
       case window3: 
        if (window3open==false) {   
         createwindow3(windowclassforwindow3,handleforwindow3,hInst,nShowCmd); 
        } 
        break; 
       case window4:    
        if (window4open==false) {    
         createwindow4(windowclassforwindow4,handleforwindow4,hInst,nShowCmd); 
        } 
        break; 
      } 
     windowtoopenenum=none; 
    } 
    if (window1open==false && window2open==false && window3open==false && window4open==false) 
     endloop=true; 

    } 
    MessageBox(NULL, 
      L"All Windows are closed. Program will now close.", 
      L"Message", 
      MB_ICONINFORMATION); 

} 

void createwindow2(WNDCLASSEX& wc,HWND& hwnd,HINSTANCE hInst,int nShowCmd) { 
    if (windowclass2registeredbefore==false) { 
    ZeroMemory(&wc,sizeof(WNDCLASSEX)); 
    wc.cbClsExtra=NULL; 
    wc.cbSize=sizeof(WNDCLASSEX); 
    wc.cbWndExtra=NULL; 
    wc.hbrBackground=(HBRUSH)COLOR_WINDOW; 
    wc.hCursor=LoadCursor(NULL,IDC_ARROW); 
    wc.hIcon=NULL; 
    wc.hIconSm=NULL; 
    wc.hInstance=hInst; 
    wc.lpfnWndProc=(WNDPROC)windowprocessforwindow2; 
    wc.lpszClassName=L"wc2"; 
    wc.lpszMenuName=NULL; 
    wc.style=CS_HREDRAW|CS_VREDRAW; 

    if(!RegisterClassEx(&wc)) 
    { 
     int nResult=GetLastError(); 
     MessageBox(NULL, 
      L"Window class creation failed", 
      L"Window Class Failed", 
      MB_ICONERROR); 
    } 
    else 
     windowclass2registeredbefore=true; 
    } 
    hwnd=CreateWindowEx(NULL, 
      wc.lpszClassName, 
      L"Window 2", 
      WS_OVERLAPPEDWINDOW, 
      200, 
      170, 
      640, 
      480, 
      NULL, 
      NULL, 
      hInst, 
      NULL    /* No Window Creation data */ 
); 

    if(!hwnd) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL, 
      L"Window creation failed", 
      L"Window Creation Failed", 
      MB_ICONERROR); 
    } 

    ShowWindow(hwnd,nShowCmd); 
} 

void createwindow3(WNDCLASSEX& wc,HWND& hwnd,HINSTANCE hInst,int nShowCmd) { 
    if (windowclass3registeredbefore==false) { 
    ZeroMemory(&wc,sizeof(WNDCLASSEX)); 
    wc.cbClsExtra=NULL; 
    wc.cbSize=sizeof(WNDCLASSEX); 
    wc.cbWndExtra=NULL; 
    wc.hbrBackground=(HBRUSH)COLOR_WINDOW; 
    wc.hCursor=LoadCursor(NULL,IDC_ARROW); 
    wc.hIcon=NULL; 
    wc.hIconSm=NULL; 
    wc.hInstance=hInst; 
    wc.lpfnWndProc=(WNDPROC)windowprocessforwindow3; 
    wc.lpszClassName=L"window class 3"; 
    wc.lpszMenuName=NULL; 
    wc.style=CS_HREDRAW|CS_VREDRAW; 

    if(!RegisterClassEx(&wc)) 
    { 
     int nResult=GetLastError(); 
     MessageBox(NULL, 
      L"Window class creation failed", 
      L"Window Class Failed", 
      MB_ICONERROR); 
    } 
    else 
     windowclass3registeredbefore=true; 
    } 
    hwnd=CreateWindowEx(NULL, 
      wc.lpszClassName, 
      L"Window 3", 
      WS_OVERLAPPEDWINDOW, 
      200, 
      190, 
      640, 
      480, 
      NULL, 
      NULL, 
      hInst, 
      NULL    /* No Window Creation data */ 
); 

    if(!hwnd) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL, 
      L"Window creation failed", 
      L"Window Creation Failed", 
      MB_ICONERROR); 
    } 

    ShowWindow(hwnd,nShowCmd); 
} 

void createwindow4(WNDCLASSEX& wc,HWND& hwnd,HINSTANCE hInst,int nShowCmd) { 
    if (windowclass4registeredbefore==false) { 
     ZeroMemory(&wc,sizeof(WNDCLASSEX)); 
    wc.cbClsExtra=NULL; 
    wc.cbSize=sizeof(WNDCLASSEX); 
    wc.cbWndExtra=NULL; 
    wc.hbrBackground=(HBRUSH)COLOR_WINDOW; 
    wc.hCursor=LoadCursor(NULL,IDC_ARROW); 
    wc.hIcon=NULL; 
    wc.hIconSm=NULL; 
    wc.hInstance=hInst; 
    wc.lpfnWndProc=(WNDPROC)windowprocessforwindow4; 
    wc.lpszClassName=L"window class 4"; 
    wc.lpszMenuName=NULL; 
    wc.style=CS_HREDRAW|CS_VREDRAW; 

    if(!RegisterClassEx(&wc)) 
    { 
     int nResult=GetLastError(); 
     MessageBox(NULL, 
      L"Window class creation failed", 
      L"Window Class Failed", 
      MB_ICONERROR); 
    } 
    else 
     windowclass4registeredbefore=true; 
    } 
    hwnd=CreateWindowEx(NULL, 
      wc.lpszClassName, 
      L"Window 4", 
      WS_OVERLAPPEDWINDOW, 
      200, 
      210, 
      640, 
      480, 
      NULL, 
      NULL, 
      hInst, 
      NULL    /* No Window Creation data */ 
); 

    if(!hwnd) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL, 
      L"Window creation failed", 
      L"Window Creation Failed", 
      MB_ICONERROR); 
    } 

    ShowWindow(hwnd,nShowCmd); 
} 

// windows process functions 

LRESULT CALLBACK windowprocessforwindow1(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { 
    switch(message) { 
     case WM_CREATE: 
       window1open=true; 
       CreateWindowEx(NULL, 
       L"BUTTON", 
       L"Open Window 2", 
       WS_TABSTOP|WS_VISIBLE| 
       WS_CHILD|BS_DEFPUSHBUTTON, 
       50, 
       220, 
       150, 
       24, 
       hwnd, 
       (HMENU)createwindowbuttoninwindow1, 
       GetModuleHandle(NULL), 
       NULL); 
      break; 
      case WM_DESTROY: 
       window1open=false; 
       break; 
     case WM_COMMAND: 
      switch LOWORD(wParam) { 
       case createwindowbuttoninwindow1: 
        windowtoopenenum=window2; 
        break; 
      } 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 

} 

LRESULT CALLBACK windowprocessforwindow2(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { 
    switch(message) { 
     case WM_CREATE: 
       window2open=true; 
       CreateWindowEx(NULL, 
       L"BUTTON", 
       L"Open Window 3", 
       WS_TABSTOP|WS_VISIBLE| 
       WS_CHILD|BS_DEFPUSHBUTTON, 
       50, 
       220, 
       150, 
       24, 
       hwnd, 
       (HMENU)createwindowbuttoninwindow2, 
       GetModuleHandle(NULL), 
       NULL); 
      break; 
      case WM_DESTROY: 
       window2open=false; 
       break; 
     case WM_COMMAND: 
      switch LOWORD(wParam) { 
       case createwindowbuttoninwindow2: 
        windowtoopenenum=window3; 
        break; 
      } 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

LRESULT CALLBACK windowprocessforwindow3(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { 
    switch(message) { 
     case WM_CREATE: 
       window3open=true; 
       CreateWindowEx(NULL, 
       L"BUTTON", 
       L"Open Window 4", 
       WS_TABSTOP|WS_VISIBLE| 
       WS_CHILD|BS_DEFPUSHBUTTON, 
       50, 
       220, 
       150, 
       24, 
       hwnd, 
       (HMENU)createwindowbuttoninwindow3, 
       GetModuleHandle(NULL), 
       NULL); 
       break; 
       case WM_DESTROY: 
       window3open=false; 
       break; 
     case WM_COMMAND: 
      switch LOWORD(wParam) { 
       case createwindowbuttoninwindow3: 
        windowtoopenenum=window4; 
        break; 
      } 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

LRESULT CALLBACK windowprocessforwindow4(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { 
    switch(message) { 
     case WM_DESTROY: 
      window4open=false; 
      break; 
    } 
    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

如果您關閉並重新打開窗口?

如果您單擊關閉按鈕並重新打開同一窗口,請注意以下事項。當關閉按鈕關閉後窗口關閉時,它將被銷燬。但是銷燬一個窗口不會破壞windows類。它只會從createwindow函數中銷燬窗口。這使得上述程序中的if語句有必要只在第一次顯示窗口時才創建Windows類。

一些旁註

你可以只用一個窗口類來創建多個窗口。但問題是你有一個窗口進程函數來處理多個窗口。在這個簡單的例子中,這可以正常工作。但是,窗口越是不同種類,就越需要爲每個窗口創建一個單獨的窗口類。

此外,多個createwindow函數可能已合併爲一個函數。請注意,它們之間的唯一區別是wc.lpszClassName代碼行。但是Windows可能會彼此不同,因此將這些功能合併爲一個並不是必需的 - 它更偏向於沒有代碼重複的事情。

進一步閱讀

在網站域名functionx的鏈接有關於Windows設計的概念更多的細節。鏈接是here

functionx.com的主頁有很好的編程學習資源。 特別重要的是這個頁面,它具有編程參考材料,例如更改Windows類,創建列表框和其他窗口控件。這對於win32編程學習來說也是一個很好的資源。 functionx.com Win32編程

functionx.com win32 programming

1

我知道這已經回答了,但我只是寫一個通過打開的窗戶任意數量的for循環的程序。

這是我的版本。基本上,它重新使用相同的類生成器來構建多個窗口。你可以創建儘可能多的你想要的。只要確保相應地調整你的HWND []和WNDCLASSEX wc []數組。

注1:這段代碼使用全局ApplicationInstance,它是從WinMain函數派生的。在您的WinMain中,將收到的hInstance分配給ApplicationInstance,在此示例中假定爲全局可用。這是您的主要應用程序窗口實例。注意2:當然,你必須已經預先寫好了WinProc例程,並將其包含在另一個頭文件的某個地方,或者剛好在上面(本例中未顯示)。在此代碼中,它被引用爲WinProc ,當它傳遞給PopulateClass(WNDPROC進程)

注3:SpawnWindow支持「居中」和「最大化」標誌。他們所做的是不言自明的。

此外,窗口類的名稱是自動生成的,所以你不必擔心命名它,只是給它分配一個好的基本名稱。

int WindowCounter = 0; 
WNDCLASSEX wc[1000]; 
HWND hwnd[1000]; 
char class_name[256]; // for auto class name generation 

void PopulateClass(WNDPROC process) { 
    ZeroMemory(&wc[WindowCounter], sizeof(WNDCLASSEX)); 
    wc[WindowCounter].cbSize = sizeof(WNDCLASSEX); 
    wc[WindowCounter].style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC; 
    wc[WindowCounter].lpfnWndProc = process; 
    wc[WindowCounter].cbClsExtra = 0; 
    wc[WindowCounter].cbWndExtra = 0; 
    wc[WindowCounter].hInstance = ApplicationInstance; 
    wc[WindowCounter].hIcon = LoadIcon(nullptr, IDI_APPLICATION); 
    wc[WindowCounter].hCursor = LoadCursor(nullptr, IDC_ARROW); 
    wc[WindowCounter].hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 
    wc[WindowCounter].lpszMenuName = nullptr; 
    sprintf(class_name, "WindowClass%d", WindowCounter); 
    wc[WindowCounter].lpszClassName = class_name; 
    wc[WindowCounter].hIconSm = nullptr; 
} 

現在,讓我們通過提供一個SpawnWindow函數把它放在一起!()從你的WinMain

void CreateWindows() { 
    HWND PrimaryWindow1 = SpawnWindow(500, 500, 250, 250); 
    HWND PrimaryWindow2 = SpawnWindow(500, 500, 250, 250, true); 
    HWND PrimaryWindow3 = SpawnWindow(500, 500, 250, 250, true, true); 
    HWND PrimaryWindow4 = SpawnWindow(100, 100, 150, 150); 
    HWND PrimaryWindow5 = SpawnWindow(450, 500, 350, 150); 
} 

呼叫CreateWindows,在進入主循環之前:

HWND SpawnWindow(int x, 
       int y, 
       int width, 
       int height, 
       bool centered = false, 
       bool maximized = false) { 
    PopulateClass(WinProc); 
    RegisterClassEx(&wc[ WindowCounter ]); 
    int config_style = WS_OVERLAPPEDWINDOW; 
    if (maximized) { width = GetSystemMetrics(SM_CXFULLSCREEN); height =  GetSystemMetrics(SM_CYFULLSCREEN); config_style = WS_OVERLAPPEDWINDOW |  WS_MAXIMIZE; } 
    if (centered) { x = (GetSystemMetrics(SM_CXFULLSCREEN)/2) - (width/ 2); y = (GetSystemMetrics(SM_CYFULLSCREEN)/2) - (height/2); } 
    hwnd[WindowCounter] = CreateWindowEx(NULL, 
     wc[WindowCounter].lpszClassName, 
     config.namever(), 
     WS_OVERLAPPEDWINDOW, 
     x, 
     y, 
     width, 
     height, 
     nullptr, 
     nullptr, 
     ApplicationInstance, 
     nullptr); 
    HWND returnID = hwnd[WindowCounter]; 
    ShowWindow(hwnd[WindowCounter++], SW_SHOW); 
    return returnID; 
} 

最後,只要你想,只是一個單一的每一行代碼創建多個窗口。

希望這可以幫助那裏的人。

相關問題