mehrere eigenständige fenster



  • okay.. ich denke mal um dem jeweiligen fenster befehle zu geben was es machen soll und wie und wo und warum und mit was es das machen soll?



  • Die WndProc() dient als Callback. Wann immer etwas mit dem Fenster passiert (User klickt mit der Maus rum, drückt ne Taste, was auch immer) wird die WndProc() des Fensters aufgerufen um zu entscheiden was getan werden soll. Wenn du also willst dass X passiert wenn der Benutzer Y macht dann musst du eben in der WndProc() des entsprechenden Fensters checken ob Y eingetreten ist und wenn ja X auslösen...



  • aber wenn z.b Y der button ist und der in einer anderen proc als X(das was macht werden soll) ist. dann muss ich doch irgentwie eine nachricht von der proc wo y ist an die proc wo X ist schicken.

    anderst hab ichs mit einer globalen variable versucht.

    z.b static int i;

    und in der proc von X eingetragen:

    if( i == 1)
    ....das und das machen...

    und in der proc des buttons also Y

    switch(LOWORD(wParam))
    {
    case ID_DES_BUTTONS:
    i == 1;
    break;
    }

    das geht aber auch nicht.



  • Und jetzt überleg mal wann dieses if in der Proc von X aufgerufen wird...

    Abgesehen davon dass

    case ID_DES_BUTTONS: 
    i == 1; 
    break;
    

    keine Zuweisung an i ist.



  • oh ja das war ein flüchtigkeitsfehler mit der zuweiseung.

    in WM_PAINT?



  • metapoint2011 schrieb:

    in WM_PAINT?

    Wenn dus im WM_PAINT von X stehen hast dann ja. Dann überleg jetzt mal wann das WM_PAINT von X aufgerufen wird...



  • in

    switch(message)
    {
    case WM_PAINT:
    ...................
    .......
    ....
    }



  • Die Frage ist nicht wo es steht sondern wann es aufgerufen wird. Wann wird dieser Code ausgeführt?



  • achso hmm....

    weiss nicht genau auf was du hinaus willst.

    Eigentlich dann, wenn etwas gezeichnet werden soll.



  • metapoint2011 schrieb:

    Eigentlich dann, wenn etwas gezeichnet werden soll.

    ...und du erwartest ernsthaft dass Windows auf die Idee kommt dass dieses Fenster da links unten neu gezeichnet werden muss weil an Speicherstelle 0x1234 der Wert 1 geschrieben wurde?



  • hmm.. also ich habe jetzt eine gobale statische int variable mit dem namen i deklariert.

    in proc1 eine button gemacht, nach dem man darauf klickt i = 1 wird.

    in proc2 in WM_PAINT das reingeschrieben:

    case WM_PAINT:
    		hdc = BeginPaint(hWnd1, &ps);
    
    		if(i==1)
    		{
    			TextOut(hdc, 10, 10, _T("Hallo"), 5);
    			InvalidateRect(hWnd1, NULL, TRUE);
    		}
    
    		EndPaint(hWnd1, &ps);
    		break;
    

    da geht bis jetzt noch nix.



  • Jetzt denk doch bitte nochmal drüber nach welcher Code wann ausgeführt wird...



  • hmmm... ich weiss es nicht.

    da fehlt ja noch was.

    weil mit diesem code ^^ oben, geht es erst, wenn ich den button klicke, dann auf das fenster klicke und erst wenn ich den rahmen verziehe wird es angezeigt.
    und dann flackert das noch so rum.

    und invalidateRect muss wo anderst sein.

    das heisst es fehlt noch etwas. Das fenster muss aktiviert werden? oda so?



  • so muss ich nach dem button nurnoch den rahmen verziehen und der text wird angezeigt udn flackert nichtmehr aba das is irgentwie unsinn:

    case WM_COMMAND:
    		if(i==1)
    		{
    			InvalidateRect(hWnd1, NULL, TRUE);
    		}
    		break;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd1, &ps);
    
    		if(i==1)
    		{
    			TextOut(hdc, 10, 10, _T("Hallo"), 5);	
    		}
    
    		EndPaint(hWnd1, &ps);
    		break;
    


  • Das InvalidateRect steht in der falschen WndProc. Irgendwie hab ich das Gefühl dass es bei dir noch massiv an Grundlagen mangelt. Ich würde dir empfehlen erstmal richtig mit C umgehen zu lernen bevor du dich mit GUI Programmierung plagst...



  • aber wenn ich in hWnd: InvalidateRect(hWnd1,NULL,TRUE) eingebe. gehts doch nicht.

    hWnd1 is dort ein nicht deklarierter bezeichner.

    man...



  • Das Problem musst du eben irgendwie lösen, wär ja nicht so dass hWnd1 eine Unbekannte ist...



  • man war das einfach ey.. 😞

    hab static HWND hWnd1; nicht drin gehabt.

    danke..

    und dafür tust du mich hier 2 stunden rumprobieren lassen.

    eine frage noch, der restliche code ^^oben ist so okay? weil das kommt mir komische vor.



  • metapoint2011 schrieb:

    und dafür tust du mich hier 2 stunden rumprobieren lassen.

    Ich könnt dir natürlich in 5min hier das fertige Programm posten. Das würd dir aber nix bringen 😉

    metapoint2011 schrieb:

    eine frage noch, der restliche code ^^oben ist so okay? weil das kommt mir komische vor.

    ka, wie schaut denn dein code grad so aus!?



  • hier mal alles wenn du lust hast alles zu prüfen, sollte jetzt nur mal zum lernen sein, heisst: er kann nciht viel.

    #include "stdafx.h"
    #include "2 fenster.h"
    
    #define MAX_LOADSTRING 100
    // Globale Variablen:
    HINSTANCE hInst;								// Aktuelle Instanz
    TCHAR szTitle[MAX_LOADSTRING];					// Titelleistentext
    TCHAR szWindowClass[MAX_LOADSTRING];			// Klassenname des Hauptfensters
    TCHAR szWindowClass1[MAX_LOADSTRING];
    static int i = 0;
    
    // Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen:
    ATOM				MyRegisterClass(HINSTANCE hInstance);
    ATOM				MyRegisterClass1(HINSTANCE hInstance);
    BOOL				InitInstance(HINSTANCE, int);
    LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK	WndProc1(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	UNREFERENCED_PARAMETER(hPrevInstance);
    	UNREFERENCED_PARAMETER(lpCmdLine);
    
     	// TODO: Hier Code einfügen.
    	MSG msg;
    	HACCEL hAccelTable;
    
    	// Globale Zeichenfolgen initialisieren
    	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_MY2FENSTER, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	LoadString(hInstance, IDC_MY2FENSTER1, szWindowClass1, MAX_LOADSTRING);
    	MyRegisterClass1(hInstance);
    
    	// Anwendungsinitialisierung ausführen:
    	if (!InitInstance (hInstance, nCmdShow))
    	{
    		return FALSE;
    	}
    
    	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY2FENSTER));
    
    	// Hauptnachrichtenschleife:
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    
    	return (int) msg.wParam;
    }
    
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    	WNDCLASSEX wcex;
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    
    	wcex.style			= CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc	= WndProc;
    	wcex.cbClsExtra		= 0;
    	wcex.cbWndExtra		= 0;
    	wcex.hInstance		= hInstance;
    	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY2FENSTER));
    	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
    	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_MY2FENSTER);
    	wcex.lpszClassName	= szWindowClass;
    	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    	return RegisterClassEx(&wcex);
    }
    
    ATOM MyRegisterClass1(HINSTANCE hInstance)
    {
    	WNDCLASSEX wcex;
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    
    	wcex.style			= CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc	= WndProc1;
    	wcex.cbClsExtra		= 0;
    	wcex.cbWndExtra		= 0;
    	wcex.hInstance		= hInstance;
    	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY2FENSTER));
    	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
    	wcex.lpszMenuName	= NULL;
    	wcex.lpszClassName	= szWindowClass1;
    	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    	return RegisterClassEx(&wcex);
    }
    
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd, hWnd1;
    
       hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern
    
       hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    
       hWnd1 = CreateWindow(szWindowClass1, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       if (!hWnd1)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       ShowWindow(hWnd1, nCmdShow);
       UpdateWindow(hWnd1);
    
       return TRUE;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    	PAINTSTRUCT ps;
    	HDC hdc;
    	static HWND hBtn, hWnd1; 
    
    	switch (message)
    	{
    	case WM_CREATE:
    		hBtn = CreateWindow(_T("button"), _T("hallo"),
    							WS_VISIBLE | WS_CHILD,
    							10, 10, 50, 30, hWnd, (HMENU) 1, hInst, NULL);
    		break;
    
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// Menüauswahl bearbeiten:
    		switch (wmId)
    		{
    		case 1:
    			i = 1;
    			InvalidateRect(hWnd1, NULL, TRUE);
    			break;
    		case IDM_\1:
    			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    			break;
    		case IDM_EXIT:
    			DestroyWindow(hWnd);
    			break;
    		default:
    			return DefWindowProc(hWnd, message, wParam, lParam);
    		}
    		break;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd, &ps); 
    
    		EndPaint(hWnd, &ps);
    		break;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0;
    }
    
    LRESULT CALLBACK WndProc1(HWND hWnd1, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	switch (message)
    	{
    	case WM_COMMAND:
    
    		break;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd1, &ps);
    
    		if(i==1)
    		{
    			TextOut(hdc, 10, 10, _T("Hallo"), 5);	
    		}
    
    		EndPaint(hWnd1, &ps);
    		break;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd1, message, wParam, lParam);
    	}
    	return 0;
    }
    
    // Meldungshandler für Infofeld.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	UNREFERENCED_PARAMETER(lParam);
    	switch (message)
    	{
    	case WM_INITDIALOG:
    		return (INT_PTR)TRUE;
    
    	case WM_COMMAND:
    		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    		{
    			EndDialog(hDlg, LOWORD(wParam));
    			return (INT_PTR)TRUE;
    		}
    		break;
    	}
    	return (INT_PTR)FALSE;
    }
    

Anmelden zum Antworten