N
Stimmt, die Schleife ist überflüssig. Vielen Dank für den Impuls.
Aber: Wenn ich einfach nur abfrage
if (rcClientTooBig.bottom!=CLIENT_HEIGHT
dann kann es immer noch zu Problemen kommen, wenn das Menü am Anfang so riesengroß ist, daß es das gesamte ursprüngliche Fenster verdeckt. Da muß dann am Ende doch noch eine Schleife her. Ich habe das funktionierende Programm mal hier aufgeschrieben, falls es jemanden interessiert:
#include <windows.h>
LRESULT CALLBACK WindowProc (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE instance, HINSTANCE, LPSTR, int cmdShow)
{
const DWORD STYLE=WS_OVERLAPPEDWINDOW,
EX_STYLE=0;
const UINT WIDTH=200, HEIGHT=150;
HWND window;
/*Punkt 1: Ermitteln der richtigen Fenstergröße
---------------------------------------------*/
RECT rect={0, 0, WIDTH, HEIGHT};
AdjustWindowRectEx (&rect, STYLE, true, EX_STYLE);
/*Punkt 2: Erstellen des Fensters
-------------------------------*/
WNDCLASSEX wndClassEx={0};
MSG msg;
wndClassEx.cbSize=sizeof (WNDCLASSEX);
wndClassEx.lpfnWndProc=WindowProc;
wndClassEx.hInstance=instance;
wndClassEx.hIcon=LoadIcon (NULL, IDI_APPLICATION);
wndClassEx.hCursor=LoadCursor (NULL, IDC_ARROW);
wndClassEx.hbrBackground=reinterpret_cast<HBRUSH> (BLACK_PEN);
wndClassEx.lpszClassName="My Window Class";
wndClassEx.hIconSm=wndClassEx.hIcon;
RegisterClassEx (&wndClassEx);
window=CreateWindowEx (EX_STYLE, wndClassEx.lpszClassName, "Fenster", STYLE, CW_USEDEFAULT, CW_USEDEFAULT, rect.right-rect.left, rect.bottom-rect.top, NULL, NULL, instance, NULL);
/*Punkt 3: Erstellen des Menüs
----------------------------*/
const UINT N=2;
/*Diesen Wert ändern, um das Menü zu vergrößern.
(Zum Beispiel mal auf 40 setzen.)*/
HMENU menu=CreateMenu (),
subMenu=CreatePopupMenu ();
for (UINT i=1; i<=N; i++)
{
AppendMenu (menu, MF_STRING|MF_POPUP, reinterpret_cast<UINT> (subMenu), "ABCDEFGHIJKLMNOP");
AppendMenu (subMenu, MF_STRING, i, "Irgendwas");
}
SetMenu (window, menu);
/*Punkt 4: Korrigieren der Größe
------------------------------*/
do
{
GetClientRect (window, &rect);
if (rect.bottom!=HEIGHT)
{
RECT windowRect;
GetWindowRect (window, &windowRect);
windowRect.bottom+=HEIGHT-rect.bottom;
SetWindowPos (window, NULL, 0, 0, windowRect.right-windowRect.left, windowRect.bottom-windowRect.top, SWP_NOMOVE);
}
}
while (rect.bottom!=HEIGHT);
/*Punkt 5: Start
--------------*/
ShowWindow (window, cmdShow);
UpdateWindow (window);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow (wnd);
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (wnd, msg, wParam, lParam);
}
return 0;
}