Windows-API-CreateDialog: nicht-modales Dialog einfach nicht angezeigt

Ich kann wirklich nicht herausfinden, wie, um ein nicht modales Dialogfeld auch nach googeln ausgiebig.
Was ich will zu tun ist, um Auslöser in einem Dialogfeld durch drücken einer Taste auf Hauptfenster.

(So lassen Sie mich das ganze Zeug hier. Ich habe nicht das ganze Zeug vor damit es nicht zu chaotisch zu Lesen.)

Mein code ist wie folgt:

#include "main.h"
#include "resource.h"
 #include <tchar.h>

INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
    case WM_INITDIALOG:
    return TRUE;
    break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case IDOK:
                EndDialog(hwnd, IDOK);
            break;
            case IDCANCEL:
                EndDialog(hwnd, IDCANCEL);
            break;
        }
    break;
    default:
        return FALSE;
}
return TRUE;
}

LRESULT CALLBACK MainWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case ID_FILE_EXIT:
        SendMessage(hwnd, WM_CLOSE, NULL, NULL);
        break;
    case LAUNCH_CONSOLE:
        HWND aDiag = CreateDialog((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDD_DIALOG1), hwnd, (DLGPROC) AboutDlgProc);
        if(aDiag == NULL)
    {
        MessageBox(hwnd, TEXT("Error"), TEXT("Error"), MB_OK);
        DWORD dwLE = GetLastError();
        TCHAR szLE[16];
        _ltoa_s(dwLE, szLE, 10 );
        MessageBox(hwnd, szLE, TEXT("Error"), MB_OK); 
    }
        ShowWindow(aDiag, SW_SHOW);
        break;
    }
    break;
case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS mainWindowClass = {};
mainWindowClass.style = CS_HREDRAW | CS_VREDRAW;
mainWindowClass.lpfnWndProc = MainWinProc;
mainWindowClass.hInstance = hInstance;
mainWindowClass.hbrBackground = (HBRUSH) COLOR_WINDOW;
mainWindowClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
mainWindowClass.lpszClassName = TEXT("MainWindow");

