Erstes Programmfenster mit Visual Studio Editor gestalten?
-
Hallo,
ist wahrscheinlich ne sau blöde Frage aber ich hab noch nirgendwo eine
Antwort darauf gefunden.Ich möchte ähnlich wie bei Windows Forms ein WinApi-Programm erstellen,
dass nur ein einziges Fenster besitzt und das ich mit dem Editor von Visual Studio
gestalten möchte.Also ohne Menüleiste oder ähnlichem nur ein Fenster mit Schließen-Button und
von mir im Editor definiertem Inhalt.Geht das?
Habe leider nicht soviel Ahnung von WinApi versuch mich gerade einzuarbeiten,
komme aber ziemlich langsam voran.Gruß und vielen Dank
aistudy
-
Vorraussetzung: min. VS200x Standard-Edition. Dann einfach eine neue MFC-Applikation erzeugen und dort eine "Dialog-Anwendung" machen.
Ohne MFC wird es etwas komplexer, da VC200xEE kein Resource-Editor hat und Du dann alles von Hand machen musst.... oder verwendest wxWidget...
-
-
Er wollte eine Dialog, kein leeres Fenster...
-
kein Problem

BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: return 0; case WM_CLOSE: EndDialog(hwnd, 0); return TRUE; case WM_COMMAND: switch(wParam) { case IDOK: EndDialog(hwnd, 0); return 0; } return 0; } return 0; } // aufruf in der winmain void AboutDlg(HWND hwndParent) { DialogBox(GetModuleHandle(0), MAKEINTRESOURCE(IDD_DIALOG), hwndParent, AboutDlgProc); }EDIT:
Eine dialog Ressource muss erstelt werden mit der bezeichnung IDD_DIALOG
-
Vielen Dank für die Antworten.
Hätte vielleicht sagen sollen ich arbeite mit VS2005.^^@Ramsis:
Mit deinem Vorschlag funktionierts, jedoch habe ich kein ParentWindow, reicht es
wenn ich den Dialog folgendermaßen aufrufe?DialogBox(GetModuleHandle(0), MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About);
Meine Main sieht jetzt so aus:
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Hier Code einfügen. MSG msg; HACCEL hAccelTable; // Globale Zeichenfolgen initialisieren LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_SPURMESSGERT_RCAD_1520, szWindowClass, MAX_LOADSTRING); DialogBox(GetModuleHandle(0), MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About); // Hauptmeldungsschleife: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; }Der Dialog wird auch aufgerufen.
Kann es zu Problemen beim Messagehandling ohne ParentWindow kommen?gruß
aistudy
-
Die Schleife:
// Hauptmeldungsschleife: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }kannst Du weglassen... "DialogBox" hat eine eigene Schleife...
Und warum verwendest Du plötzlich als "hInstance" von "DialogBox" was ganz komisches?
-
Also kann ich eigentlich die komplette Fensterprozedur mit erstellen einer
Fensterklasse etc alles weglassen und einfach nur einen Dialog aufrufen den ich
vorher schon beschireben haben?Gibt es schwierigkeiten wenn ich von diesem Dialog aus weitere Dialoge aufrufe
oder kann ich das ohne weiteres machen?Vielen Dank
-
Ja, Du brauchst eigentlich nur DialogBox. Und natürlich kannst Du weitere Dialoge dann aufrufen...
-
Danke für die schnelle Hilfe.
Dann werde ich das ganze über Dialogaufrufe machen.Gruß
aistudy
-
Eine Frage habe ich doch noch.
Welche Vorteile bringt eine Fensterdeklaration mit CreateWindow gegenüber
einem Dialog?
-
Beides hat vor- und Nachteile. Einen Dialog kannst Du mit einem Ressourcen-Editor per Mausklick zusammenstellen und weißt dann, wie er aussieht. Für Feinarbeiten mußt du Dich aber mit dem Ressourcen-Script auskennen.
Ein Fenster muß halt vorher registriert werden und bekommt einen haufen Parameter. Ist mehr Tiparbeit (und damit mehr Fehlerquellen), aber flexibler in der Gestaltung. CreateWindow wird übrigens nicht nur für Fenster, sondern auch für Toolbars, andere Dialogboxen, Buttons u. ä. gebraucht.
-
Ok Danke