mehrere eigenständige fenster



  • cooky451 schrieb:

    Übersehe ich da was..

    ja



  • hInstance gibt es nur einmal pro Applikation.



  • so habe jetzt mal 2 klasse, 2 fenster und 2 wndprocs erstellt.

    leider wird der text "Hallo" immernoch in beiden fenstern angezeigt

    was fehlt mir noch? und hab ich vllt auch zu viel gemacht, irgw. das ich nicht brauche?

    #include "stdafx.h"
    #include "Term 1.0.h"
    #include "stdio.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];
    
    // 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_TERM10, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	LoadString(hInstance, IDC_TERM10, szWindowClass1, MAX_LOADSTRING);
    	MyRegisterClass1(hInstance);
    
    	// Anwendungsinitialisierung ausführen:
    	if (!InitInstance (hInstance, nCmdShow))
    	{
    		return FALSE;
    	}
    
    	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TERM10));
    
    	// 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_TERM10));
    	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wcex.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_TERM10);
    	wcex.lpszClassName	= szWindowClass;
    	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    	return RegisterClassEx(&wcex);
    }
    
    ATOM MyRegisterClass1(HINSTANCE hInstance)
    {
    	WNDCLASSEX wcex1;
    
    	wcex1.cbSize = sizeof(WNDCLASSEX);
    
    	wcex1.style			= CS_HREDRAW | CS_VREDRAW;
    	wcex1.lpfnWndProc	= WndProc1;
    	wcex1.cbClsExtra	= 0;
    	wcex1.cbWndExtra	= 0;
    	wcex1.hInstance		= hInstance;
    	wcex1.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TERM10));
    	wcex1.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wcex1.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wcex1.lpszMenuName	= MAKEINTRESOURCE(IDC_TERM10);
    	wcex1.lpszClassName	= szWindowClass1;
    	wcex1.hIconSm		= LoadIcon(wcex1.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    	return RegisterClassEx(&wcex1);
    }
    
    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, CW_USEDEFAULT, 500, 400, NULL, NULL, hInstance, NULL);
    
       hWnd1 = CreateWindow(szWindowClass1, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, hWnd, 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;
    
    	switch (message)
    	{
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    
    		// Menüauswahl bearbeiten:
    		switch (wmId)
    		{
    		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);
    
    		TextOut(hdc, 10, 10, _T("Hallo"), 5);
    
    		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)
    {
    	int wmId, wmEvent;
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	switch (message)
    	{
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    
    		// Menüauswahl bearbeiten:
    		switch (wmId)
    		{
    		case IDM_\1:
    			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd1, About);
    			break;
    		case IDM_EXIT:
    			DestroyWindow(hWnd1);
    			break;
    		default:
    			return DefWindowProc(hWnd1, message, wParam, lParam);
    		}
    		break;
    
    	case WM_PAINT:
    		hdc = BeginPaint(hWnd1, &ps);
    
    		EndPaint(hWnd1, &ps);
    		break;
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hWnd1, message, wParam, lParam);
    	}
    	return 0;
    }
    


  • Deine "beiden" Window Classes bekommen auch den selben Namen. Und was genau ist eigentlich der Sinn davon selbigen aus einer String Table zu laden!?



  • dot schrieb:

    Deine "beiden" Window Classes bekommen auch den selben Namen.

    is doch szWindowClass und szWindowClass1?

    Und was genau ist eigentlich der Sinn davon selbigen aus einer String Table zu laden!?

    sollte ich das weglassen? ->

    LoadString(hInstance, IDC_TERM10, szWindowClass1, MAX_LOADSTRING);
    

    ehrlich gesagt weiss ich garnicht was das bringt?



  • metapoint2011 schrieb:

    ehrlich gesagt weiss ich garnicht was das bringt?

    Warum tust dus dann 😕



  • war ein versuch.. hmm..



  • metapoint2011 schrieb:

    is doch szWindowClass und szWindowClass1?

    Und? Beide Variablen haben bei dir den selben Inhalt...



  • okay habe jetzt:

    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_TERM10, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	LoadString(hInstance, IDC_TERM10, szWindowClass1, MAX_LOADSTRING);
    	MyRegisterClass1(hInstance);
    

    auf das geändert:

    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_TERM10, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	LoadString(hInstance, IDC_TERM101, szWindowClass1, MAX_LOADSTRING);
    	MyRegisterClass1(hInstance);
    

    IDC_TERM101 ist jetzt 4000 und IDC_TERM10 109

    jetzt erscheint garkein fenster mehr



  • Nochmal meine Frage: Warum LoadString(). Und selbst wenn: Werden die strings auch richtig geladen? Hat die String Table überhaupt vernünftige Werte für diese IDs?



  • ich weiss es nicht. Ich weiss nur wenn ich es weg lasse wird kein fenster angezeigt.



  • Ist dir eigentlich klar was RegisterClassEx so tut und wofür dieses szWindowClass gut ist und überhaupt!? Wenn nicht solltest du vielleicht erstmal versuchen zu verstehen wie man ein Fenster erzeugt bevor du versuchst zwei zu machen...



  • RegisterClassEx registriert eine fensterklasse und szWindowClass is der Name der registrierten fensterklasse?



  • Gut, dann sollte dir auch klar sein dass du dafür sorgen solltest dass deine beiden Klassen zwei ordentliche und verschiedene Namen bekommen.



  • ahhhh der fehler ist in der .rc datei



  • jaaa habs geschaft. hab auch glaub ich so ziemlich alles verstanden.

    immer diese kleinigkeiten, wie vorhin bei den Text sachen.

    aba wenigstens hab ich jetzt das loadstring und viele andere sachen verstanden.

    jetzt muss ich nurnoch lernen wie diese beiden fenster zusammen arbeiten können.

    > dot <<< du hast mir heute seeehr viel geholfen.

    Ich danke dir echt...



  • metapoint2011 schrieb:

    aba wenigstens hab ich jetzt das loadstring und viele andere sachen verstanden.

    Ich versteh aber immer noch nicht wofür du Fensterklassennamen in der String Table ablegst. Das macht Sinn für Strings die eben z.B. in beliebige Sprachen übersetzt werden sollen, was auf ne Fensterklasse kaum zutrifft.

    metapoint2011 schrieb:

    jetzt muss ich nurnoch lernen wie diese beiden fenster zusammen arbeiten können.

    Was genau meinst du damit?



  • Ich versteh aber immer noch nicht wofür du Fensterklassennamen in der String Table ablegst. Das macht Sinn für Strings die eben z.B. in beliebige Sprachen übersetzt werden sollen, was auf ne Fensterklasse kaum zutrifft.

    die fensternamen sind in strings abgelegt, weil vc++ den code so generiert hat

    Was genau meinst du damit?

    ich will lernen wie die miteinander kommunizieren können. das heisst:

    wenn ich z.b in dem einen fenster einen button drücke, geschieht in dem anderen fenster etwas.

    und hWnd soll ja nicht das parent von dem 2. fenster sein, da das 2. fenster sonnst immer vor dem hWnd ist.

    und das zweite fenster hat ja auch eine eigene wndproc...



  • metapoint2011 schrieb:

    wenn ich z.b in dem einen fenster einen button drücke, geschieht in dem anderen fenster etwas.

    Wo genau liegt da dein Problem? Wenn im einen Fenster ein Button gedrückt wird dann bekommt die WndProc dieses Fensters eine WM_COMMAND geschickt. Und nichts hält dich davon ab dann in dem anderen Fenster etwas passieren zu lassen...



  • mein unwissen...


Anmelden zum Antworten