Fenster Handhabung
-
Hallo zusammen !!!
Hier fragt mal wieder ein Anfänger !
Nachdem ich jetzt einige Tutorials durch habe (tue mich zwar noch immer schwer
aber es geht schon) hänge ich jetzt ein wenig in der Luft und zwar mit der
Handhabung mit Eltern und Child Fenstern.
Ich habe es aus den Tutorials auch nich richtig erlesen können wie die
Richtige Habhabung damit ist.
Ich wolle für mich zur Übung vollgenden Ablauf darstellen.
Fenster ausgestattet mit TextOut "Kein Wert", und einem Button.
Beim Click auf den Button soll sich das child fenster öffnen,
ausgestattet mit Edit Feld und einem Button ->ins edit Feld ein Wert und
auf Botton Click um den wert zu übernehmen.
Dieser Wert soll dann ins Elternfenster dahin wo vorher "Kein Wert" steht.Da z.B. in einem Tutorial beide Fenster in der WINAPI geöffnet werden und in
einem andern beschrieben wird, das die einzelnen Create Elemente auch nur
Fenster sind können diese ja auch in der switch case funktion für das
CreateWindow benutzt werden.
Da ist mir der Ablauf nicht klar wie das zu handhaben ist.
Ich hoffe ihr könnt mir da weiterhelfen.Gruß Wolfgang

-
hab leider nur die hälfte verstanden.
also in der WINAPI WinMain, beschreibst du beide Fenster.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; //fenster 1 wc.xxx ..... RegisterClass(&wc) //fenster 2 wc.xxx ...... RegisterClass(&wc) //fenster 1 erstellen hwnd = CreateWindow(....... .......) ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }wenn du 2 fenster hast, brauchst du auch 2 callback funktionen
callback fenter 1
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hChild; switch (message) { case WM_CREATE: { //fenster 2 erstellen hChild = CreateWindow(..... .....) case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }fenster 2 alles was im 2 fenster passiert hier rein
LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }edit: vielleicht hilf dir die seite weiter, die is ganz nett
http://www.win-api.de/
-
Hallo Adonis
So habe jetzt mal de Code so zusammen geschoben wie in deinem Vorschlag.
nur wie bekomme ich das Ferster auf ? mit ShowWindow (hwnd2, SW_SHOWNORMAL);
komme ich nicht weiter ja ich weis immer die blöden Anfänger!!!#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChildProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { char szName[] = "Fensterklasse"; char szName1[] = "Fensterklasse1"; 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 (LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); HWND hwnd = CreateWindow // Fenster 1 ( szName, "Hauptfenster", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hI, NULL ); HWND hwnd2 = CreateWindow // Fenster 2 ( szName1, "Eingabefenster", WS_OVERLAPPEDWINDOW, 300, 500, 200, 200, NULL, NULL, hI, NULL ); ShowWindow (hwnd, SW_SHOWNORMAL); 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 hwndButton1; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 30, 30, "Kein Wert", 9); EndPaint (hwnd, &ps); return 0; case WM_CREATE : hwndButton1 = CreateWindow ( "button", "Knopf 1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 20, 100, 40, hwnd, NULL, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); return 0; //-------------------------------------------------------------------------------------------- case WM_COMMAND: return 0; //-------------------------------------------------------------------------------------------- case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } //------------------------------------------------------------------------------------------------------------------- LRESULT CALLBACK ChildProc (HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HWND hwndButton2; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd2, &ps); TextOut (hdc, 20, 20, "Bitte Wert eingeben !", 21); EndPaint (hwnd2, &ps); return 0; case WM_CREATE : hwndButton2 = CreateWindow ( "button", "Wert", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 20, 100, 40, hwnd2, NULL, (HINSTANCE) GetWindowLong (hwnd2, GWL_HINSTANCE), NULL); return 0; case WM_COMMAND: MessageBox(hwnd2,"AA", "So wär es richtig !!!", MB_OK); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd2, message, wParam, lParam); }
-
mhh, also das bräuchtest ja nochmal fürs child
wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //hier dann childproc 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 (LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; //childklassenname RegisterClass (&wc);muss allerding nich soviel sein, sowas in der art würde auch reichen,
einfach alles das nehmen was du brauchstwc.style = CS_HREDRAW|CS_VREDRAW; wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wc.lpfnWndProc = Childproc; wc.lpszMenuName = NULL; wc.lpszClassName = //szChildName; RegisterClass (&wc);createwindow fürs child würd ich in der winproc machen im WM_CREATE zweig
und das, würd ich global machen
char szName1[] = "Fensterklasse1";wenn es nich hinbekommst, kann ich es auch schnell umschreiben und
markieren was ich geändert hab
-
Das Wäre super wenn du da machen würdest !!!
Gruß
-
sollte laufen wenn du es copy pastest
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChildProc (HWND, UINT, WPARAM, LPARAM); char szName1[] = "Fensterklasse1"; //hier 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 (LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); ////////hier geandert///////////////////////////////// wc.style = CS_HREDRAW|CS_VREDRAW; wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wc.lpfnWndProc = ChildProc; wc.lpszMenuName = NULL; wc.lpszClassName = szName1; RegisterClass (&wc); ///////////////////////////////////////////////////// HWND hwnd = CreateWindow // Fenster 1 ( szName, "Hauptfenster", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hI, NULL ); ShowWindow (hwnd, SW_SHOWNORMAL); 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 hwndButton1, hwnd2; //hier switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 30, 30, "Kein Wert", 9); EndPaint (hwnd, &ps); return 0; case WM_CREATE : hwndButton1 = CreateWindow ( "button", "Knopf 1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 20, 100, 40, hwnd, NULL, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); hwnd2 = CreateWindow // hier ( szName1, "Eingabefenster", WS_OVERLAPPEDWINDOW|WS_VISIBLE//auf visible sonst sieht man es nich, 300, 500, 200, 200, hwnd, NULL, NULL, NULL ); return 0; //-------------------------------------------------------------------------------------------- case WM_COMMAND: return 0; //-------------------------------------------------------------------------------------------- case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } //------------------------------------------------------------------------------------------------------------------- LRESULT CALLBACK ChildProc (HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HWND hwndButton2; switch (message) { case WM_PAINT: hdc = BeginPaint (hwnd2, &ps); TextOut (hdc, 20, 20, "Bitte Wert eingeben !", 21); EndPaint (hwnd2, &ps); return 0; case WM_CREATE : hwndButton2 = CreateWindow ( "button", "Wert", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 150, 20, 100, 40, hwnd2, NULL, (HINSTANCE) GetWindowLong (hwnd2, GWL_HINSTANCE), NULL); return 0; case WM_COMMAND: MessageBox(hwnd2,"AA", "So wär es richtig !!!", MB_OK); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd2, message, wParam, lParam); }
-
Der schmeiß bei mir aber nen fehler aus und zwar hier :
hwnd2 = CreateWindow // hiermit
C:\Dev-Cpp\main.cpp In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
-
jo, sehe grad hinter WS_VISIBLE fehlt nen komma
-
Ja genau das war ja nicht der Sinn das Child fester soll ja erst beim
klicken auf den button im ElternFenster aufgehen.
So hatte ich es ja schon mit den Toturials hinbekommen !??!
-
Stop Hab schon natürlich muß das erst in die WM_COMMAND
super vielen dank !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!