Button wird gedoppelt
-
Hallo Leute,
ich habe gerade mit den Win-APIs angefangen und spiele ein wenig mit den Möglichkeiten herum; jetzt habe ich folgendes Problem:
Wenn ich die beiden Childs erzeuge (siehe Unten) wird "button" im Parentfenster aber auch im zweiten Childfenster dargestellt.
Wie kann das ändern und zwar so, dass "button" nur noch im Parentfenster gezeigt wird?
____________________________________________________________________________#include "stdafx.h" #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; const char szAppName[] = "Windows Buttons"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); wc.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH); wc.hIcon = NULL; wc.lpszClassName = "screen1"; RegisterClass(&wc); hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hButton,hScreen1; switch (message) { case WM_CREATE: { hScreen1 = CreateWindow( "screen1", NULL, WS_CHILD | WS_VISIBLE, 100, 100, 300, 100, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButton = CreateWindow( "button", "ZOOM", WS_CHILD | WS_VISIBLE, 0,0, 50, 30, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; } case WM_SIZE: { MoveWindow(hScreen1,110,150,100,100, TRUE); MoveWindow(hButton,0,0, 50, 30, TRUE); return 0; } case WM_COMMAND: { if (lParam == (LPARAM)hButton) { if (HIWORD(wParam) == BN_CLICKED) SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }_______________________________________________________________________________
Vielen Dank vorweg
globalplayer
-
globalplayer schrieb:
Wenn ich die beiden Childs erzeuge (siehe Unten) wird "button" im Parentfenster aber auch im zweiten Childfenster dargestellt.
Wie kann das ändern und zwar so, dass "button" nur noch im Parentfenster gezeigt wird?Ich verstehe irgendwie nicht so ganz, was du meinst - habe aber leider gerade auch main VC++ nicht installiert, um es kurz zu testen

-
Ok, ich versuchs nochmal:
AAAAAAAAlso es ist so: Ich habe ein Hauptfenster; in dieses soll oben Rechts ein Button und darunter ein weiteres Fenster; Button und weiteres Fenster sind Child; so soll es sein.
Tatsächlich schaut die Ausgabe aber so aus:
Ich habe das Hauptfenster und den Button oben Rechts, sowie das weitere Child-Fenster - soweit ist alles so, wie ich es haben will.
Es ist nur so, das im Child-Fenster der Button noch mal erscheint und zwar relativ gesehen an der gleichen Stelle, wie im Hauptfenster, also oben rechts und diesen Button im Childfenster kann ich mir nicht erklären!Ich hoffe es ist etwas klarer jetzt
globalplayer
-
Achso, sehe es jetzt erst: screen1 hat die selbe WndProc - also wird dort nochmal in WM_CREATE ein Button erzeugt

Eigentlich müsste sich das sogar unendlich fortsetzen
-
Ja stimmt, ich habe das Programm noch eimal modifiziert und seit dem habe ich genug Buttons um über den Winter zu kommen.

Aber egal... um diese Endlosschleife aufzulösen muß ich also für eines der Childfenster einen anderen Wert für "lpfnWndProc" einsetzen und diese Callback-Funktion natürlich auch definieren. Habe ich das richtig verstanden?globalplayer
**
PS
Vielen Dank für die schnell und gute Hilfe flenders, das Programm funktioniert jetzt!
**
-
Ja, du musst für jede unterschiedliche Art von Fenster eine andere WndProc verwenden.
