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 SieGetLastError()
- 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schließen Sie den oberen Teil des Codes in
{ }
und sagen Sie uns, was passiert.Müssen Sie zum ändern der
WM_COMMAND
code wie folgt:Da Sie gebeten haben, eine kleine demo-Anwendung, um zu demonstrieren, Schaffung eines dialogs auf die Schaltfläche klicken Sie, hier ist der code, den Sie kopieren/einfügen auf den leeren
.cpp
- Datei. Erstellen Sie einfach Ihre eigenen Dialogfeld in.rc
editor:BEARBEITEN-NEU: CODE FÜR RESSOURCE-DATEIEN:
Resource.h
:.rc
Datei:CreateDialog
ist nicht richtig-vorbeiHWND
als ersten parameter stattHINSTANCE
-vergleichen Sie meine code-Schnipsel mit Ihnen.HWND aDiag = CreateDialog((HINSTANCE) GetWindowLong(hwnd, GWL_INSTANCE), MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) AboutDlgProc);
zuHWND aDiag = CreateDialog((HINSTANCE) GetWindowLong(hwnd, GWL_INSTANCE), MAKEINTRESOURCE(IDD_DIALOG1), hwnd, (DLGPROC) AboutDlgProc);
und melden Sie Ihr Ergebnis. Sie übergebenNULL
als parameter für parent-Fenster. Beste Grüße.HWND
von Ihrem Dialogfeld, und ändern Sie die message-loop-vergessen Sie nicht, dass die Globale variableNULL
im Dialogfeld, dasWM_CLOSE
undIDCANCEL
handler ). Beste Grüße.WM_COMMAND
nach seinen Anweisungen. Nur wenn das fehlschlägt versuchen, mein Ansatz. Beste Grüße.IsDialogMessage
nur wichtig für den Umgang mit Navigations-Tasten (in der Regel: Tab, Up, Down, Enter...) Eine fehlende IsDialogMessage nicht erklären, wird ein Dialogfeld nicht angezeigt}break;
in seinemWM_COMMAND
handler. Beste Grüße..rc
- Datei und ein Dialogfeld auf, in es. Bitte melden Sie Ihre Ergebnisse. Viel Glück. Beste Grüße..rc
undresource.h
- Dateien..rc
- Datei, die das problem macht. Eine Letzte Aufgabe, dass könnte dein problem lösen: Überprüfen Sie mit der ID-Wert vonLAUNCH_CONSOLE
undID_FILE_EXIT
und mir sagen, ob Sie identisch sind. Wenn Sie sind, dann ist es das problem, das wir suchen. Beste Grüße.Den "main"
WM_COMMAND
Verarbeitung ist falsch, es gibt keine Pause am Ende den Schalter.So, wenn eine
WM_COMMAND
verarbeitet wird wederID_FILE_EXIT
oderLAUNCH_CONSOLE
imLOWORD(wParam)
, dieWM_CLOSE
code ausgeführt wird.verwenden:
EDIT: Wie sehen das Ergebnis
GetLastError
break
. Sie sagte: "Das Haupt-Fenster schließt sich nach dem Klick auf die Schaltfläche "testen"." und die fehlende Pause erklärt er. Hat Ihr Haupt-windows immer noch verschwinden mit der Pause Hinzugefügt?