Fenster zeigt sich nciht!



  • Ich dachte die brauchts man nur wenn man nicht WS_Visible angibt aber ok mache ich mal. Aber könnte vielleicht nochmal jemand sagen was genau di ebeiden Funktionen machen? Das Show Window aktiviert das Fenster und das UpdateWindow sendet das erste WM_PAINT, dass dann später beim vershcieben, überdecken etc automatisch gesendet wird oder?



  • Ich habe das jetzt eingefügt, aber es zeigt sich immernoch nicht. Das Programm geht einfach sofort mit der Meldung

    **Das Programm "[2256] AGO-ENGINE.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.
    **

    wieder aus! Was soll ich da machen. Wenn ich die GetMessag Methode statt PeekMessage benutze geht das Programm nicht aus( Debugger läuft weiter) aber es muss 1. mit PeekMessage sein und 2. sieht man auch bei GetMessage kein Fenster! Danke!



  • HWND hMain;
    
    HINSTANCE g_hInst;
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, LPSTR szCmdLine, int iCmdShow)
    {
    	char MainWin[] = "Hauptfenster";
    
    	UNREFERENCED_PARAMETER (hPrI);
    	UNREFERENCED_PARAMETER (szCmdLine);
    
    	g_hInst = hI;
    	WNDCLASS wc;
    
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc = WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hI;
    	wc.hIcon = LoadIcon (hI, NULL);
    	wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
    	wc.lpszMenuName = NULL;
    	wc.lpszClassName = MainWin;
    
    	RegisterClass (&wc);
    
    	int x = 410;
    	x += GetSystemMetrics (SM_CXDLGFRAME) * 2;	//Breite des Rahmens * 2 (Links/Rechts)
    
    	int y = 250;
    	y += GetSystemMetrics (SM_CYCAPTION);		//Höhe der Titelleiste
    	//y += GetSystemMetrics (SM_CYMENU);			//Höhe der Menu-Bar
    	y += GetSystemMetrics (SM_CYDLGFRAME) * 2;	//Höhe des Rahmens * 2 (Oben/Unten)
    
    	int xPos = (GetSystemMetrics (SM_CXSCREEN) / 2) - (x / 2);
    	int yPos = (GetSystemMetrics (SM_CYSCREEN) / 2) - (y / 2);
    
    	hMain = CreateWindow (MainWin, "Test", WS_OVERLAPPEDWINDOW, xPos, yPos, x, y, NULL, NULL, hI, NULL);
    	ShowWindow (hMain, iCmdShow);
    	UpdateWindow (hMain);
    
    	MSG msg;
    	while (GetMessage (&msg, NULL, 0, 0))
    	{
    		TranslateMessage (&msg);
    		DispatchMessage (&msg);
    	}
    	return msg.wParam;
    }
    

    ich weiß nicht, obs dir hilft, ist mal nen bsp...musst mal gucken und vllt. probiern, falls niemand noch nen tipp hat...



  • Nein, dass hilft mir leide rnicht wirklich. Hat sosnt noch jemand einen Vorschlag?



  • Mach mal das WS_VISIBLE da weg.



  • Also ich habe jetzt den Quelltext komplett nach den Tipps hier überarbeitet, aber es geht imemrnoch nciht! Ich kopiere jetzt noch einmal den Quelltext hier rein. Ich hoffe irgendjemand kann mir helfen( Es kann nciht daran liegen das ich indows Vista benutze oder?)

    #include <windows.h>
    
    #include "GlobalExVar.h"
    #include "AGO.h"
    #include "InitMainAppWindow.h"
    #include "LRESULT.h"
    LRESULT CALLBACK WindowProc (HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam);
    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrI, LPSTR szCmdLine, int iCmdShow) 
    {
    HWND hWnd;
    hWnd=CreateAppWindow(hInst);
    ShowWindow (hWnd, iCmdShow); 
    UpdateWindow(hWnd);	
    
     while (PeekMessage(&message,NULL,0,0,PM_REMOVE))
     {
    	 TranslateMessage(&message);
      DispatchMessage(&message);
     }
     return(int)(message.wParam);
    }
    LRESULT CALLBACK WindowProc (HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    	case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return (0);
    		}
    	}
    return (DefWindowProc(hWnd,message,wParam,lParam));
    }
    

    [message ist global deklariert]

    #include <windows.h>
    #include "Vars.h"
    #include "InitMainAppWindow.h"
    #include "GlobalExVar.h"
    
    HWND CreateAppWindow(HINSTANCE hInst2)
    {
    HWND mah;
     WNDCLASSEX windowclass;
    
    static TCHAR NAME[]=TEXT("IDMW");
    	    windowclass.cbSize= sizeof(WNDCLASSEX);
    		windowclass.style= CS_HREDRAW|CS_VREDRAW;
    		windowclass.lpfnWndProc=WindowProc;
    		windowclass.cbClsExtra = 0;
    		windowclass.cbWndExtra = 0;
    		windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    		windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    		windowclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
    		windowclass.lpszMenuName=NULL;
    		windowclass.lpszClassName =NAME;
    		RegisterClassEx (&windowclass);
    
    		mah= CreateWindow(
    							NAME,
    							TEXT("NAMEDESFESNTER"),
    							WS_OVERLAPPEDWINDOW,
    							100,100,
    							300,250,
    							NULL,
    							NULL,
    							hInst2,
    
    							NULL);
    
    return mah;
    }
    

    Das ist der COde. Er verursacht keine Fehler, aber, wenn ich es starte dauert es kurz, dann wird im Compilier folgender Text ausgegeben:

    **"AGO-ENGINE.exe": "C:\Users\Nils\Desktop\MYENGINE\AGO-ENGINE\Debug\AGO-ENGINE.exe" geladen, Symbole wurden geladen.
    "AGO-ENGINE.exe": "C:\Windows\System32\ntdll.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\kernel32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\user32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\gdi32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\advapi32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\rpcrt4.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022.8_none_96748342450f6aa2\msvcr90d.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\shimeng.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\apphelp.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\AppPatch\AcLayers.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\shell32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\msvcrt.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\shlwapi.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\ole32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\oleaut32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\userenv.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\secur32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\winspool.drv" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\mpr.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\imm32.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\msctf.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\lpk.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\System32\usp10.dll" wurde geladen
    "AGO-ENGINE.exe": "C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6000.16386_none_5d07289e07e1d100\comctl32.dll" wurde geladen
    Das Programm "[2504] AGO-ENGINE.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.
    **

    Wieso funktioniert, dass nicht?! 😞



  • Nimm statt PeekMessage() GetMessage()!

    PeekMessage() gibt FALSE zurück, wenn gerade keine Nachrichten da sind und dann beendet sich dein Programm.
    GetMessage() wartet dagegen auf die nächste Nachricht.

    PeekMessage() wird hauptsächlich bei z.B. Spielen benutzt.
    (Dann sieht die Schleife aber auch leicht anders aus)



  • geeky schrieb:

    Nimm statt PeekMessage() GetMessage()!

    PeekMessage() gibt FALSE zurück, wenn gerade keine Nachrichten da sind und dann beendet sich dein Programm.
    GetMessage() wartet dagegen auf die nächste Nachricht.

    PeekMessage() wird hauptsächlich bei z.B. Spielen benutzt.
    (Dann sieht die Schleife aber auch leicht anders aus)

    Ich kenne den Unterschied und habe es auch mit GetMessage versucht. Und dann tritt auch tatsöchlich der Effekt, dass der Debugegr ausgeht nicht auf. Der Debugger läuft also weiter. Ein Fenster bekomme ich aber trotzdem nicht zu sehen 😞



  • Ich habe folgenden Codeteil ein wenig verändert:
    #include <windows.h>
    #include "Vars.h"
    #include "InitMainAppWindow.h"
    #include "GlobalExVar.h"

    HWND CreateAppWindow(HINSTANCE hInst2)
    {
    HWND mah;
     WNDCLASSEX windowclass;
     bool Test;	   
    static TCHAR NAME[]=TEXT("IDMW");
    	    windowclass.cbSize= sizeof(WNDCLASSEX);
    		windowclass.style= CS_HREDRAW|CS_VREDRAW;
    		windowclass.lpfnWndProc=WindowProc;
    		windowclass.cbClsExtra = 0;
    		windowclass.cbWndExtra = 0;
    		windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    		windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    		windowclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
    		windowclass.lpszMenuName=NULL;
    		windowclass.lpszClassName =NAME;
    		RegisterClassEx (&windowclass);
    
    		mah = CreateWindowEx(NULL,
    							NAME,
    							TEXT("NAMEDESFESNTER"),
    							WS_OVERLAPPEDWINDOW,
    							100,100,
    							300,250,
    							NULL,
    							NULL,
    							hInst2,
    							NULL);
    
    		if (mah==NULL)
    		Test=false;
    		if (Test==false)
    			PostQuitMessage(0);
    
    return mah;
    }
    

    Die folgende Stelle ist neu:

    if (mah==NULL)
    Test=false;
    if (Test==false)
    PostQuitMessage(0);

    Das Programm schließt sich, also stimmt etwas mit dem handle nicht. Aber ich komme einfach nciht auf den Fehler! Sieht jemand etwas?
    Hoffe auf vieeeele Antworten 😃



  • Achso und GetMessage benutze ich jetzt auch



  • belege mal noch hInstance aus der WNDCLASSEX-Struktur, also

    ...
            windowclass.cbSize= sizeof(WNDCLASSEX);
            windowclass.style= CS_HREDRAW|CS_VREDRAW;
            windowclass.lpfnWndProc=WindowProc;
            windowclass.cbClsExtra = 0;
            windowclass.cbWndExtra = 0;
            windowclass.hInstance = hInst2;        // <-- den hier :D
            windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
            windowclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
            windowclass.lpszMenuName=NULL;
            windowclass.lpszClassName =NAME;
            RegisterClassEx (&windowclass);
            ...
    


  • Außerdem ist "bool Test" nicht initialisiert (und lt. Murphy immer false).



  • Tengriadon schrieb:

    if (mah==NULL)
        Test=false;
    if (Test==false)
        PostQuitMessage(0);
    

    warum nicht:

    if( !mah ) {
        MessageBox( 0, "beim erstellen des Hauptfensters!", "Fehler...", MB_OK );
        exit( EXIT_FAILURE ); // warum denn in die Message-Loop?
    }
    

    ?

    greetz, Swordfish

    BTW: Solltest Du eben erst mit C/C++ anfangen - so wie es den Anschein hat - dann lass lieber erstmal die Finger von der WinAPI und beschäftige Dich mit der Konsole.



  • Nein ich fange nicht erst mit C++ an. Das da sollte eigentlich nur ein keliner Test werden,deswegen der unsaubere Code. Dann trat aber dieses Problem auf und hier scheint ja auch keiner eine Lösung zu finden oder?



  • Hast du die Überprüfung des Windowhandles korrigiert? Wird das Fenster überhaupt erstellt (Windowhandle != 0)? Hast Du den hInstance member der WNDCLASSEX gesetzt? Mach mal ein memset( &windowclass, 0 sizeof( WNDCLASSEX ) ) nach die deklaration der Struktur.

    greetz, Swordfish



  • Swordfish schrieb:

    Hast du die Überprüfung des Windowhandles korrigiert? Wird das Fenster überhaupt erstellt (Windowhandle != 0)? Hast Du den hInstance member der WNDCLASSEX gesetzt? Mach mal ein memset( &windowclass, 0 sizeof( WNDCLASSEX ) ) nach die deklaration der Struktur.

    greetz, Swordfish

    Das mit der Überprüfung war absicht für den Schrittdurchlauf, aber ich scheine heute ein wenig auf der Leitung zu stehen. Du Hast vollkommen recht ich habe vergessen der HINSTANCE- Membervariable der Struktur einen Wert zuzuweisen!

    VIELEN DANK SWORDFISH!!!!!!!!!! 👍 👍 👍 👍 👍 👍 👍 👍 👍

    Und an alle anderen natürlich auch 😃



  • HWND CreateAppWindow(HINSTANCE hInst2)
    {
     HWND mah;
     WNDCLASSEX windowclass;
     bool Test; // <---------------------------- :open_mouth: 
     static TCHAR NAME[]=TEXT("IDMW");
    
    ...
    
     if (mah==NULL)
         Test=false;
     if (Test==false) // <---------------------- :open_mouth: 
         PostQuitMessage(0);
    }
    


  • Ich glaub', das hat er schon gerafft 😉

    greetz, Swordfish



  • Xen schrieb:

    Du Hast vollkommen recht ich habe vergessen der HINSTANCE- Membervariable der Struktur einen Wert zuzuweisen!

    tut mir leid aber ich komm mir vollkommen verarscht vor 🙄
    vllt. lesen was man dir so schreibt, denn:

    Fake oder Echt schrieb:

    belege mal noch hInstance aus der WNDCLASSEX-Struktur, also

    ...
            windowclass.cbSize= sizeof(WNDCLASSEX);
            windowclass.style= CS_HREDRAW|CS_VREDRAW;
            windowclass.lpfnWndProc=WindowProc;
            windowclass.cbClsExtra = 0;
            windowclass.cbWndExtra = 0;
            windowclass.hInstance = hInst2;        // <-- den hier :D
            windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
            windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
            windowclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;
            windowclass.lpszMenuName=NULL;
            windowclass.lpszClassName =NAME;
            RegisterClassEx (&windowclass);
            ...
    

    und das war schon gestern...naja jedem das seine 😃



  • Nicht aufregen, BitWax, is halt ein Schussel 😃

    greetz, Swordfish


Anmelden zum Antworten