Fenster wird nicht dargestellt

Rene42

Erfahrenes Mitglied
Hi,

im Moment mache ich ein Tut zur Windows API. Das Tut scheint beliebt zu sein. Ich bin im zweiten Kapitel und hab ein Problem (ja jetzt schon):

Der Quelltext lässt sich super compilen und ausführen. Laut Taskmanager arbeitet die exe dann auch aber das Fenster wird nicht gezeichnet.

PHP:
#define STRICT

#include <windows.h>

//Schon einmal die Funktion definieren, die später Ereignisse im Windowsfenster bearbeitet
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//Den Namen des Fensters speichern
const char szAppName[] = "Ein eigenes Fenster";

//Wieder die WinMain Funktion verwenden
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   PSTR szCmdLine, int iCmdShow)
{
 HWND       hWnd;                   
 //Die Instanz der Fensterklasse
 WNDCLASS wc;                   
 //Variabel fängt Ereignisse ab
 MSG msg;

 //Keinen Extraspeicher reservieren
 wc.cbClsExtra    =  0;
 wc.cbWndExtra    =  0;

 //Damit das Programm auch diese Fenster verwendet 
 wc.hInstance     =  hInstance;
 //Bestimmt wie der Cursor aussieht, bei NULL wird kein Cursor gezeigt
 wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
 //Bestimmt das Icon
 wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
 //definiert die Farbe des Hintergrunds
 wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
 //Hier den Namen des Fensters festlegen
 wc.lpszClassName =  szAppName;
 //Kein Menü, später kann hier ausgeählt werden welches Menü das Fenster bekommt
 wc.lpszMenuName  =  NULL;
 //Die Classe registrieren
 RegisterClass(&wc);
 //Hier wird das Window erst richtig erzeugt
 hWnd = CreateWindow(szAppName,                // Name des Fensters
                       "Titelleiste",          // Titel des Fensters
                       WS_OVERLAPPEDWINDOW,
                       CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                       CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                       CW_USEDEFAULT,          /* Fensterbreite              */
                       CW_USEDEFAULT,          /* Fensterhoehe               */
                       NULL,
                       NULL,
                       hInstance,              //Richtige Instanz wählen
                       NULL);
 //Zeigt das Fenster an                      
 ShowWindow(hWnd, iCmdShow);
 //Zeichnet das Fenster neu
 UpdateWindow(hWnd);       
 //Bearbeite hier nun die Nachrichten
 while (GetMessage(&msg, NULL, 0, 0))
   {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
   }   
      return msg.wParam;             
}

//Jetzt wird ResultBack definiert
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)
   { 
    case WM_DESTROY:
      {
         PostQuitMessage(0);
         return 0;
      }
         return DefWindowProc(hWnd, message, wParam, lParam);
   }
}

Rene42
 
dein Fenster kann so nicht registriert werden:
so kannst du dies auch nochmal selbst bei dir überprüfen:
Code:
if (!RegisterClass (&wc))
 {
	MessageBox (NULL, TEXT ("Can't register Window-Class"), 
	szAppName, MB_ICONERROR) ;
	return 0 ;
 }
 
so ich will mal nicht so sein also hier:
PHP:
#include <windows.h>


LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;



int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{

 static TCHAR szAppName[] = TEXT ("Ein eigenes Fenster") ;//Window class name 	
	
 HWND       hWnd;                   
 //Die Instanz der Fensterklasse
 WNDCLASS wc;                   
 //Variabel fängt Ereignisse ab
 MSG msg;

 wc.style = CS_HREDRAW | CS_VREDRAW ;
 wc.lpfnWndProc = WndProc ;

 //Keinen Extraspeicher reservieren
 wc.cbClsExtra    =  0;
 wc.cbWndExtra    =  0;

 //Damit das Programm auch diese Fenster verwendet 
 wc.hInstance     =  hInstance;
 //Bestimmt wie der Cursor aussieht, bei NULL wird kein Cursor gezeigt
 wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
 //Bestimmt das Icon
 wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
 //definiert die Farbe des Hintergrunds
 wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
 //Hier den Namen des Fensters festlegen
 wc.lpszClassName =  szAppName;
 //Kein Menü, später kann hier ausgeählt werden welches Menü das Fenster bekommt
 wc.lpszMenuName  =  NULL;
 //Die Classe registrieren

 if (!RegisterClass (&wc))
 {
	MessageBox (NULL, TEXT ("Can't register Window-Class"), 
	szAppName, MB_ICONERROR) ;
	return 0 ;
 }
 //Hier wird das Window erst richtig erzeugt
    hWnd = CreateWindow (szAppName, // window class name
    TEXT ("uuuuuuuuuuuuuuund?"), // window caption
    WS_OVERLAPPEDWINDOW,// window style
    CW_USEDEFAULT,// initial x position
    CW_USEDEFAULT,// initial y position
    CW_USEDEFAULT,// initial x size
    CW_USEDEFAULT,// initial y size
    NULL,// parent window handle
    NULL,// window menu handle
    hInstance, // program instance handle
    NULL) ;// creation parameters*/


    ShowWindow (hWnd, iCmdShow) ;
    UpdateWindow (hWnd) ;
    while (GetMessage (&msg, NULL, 0, 0))				//The Message Loop


        {
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }

    return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{    	 	
    switch (message)
    {
  
        case WM_DESTROY:
        PostQuitMessage (0) ;
        return 0 ;
    }

    return DefWindowProc (hwnd, message, wParam, lParam) ;
}

dir fehlern folgenden Zeilen :
Code:
wc.style = CS_HREDRAW | CS_VREDRAW ;
 wc.lpfnWndProc = WndProc ;

unerlässlich
 
ja das eine schon abe der rest?! dann machn Vorschlag wie ist richtig oder warum blablabla
ach und du hast recht hab kp was die zwei Zeilen bewirken und ob man sie braucht aber erst funktioniert damit!
 
Was bitte ist hier schwachsinn..., kp ;-)

Hab bei meinem Code nun den Abschnitt:

PHP:
 if (!RegisterClass (&wc))
 {
    MessageBox (NULL, TEXT ("Can't register Window-Class"), 
    szAppName, MB_ICONERROR) ;
    return 0 ;
 }
eingefügt.

Es passiert nun folgendes. Das Fenster wird in der Taskleiste angezeigt, aber nicht auf dem Monitor. Im Taskmanager ist die exe zu finden und auch nur dort zu beenden. Es deutet auf eine Endlosschleife hin. Aber als Schleife kann ich nur die Messageloop sehen, die ja bei uns beiden gleich ist.

Natürlich könnte ich einfach deinen Code kopieren, aber ich würde ganz gerne verstehen warum es bei mir nicht geht.

Rene42
 
Zuletzt bearbeitet:
Nun die Zeile mit der MsgProc ist schon korrekt, die muss dazu. Aber die Class Styles müssen nicht so sein :D http://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx evtl. einfach mal komplett durchlesen UND verstehen ;)
So und dann mal noch warum hier 0 durchaus korrekt ist: http://www.catch22.net/tuts/flicker

C++:
MSG msg = {0};

WNDCLASS wc = {0};
wc.lpfnWndProc = WndProc ;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName =  TEXT("MyWindow");
u.
C++:
hWnd = CreateWindow (TEXT("MyWindow"),
 
Zurück