mehrere eigenständige fenster



  • 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;
    }
    


  • Na schaut doch aus als würds funktionieren 🙂



  • okay.

    danke das du mir so viel hiflst..

    auch wenn ich c nochnicht so drauf hab.

    du sieht ich lerne 🙂

    hab heute doch schon viel geschafft oder nicht?


Anmelden zum Antworten