まず、これが私が与えられた文書からの説明です。注: 私がしなければならなかったのは、これらの要件を満たすために既存のコードを変更することだけでした
コードを変更して、デモに示すように編成された 4 つのウィンドウを作成します。ユーザーがウィンドウを閉じたときに、他のウィンドウがまだ開いている場合、プログラムは強制終了されません。プログラムを停止するには、ユーザーはそれらすべてを閉じる必要があります。
開いているウィンドウの数を追跡する必要があります (閉じている場合は減算します)。グローバルは許可されていません。静的は許可されていません。
さらに、プログラムは lParam と CREATESTRUCT を使用してカウントを初期化する必要があります。
Possible functions and structs:
SetWindowLong()
GetWindowLong()
SetClassLong()
GetClassLong()
CREATESTRUCT
さて、これが私が終わったものです。必要な 4 つのウィンドウを開くことができ、1 つのウィンドウを閉じても (WM_DESTROY メッセージを送信して) プログラム全体が終了しないようにしました。私が混乱しているのは、lParam の受け渡しと CREATESTRUCT の使用です。
ここに私のwndproc.cがあります:
LRESULT CALLBACK HelloWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
int number = GetClassLongPtr(hwnd, 0);
switch (message){
case WM_CREATE:
if(number == 0){
SetClassLongPtr(hwnd, 0, (LONG)((CREATESTRUCT*)lParam)->lpCreateParams);
}
number++;
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT("Unique yet the same!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
number--;
if(number == 0){
PostQuitMessage(0);
}
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
作成された最初のウィンドウの lParam として渡す変数を Class Extra として設定しようとしています。それは理にかなっていますか?ここに私のmain.cがあります:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCMLine, int iCmdShow){ static TCHAR szAppName[] = TEXT ("HelloApplication"); HWND hwnd; MSG メッセージ; WNDCLASS wndclass; LONG* カウント。
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = HelloWndProc;
wndclass.cbClsExtra = 5;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass (&wndclass)){
MessageBox (NULL, TEXT ("This program requires Windows 95/98/NT"),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName,
TEXT("Hello World for Windows"),
WS_OVERLAPPEDWINDOW,
100,
50,
400,
300,
NULL,
NULL,
hInstance,
count = 0);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
助けていただければ幸いです。私はすでにクラスでこの情報についてクイズを受けましたが、理解できませんでした。私は自分の理解のためだけにこの質問を投稿しています。
ありがとう。