mehrere eigenständige fenster



  • hi, ich möchte mehrere fenster erzeugen..

    nur wird in jedem fenster immer das selbe angezeigt.

    was muss ich denn machen das im 2ten fenster eigene sachen angezeigt werden,
    aber trozdem beide miteinander arbeiten?

    hab das nichmal beim petzold gefunden.



  • Zwei Fenster erstellen mit ihren eigenen Callbacks!?



  • erstell einfach 2 Klassen mit 2 verschiedenen WindowProc's.



  • okay ich versuchs mal schnell...

    brauch ich dann auch 2 mal hInstance, also für jedes das eigene?



  • Übersehe ich da was.. oder wieso nicht einfach so?

    hwnd1 = CreateWindow(..)
    hwnd2 = CreateWindow(..)
    


  • 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


Anmelden zum Antworten