Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.01.2008, 16:37

[C++] Win32 MDI Fenster wird nicht erzeugt

Hi,

ich habe ein kleines Problem welches ich leider nicht lösen kann.
Folgende Methode soll ein MDI Fenster erzeugen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void DESKTOP_PANEL::add_mdi_window ( unsigned int size_x, unsigned int size_y, unsigned int pos_x, unsigned int pos_y, std::wstring titel, LRESULT CALLBACK mdi_proc ( HWND wnd, UINT message, WPARAM wparam, LPARAM lparam ) )
{

    HINSTANCE instance = reinterpret_cast < HINSTANCE > ( GetWindowLongW ( _parent,GWL_HINSTANCE ) );
    WNDCLASSW wndclass;
    std::wstring class_name = L"TMP";

    ZeroMemory ( &wndclass, sizeof ( WNDCLASSW ) );

    wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc   = mdi_proc;
    wndclass.cbClsExtra    = NULL;
    wndclass.cbWndExtra    = NULL;
    wndclass.hInstance     = instance;
    wndclass.hIcon         = LoadIconW ( 0, IDI_APPLICATION );
    wndclass.hCursor       = LoadCursor ( 0, IDC_ARROW       );
    wndclass.hbrBackground = reinterpret_cast < HBRUSH > ( 16 );
    wndclass.lpszClassName  = class_name.c_str ( );

    if ( !RegisterClassW ( &wndclass ) )
        MessageBoxW ( _parent, L"COUDLN'T REGISTER CLASS", L"ERROR", MB_OK );

    _mdicreate.szClass = class_name.c_str ( );
    _mdicreate.szTitle = titel.c_str ( );
    _mdicreate.hOwner  = instance;
    _mdicreate.x       = pos_x;
    _mdicreate.y       = pos_y;
    _mdicreate.cx      = size_x;
    _mdicreate.cy      = size_y;
    _mdicreate.style   = NULL;
    _mdicreate.lParam  = NULL;
    
    _mdi = ( HWND ) SendMessageW ( _client, WM_MDICREATE, 0, ( LPARAM )( LPMDICREATESTRUCT ) &_mdicreate );

    if ( !IsWindow( _mdi ) )
    {
        ErrorExit(L"Add MDI Window");
    }
}


Die Funktion ErrorExit fragt den letzten Fehler ab und gibt ihn aus. ErrorExit gibt in diesem Fall aus, dass das System die angegebene Datei nicht finden kann. Das ergbit für mich keinen Sinn.
Weiß jemand warum das MDI Fenster nicht richti erzeugt/angezeigt wird sondern ein solcher Fehler auftritt?

Bin für jede Hilfe dankbar
TheProgrammer
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

2

13.01.2008, 11:44

Hier mal der Code von ErrorExit, die Funktion die mir den Fehler ausgibt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void ErrorExit(LPTSTR lpszFunction) 
{ 
    wchar_t szBuf[80]; 
    LPVOID lpMsgBuf; 
    DWORD dw = GetLastError(); 

    FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM, 
        NULL, 
        dw, 
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
        (LPTSTR) &lpMsgBuf, 
        0, NULL ); 

        wsprintf(szBuf, L"%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf); 

    MessageBoxW(NULL, szBuf, L"Error", MB_OK); 

    LocalFree(lpMsgBuf); 
    ExitProcess(dw); 
}
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

3

14.01.2008, 07:08

Wichtig: GetLastError gibt immer irgendwas zurück. Das muss nicht zwangsläufig ein Fehler sein, der aus dem letzten WinAPI Aufruf stammt. Wenn dieser erfolgreich war, kann der Fehler schon älter sein. Es ist nicht genau definiert, wie eine Funktion mit dem Fehlercode verfährt, wenn sie erfolgreich ist. Referenz: GetLastError - Return Code

Was mir auch noch aufgefallen ist: der Fehlercode wird für deinen Fall eher aus dem SendMessageW Aufruf stammen als aus der Behandlung der WM_MDICREATE Message, für die gar nicht Dokumentiert ist, ob die Standardimplementation einen Fehlercode liefert. Aber selbst in diesem Fall macht er dann nicht viel Sinn.

Ich bin mir auch nicht sicher, ob man die Behandlung der WM_MDICREATE Message nicht auch selbst implementieren muss, damit auch wirklich ein Fenster erzeugt wird... es gibt ja CreateMDIWindow. Oder du hast vergessen, diese Meldung an den Windows Standardhandler DefWindowProc weiterzuleiten.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

4

14.01.2008, 19:57

Zitat

Wichtig: GetLastError gibt immer irgendwas zurück. Das muss nicht zwangsläufig ein Fehler sein, der aus dem letzten WinAPI Aufruf stammt. Wenn dieser erfolgreich war, kann der Fehler schon älter sein. Es ist nicht genau definiert, wie eine Funktion mit dem Fehlercode verfährt, wenn sie erfolgreich ist. Referenz: GetLastError - Return Code


Danke für den hinweis. Aber es gibt eine ganz einfache Möglichkeit rauszufinden ob der Fehler schon vorher auftritt oder wirklich erst in der Funktion add_mdi_window.
EInfach am Anfang und am Ende der Funktion abfragen. Am Anfang war kein Fehler und am Ende schon. Also muss sie hierraus stammen!

Zitat

Ich bin mir auch nicht sicher, ob man die Behandlung der WM_MDICREATE Message nicht auch selbst implementieren muss, damit auch wirklich ein Fenster erzeugt wird... es gibt ja CreateMDIWindow. Oder du hast vergessen, diese Meldung an den Windows Standardhandler DefWindowProc weiterzuleiten..


Ne muss man nicht-
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

Werbeanzeige