Probleme mit Button
-
Bei meinem Programm wird ein Button erzeugt jedoch nicht korrekt angezeigt.
Ich habe schon herumprobiert aber komme nicht drauf. Shade das man keine Dateien Uploaden kann. Deshalb hier der Code
///////////////////////////////////////////////////////////////////////////////
#include <windows.h>struct to
{
int ox;
int oy;
int ow;
int oh;}g;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
{
char szName[] = "Fensterklasse";
WNDCLASS wc;wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hI;
wc.hIcon = LoadIcon (NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szName;RegisterClass (&wc);
HWND hwnd = CreateWindow (szName, "", WS_OVERLAPPEDWINDOW,
200, 200, 600, 600, NULL, NULL, hI, NULL);ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}return msg.wParam;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HWND hwndb1;g.ox = 0;
g.oy = 0;
g.ow = 100;
g.oh = 50;double i = 0;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
SetStretchBltMode(hdc,BLACKONWHITE);
while((g.ox + i) <= 400 && (g.oy + i) <= 400)
{
Rectangle(hdc, (g.ox + i), (g.oy +i),(g.ow + i), (g.oh +i));
i+= 0.0005;
}
EndPaint (hwnd, &ps);
hwndb1 = CreateWindow("button", "SNAKE", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, (g.ox+i), (g.oy+i), g.ow, g.oh, hwnd, NULL, (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
return 0;
case WM_COMMAND:
PostQuitMessage (0);case WM_DESTROY:
PostQuitMessage (0);
return 0;
}return DefWindowProc (hwnd, message, wParam, lParam);
}
/////////////////////////////////////////////////////////////////////////////
-
Childfenster (und Dein Button ist einer) werden nicht in WM_PAINT erzeugt, sondern in WM_CREATE.
Dein WM_COMMAND-zweig sieht... nunja, sagen wir etwas "seltsam" aus.
Möchtest Du nicht erstmal ein WinAPI-Tutorial durcharbeiten?
-
Ich will ja nicht einen Button erzeugen wenn die Nachricht WM_CREATE eintrifft sondern wenn die Nachricht WM_PAINT eintrifft und die "Snake" aus den Rechtecken erstellt wurde. Probiers aus und du siehst den Fehler:
Der Button existiert zwar wird aber nur selten und durch Zufall richtig angezeigt. (Der Button wird glaube ich mehrmals erzeugt was zu merkwürdigen Grafikfehlern führt)
Das würde heißen die Message WM_PAINT wird mehrmals abgeschickt.(Aber wieso?)
Ich werde das mal durch ne if(bool) Entscheidung prüfen und nen bool auf false setzen wenn der Button einmal erzeugt wurde. Mal sehen was passiert.
-
Ich habe den Code unverändert in eine andere Datei auf einem anderen Rechner kopiert und plötzlich geht alles wie es soll.
-
The_incredible_Guest schrieb:
Das würde heißen die Message WM_PAINT wird mehrmals abgeschickt.(Aber wieso?)
WM_PAINT wird vom System jedesmal dann an Dein Programm geschickt, sobald dein Fenster neu gezeichnet werden muß.
z. B.: Wird Dein Programmfenster von einem anderen Fenster überlappt -> WM_PAINTSiehe auch:
MSDN: WM_PAINT