RegisterClass(&mainWindowClass);
LONG units = GetDialogBaseUnits();
HWND aWindow = CreateWindow(TEXT("MainWindow"), TEXT("Briancheung"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
HWND aButton = CreateWindow("BUTTON", TEXT("Try"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 100, 100, 50, 50, aWindow, (HMENU) LAUNCH_CONSOLE, hInstance, NULL);
ShowWindow(aWindow, SW_NORMAL);
MSG aMsg = {};
while(GetMessage(&aMsg, NULL, 0, 0))
{
    TranslateMessage(&aMsg);
    DispatchMessage(&aMsg);
}

return 0;
}

Meine Ressource Vorlage ist VS2012 generiert:

//Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
//Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
//Chinese (Simplified, PRC) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
//TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
"resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END

3 TEXTINCLUDE 
BEGIN
"\r\n"
"\0"
END

#endif    //APSTUDIO_INVOKED

#endif    //Chinese (Simplified, PRC) resources
/////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
//Chinese (Traditional, Hong Kong S.A.R.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ZHH)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_HONGKONG

/////////////////////////////////////////////////////////////////////////////
//
//Menu
//

IDR_MENU1 MENU
BEGIN
POPUP "File"
BEGIN
    MENUITEM "New",                         ID_FILE_NEW40001
    MENUITEM "Open",                        ID_FILE_OPEN40002
    MENUITEM SEPARATOR
    MENUITEM "Save",                        ID_FILE_SAVE40003
    MENUITEM "Save As",                     ID_FILE_SAVEAS
    MENUITEM SEPARATOR
    MENUITEM "Exit",                        ID_FILE_EXIT
END
POPUP "View"
BEGIN
    MENUITEM "Properties",                  ID_VIEW_PROPERTIES
END
POPUP "Help"
BEGIN
    MENUITEM "About",                       ID_HELP_ABOUT
END
END


/////////////////////////////////////////////////////////////////////////////
//
//Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 309, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON   "OK",IDOK,198,69,50,14
PUSHBUTTON      "Cancel",IDCANCEL,252,69,50,14
CONTROL         "",IDC_OCX1,"{6BF52A52-394A-11D3-B153-00C04F79FAA6}",WS_TABSTOP,23,24,259,25
END


/////////////////////////////////////////////////////////////////////////////
//
//DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DIALOG1, DIALOG
BEGIN
    LEFTMARGIN, 7
    RIGHTMARGIN, 302
    TOPMARGIN, 7
    BOTTOMMARGIN, 83
END
END
#endif    //APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
//Dialog Info
//

IDD_DIALOG1 DLGINIT
BEGIN
IDC_OCX1, 0x376, 166, 0
0x0000, 0x0000, 0x0300, 0x0000, 0x0008, 0x0000, 0x0000, 0x0005, 0x0000, 
0x0000, 0x0000, 0x3ff0, 0x0003, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 
0x0000, 0x0000, 0x0008, 0x0002, 0x0000, 0x0000, 0x0003, 0x0001, 0x0000, 
0x000b, 0xffff, 0x0003, 0x0000, 0x0000, 0x000b, 0xffff, 0x0008, 0x0002, 
0x0000, 0x0000, 0x0003, 0x0032, 0x0000, 0x000b, 0x0000, 0x0008, 0x000a, 
0x0000, 0x0066, 0x0075, 0x006c, 0x006c, 0x0000, 0x000b, 0x0000, 0x000b, 
0x0000, 0x000b, 0xffff, 0x000b, 0xffff, 0x000b, 0x0000, 0x0008, 0x0002, 
0x0000, 0x0000, 0x0008, 0x0002, 0x0000, 0x0000, 0x0008, 0x0002, 0x0000, 
0x0000, 0x0008, 0x0002, 0x0000, 0x0000, 0x000b, 0x0000, 0x2834, 0x0000, 
0x043d, 0x0000, 
0
END

#endif    //Chinese (Traditional, Hong Kong S.A.R.) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
//Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    //not APSTUDIO_INVOKED

Alles scheint okay zu sein. Das Programm wird kompiliert. GetLastError ist 0. Aber der dialog eben nicht anzeigen. Das Haupt-Fenster schließt sich nach dem Klick auf die Schaltfläche "testen".

Wirklich danke für deinen Kommentar und die Hilfe. Ich habe selten Fragen hier, weil die meisten Probleme können gelöst werden, durch Googeln und basteln. Aber dieses ist wirklich schwer. Ich glaube, es sollte sehr einfach sein, da macht ein dialog ist einer der grundlegendsten Dinge in der GUI.

Meine Programmier-Erfahrung konzentriert sich vor allem auf Java zuvor. Ich will zu lamentieren, dass Windows C ist viel schwieriger, da es scheint, dass nicht viel Warnung kommt vom compiler oder IDE.

  • Wenn Sie denken, Sie haben alles OK, nur starten Spy++ - Werkzeug und finden Sie Ihren Fenster stehen. Sie werden insbesondere sehen, ob es sichtbar ist oder nicht. Wenn es sichtbar und befindet sich außerhalb des desktop, zum Beispiel. Sie haben Werkzeuge, um diese zu überprüfen out.
  • Warum haben Sie es versäumt, um Fehler zu überprüfen? Aufruf GetLastError ist nicht Fehler zu überprüfen. Sie müssen überprüfen, die Werte zurückgeben. Wo ist die message loop?
  • Danke für den Kommentar. Das Haupt-Fenster schließt sich einfach nach Klick auf die Schaltfläche. Und ich kann wirklich nicht sehen, keine dialog-box.
  • Sie haben noch keine Fehlerprüfung auf alle. Und Ihre Nachricht Schleife ist falsch. Lesen Sie die Dokumentation für CreateDialog.
  • Testen, ob aDiag NULL ist, und wenn ja, rufen Sie GetLastError()
  • Ich änderte den code um den Fehler zu überprüfen. aDiag NULL ist, aber GetLastError messagebox zeigt N-TEN. Danke.
  • Sie wirklich brauchen, mehr Fehler zu überprüfen als die. Sie tun müssen, fixieren Sie Ihre message-loop. Ich denke, manuell hat die Antwort, wie es geschieht. Sie müssen auch lernen, wie zu Debuggen. Der nächste Schritt für Sie ist, zu lernen, debugging-Fähigkeiten.
  • Habe meine Antwort das problem behoben?
  • Vielen Dank für die Antwort. Der Fehler weiterhin besteht. Ich glaube, dass, wenn die Pause ist wichtig, meine VS2012 sollte mich warnen, dass wenn ich kompilieren. Aber kein compiler der Beschwerde. Danke für Ihre Antwort.
  • Veröffentlichen Sie keine ungültigen code. Poste den code, den Sie kompilieren. Es ist eine fehlende } im MainWinProc.
  • Vielen Dank für erinnerte mich daran, dass. Lassen Sie mich erneut nach meinen code.
  • Sie nicht umschließen HWND aDialog = .. mit { }-bitte siehe meine bearbeitete Antwort. Versuchen Sie es und Bericht über die Ergebnisse.
  • Habe versucht deinen code. Noch kein Dialogfeld. Sehr frustriert. Ich kann spielen mit JavaFX den Kopf, während ich verzetteln durch ein Dialogfeld in Windows C!
  • Ihre Letzte chance ist das hochladen ein demo-Projekt für uns irgendwo, um es zu sehen. Ich kann wirklich nicht sehen, warum es nicht funktioniert-wir "bedeckt alle Basen". Hoffentlich finden Sie die Zeit und der Wille, dies zu tun. Beste Grüße.
  • Ich wage zu Fragen, wenn jemand kann mir zeigen, fertigen code für ein Fenster, welches ein nicht-modales dialog durch drücken einer Taste. Ich googeln eine Menge, aber die Beispiele sind nicht sehr hilfreich.
  • Fertigen/funktionierenden code für das zeigen eine nicht modale Dialogfeld wird nicht sehr Verschieden von dem, was Sie haben (modulo der message-Pumpe-Schleife)
  • Nur eine kleine Bemerkung, die Sie verwenden sollten _ltot_s statt _ltoa_s, sonst kann der code nicht kompilieren im Unicode-Modus.

InformationsquelleAutor Cheung Brian | 2014-01-17
Schreibe einen Kommentar