我看到大量的教程和文章向我展示瞭如何製作一個簡單的Windows程序,這很棒,但沒有人告訴我如何製作多個窗口。如何使用Win32 API製作多個窗口
創建並繪製一個分層的窗口,我可以使用GDI畫什麼我想它的blit東西,現在我已經工作的代碼,拖動它,甚至使之透明,等等
但我想我可以畫的第二個矩形區域,拖動等等。換句話說,第二個窗口。可能希望它是一個兒童窗口。問題是,我該如何做到?另外,如果有人知道Windows API中窗口管理的文章或教程等任何良好資源(最好在線),請分享。
我看到大量的教程和文章向我展示瞭如何製作一個簡單的Windows程序,這很棒,但沒有人告訴我如何製作多個窗口。如何使用Win32 API製作多個窗口
創建並繪製一個分層的窗口,我可以使用GDI畫什麼我想它的blit東西,現在我已經工作的代碼,拖動它,甚至使之透明,等等
但我想我可以畫的第二個矩形區域,拖動等等。換句話說,第二個窗口。可能希望它是一個兒童窗口。問題是,我該如何做到?另外,如果有人知道Windows API中窗口管理的文章或教程等任何良好資源(最好在線),請分享。
你可以打CreateWindow的()不止一次如果你想。 WinMain中的消息循環會將事件傳遞給WinMain創建的所有窗口。如果需要,甚至可以創建兩個重疊窗口,並將第二個窗口的父窗口設置爲第一個窗口的句柄。
聽起來好像你想要一個Multiple Document Interface。這裏是一個示例:
您可以使用CreateWindow/CreateWindowEx創建任意數量的窗口,並根據需要(所有者/子級)使用它們之間的關係。
你可以做一個窗口「擁有」其他有:
SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR) hwndParent);
要將窗口轉變爲兒童,使用SetParent
。
請注意SetWindowLongPtr
與GWLP_HWNDPARENT
調用不會像SetParent(MSDN在這個我認爲是錯誤的)。 GWLP_HWNDPARENT
不會將窗口轉換爲「子」,而是轉換爲「擁有」。
通過將所有者窗口句柄傳遞給'CreateWindow [Ex]'調用('hWndParent'參數)來創建所有者/擁有關係。如果'WS_CHILD'窗口樣式不存在,'hWndParent'將是所有者。如果是,'hWndParent'將指定父窗口,並建立父/子關係。 – IInspectable 2015-02-06 12:53:15
要創建多個窗口,請重複在創建第一個窗口以創建第二個窗口時所做的所有步驟。一個好辦法是從第一個窗口複製並粘貼所有代碼。然後進行搜索並替換,在其中將第一個窗口的所有名稱替換爲第二個窗口的唯一名稱。下面我就是這樣做的代碼。
最重要的是要注意的是,第二個窗口的窗口類應該在代碼 行「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編程
我知道這已經回答了,但我只是寫一個通過打開的窗戶任意數量的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;
}
最後,只要你想,只是一個單一的每一行代碼創建多個窗口。
希望這可以幫助那裏的人。
我終於明白了。它工作時,我修改我創建窗口的例程,允許它使用不同的ClassName字符串註冊窗口類。爲什麼我需要爲第二個窗口創建一個單獨的窗口類,如果功能應該保持不變? – 2010-05-22 02:29:48
@Steven Lu:不確定。我運行測試只檢查註冊一個窗口類,並能夠CreateWindow兩次。當然,這意味着他們共享一個WndProc。 WndProc中沒有靜態數據,對嗎? – JustJeff 2010-05-22 03:03:29
我仍然使用相同的窗口過程,但它必須是一個不同的窗口類,即我不得不調用具有不同'WNDCLASSEX :: lpszClassName'的'RegisterClassEx'。這是正常的嗎? – 2010-05-22 18:50:30