Dialog in WinMain
-
Ich verwende eine WinApi mit MessageHandler, CreateMainWindow, WinMain etc. und möchte einen Dialog, der mehrere Eingabefelder und Checkboxes etc. enthält starten.
Ich habe schon versucht den Dialog als separates Programm zu schreiben und dann mit SendMessage bzw. PostMessage zu kommunizieren aber das war dann doch etwas umständlich.
Ich habe auch versucht eine eigene Klasse für einen internen Dialog zu schreiben aber das war auch nicht das Wahre...Meine Frage:
Wie kann ich MFC zusätzlich verwenden oder gibt es eine andere Möglichkeit? MFC wäre halt kompfortabel mit dem Editor von Visual C++...Wenn es möglich wäre sollte der Dialog auch nicht unten in der Taskleiste angezeigt werden.
Ich möchte deshalb nicht gleich ein MFC-Projekt verwenden, da in dem Programm später noch graphische Darstellungen mit DirectX stattfinden und ich den Dialog nur zur Einstellung der Optionen verwenden möchte (Fullscreen und so)
Hier der Code für das Fenster (da wird eigentlich noch ein Hintergrundbild angezeigt mit Direct3D aber das habe ich jetzt mal rausgenommen weil es mir nicht relevant scheint):
// Headerdateien #include <windows.h> #define SCR_WIDTH 1024 #define SCR_HEIGHT 768 // Anwendungsfenster erzeugen HWND CreateMainWindow(HINSTANCE hInstance); // Callback Funktion zur Nachrichtenbehandlung LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); // Das Fensterhandle HWND hWnd = 0; int MouseX, MouseY; bool MouseLeft, MouseRight; // Windows main-Funktion int WINAPI WinMain(HINSTANCE hInstance, // Handle der Programminstanz HINSTANCE hPrevInstance, // Handle der letzten Instanz LPSTR lpCmdLine, // Kommandozeile int nCmdShow) // Art wie das Fenster angezeigt werden soll { // Fenster erzeugen und Handle speichern hWnd = CreateMainWindow(hInstance); // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten if(0 == hWnd) { MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK); return -1; } // Struktur, in der Informationen zur Nachricht gespeichert werden MSG msg = { 0 }; while(msg.message != WM_QUIT) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { } } //CleanUpDirectInput(); // Rückgabewert an Windows return 0; } // Fenster erzeugen HWND CreateMainWindow(HINSTANCE hInstance) { WNDCLASSEX wndClass = { sizeof(WNDCLASSEX), // Größe angeben CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile MessageHandler, // Callback-Funktion 0, // Zusätzliche Angaben 0, // nicht benötigt hInstance, // Anwendungsinstanz LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo LoadCursor(NULL, IDC_ARROW), // Normaler Cursor (HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel NULL, // kein Menü "WindowClass", // Der Name der Klasse LoadIcon(NULL, IDI_WINLOGO) // Windows Logo }; // Klasse registrieren RegisterClassEx(&wndClass); return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen "WindowClass", // Klassenname "Annocus", // Fenstertitel WS_SYSMENU | // Fenster WS_MINIMIZEBOX | // - WS_VISIBLE, // Eigenschaften 0, 0, // Anfangsposition SCR_WIDTH+8, SCR_HEIGHT+34, // und Größe des Fensters NULL, // Handle des Elternfensters NULL, // Handle des Menüs hInstance, // Anwendungsinstanz NULL); // wird nicht benötigt } // Diese Funktion wird von Windows aufgrufen, wenn // eine Nachricht für Ihr Programm vorliegt LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // testen, um welche Nachricht es sich handelt switch(msg) { case WM_LBUTTONDOWN: MouseLeft = true; return 0; break; case WM_LBUTTONUP: MouseLeft = false; return 0; break; // die linke Maustaste wurde gedrückt case WM_RBUTTONDOWN: MouseRight = true; return 0; break; // die rechte Maustaste wurde gedrückt case WM_RBUTTONUP: MouseRight = false; return 0; break; // die Maus wurde bewegt case WM_MOUSEMOVE: MouseX = LOWORD(lParam); MouseY = HIWORD(lParam); return 0; break; // Programm beenden, wenn das Fenster // geschlossen wird case WM_DESTROY: PostQuitMessage(0); return 0; break; case WM_KEYDOWN: switch(wParam) { // Wenn ESC gedrückt, Programm beenden case VK_ESCAPE: DestroyWindow(hWnd); break; } break; } // Standardnachrichtenverarbeitung von Windows return DefWindowProc(hwnd, msg, wParam, lParam); }
Ich verwende MS Visual Studio 6.0 unter Windows XP.
Vielen Dank im Voraus!
-
Es bringt dir kaum etwas, MFC zusätzlich zu verwenden. MFC hilft dir halt, einen Dialog schnell zusammenzuklicken und bringt Windows-Funktionen in Klassen.
Aber du kannst auch so (mit reiner WinApi) einen Dialog erstellen. Du könntest in einem Test-Projekt dir deinen Dialog zusammenklicken. Dabei wird in die Resourcen-Datei der Dialog reingeschrieben. Diese Zeilen kannst du dir kopieren und in die Resourcen-Datei in deinem aktuellen Projekt einfügen (evtl. Resourcen-Datei erstellen). Musst dann halt noch Konstanten (IDs) definieren, aber sollte ja kein Problem sein.
Den Dialog dann mit CreateDialog oder DialogBox erstellen.Wenn der Dialog nicht in der Taskleiste angezeigt werden soll, musst du als ExStyle WS_EX_TOOLWINDOW angeben.
-
Umständlich. Ich habe früher meine Dialog-Ressourcen für meine Delphi Programme nur mit dem Ressourcen-Editor von VC gemacht. Erstell ein Ressourcen-Script, kompiliere es zu einer Ressource und binde diese in deinem Quellcode ein.
-
Naja, wenn du die fertige Ressource einbindest, kannst du sie nicht mehr schnell verändern. Wenn du nur den Ressourcen-Code hast, kannst du schnell mal nen Button um 1 oder 2 Einheiten nach rechts verschieben. Ebenso kannst du eben mal ein Element hinzufügen/entfernen oder den Stil verändern.
Aber wenn man weiß, dass der Dialog so fertig ist, ist es sicherlich die einfacherere Methode.
-
Vielen Dank für eure Antworten!
Also ich beschreibe mal was ich gemacht habe:
Dem Projekt ein Ressourcenscript und
eine Ressourcenvorlage hinzugefügt, diesem wiederum einen Dialog.welche Datei muß ich jetzt inkludieren zu meinem ursprünglichen Script (s.o.)?
MfG
-
Wahrscheinlich gibts jetzt ne resource.h
Lies doch mal n tutorials
-
Gast91 schrieb:
Vielen Dank für eure Antworten!
Also ich beschreibe mal was ich gemacht habe:
Dem Projekt ein Ressourcenscript und
eine Ressourcenvorlage hinzugefügt, diesem wiederum einen Dialog.welche Datei muß ich jetzt inkludieren zu meinem ursprünglichen Script (s.o.)?
MfG
Du musst 'resource.h' inkludieren und Script.rc in dein Projekt einbinden.
-
Ich hab ja schon gegoolt aber nix zu diesem Thema gefunden...
Ja es gibt eine ressource.h Datei:
//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by AnnocusDlg.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
Die kann ich auch inkludieren und dann kompilieren aber der Dialog startet nicht.
Wie binde ich denn die .rc ein?MfG
-
Gast91 schrieb:
Wie binde ich denn die .rc ein?
Projekt->Dem Projekt hinzufügen->Datei...->[Datei auswählen und mit OK bestätigen]
-
Ja das habe ich gemacht.
Wie starte ich jetzt das Dialogfenster?
-
DialogBox...Aber hast du auch das WS_VISIBLE Flag gesetzt ?
-
Ist es da nicht einfacher eine MFC-Anwendung zu schreiben und dann mein Script hinzuzufügen?
-
Gast91 schrieb:
Ist es da nicht einfacher eine MFC-Anwendung zu schreiben und dann mein Script hinzuzufügen?
MFC und WinAPI vertragen sich nicht sehr gut, nein.
-
CodeFinder schrieb:
MFC und WinAPI vertragen sich nicht sehr gut, nein.
Warum sollen die sich nicht vertragen? MFC ist nichts anderes als ein WinAPI Wrapper...
-
Jochen Kalmbach schrieb:
CodeFinder schrieb:
MFC und WinAPI vertragen sich nicht sehr gut, nein.
Warum sollen die sich nicht vertragen? MFC ist nichts anderes als ein WinAPI Wrapper...
fatal error C1189: #Fehler : WINDOWS.H already included. MFC apps must not #include <windows.h>
Ist wohl nicht vorgesehen (außerdem: mit vertragen meinte ich ja auch nicht unmöglich)
.
-
CodeFinder schrieb:
fatal error C1189: #Fehler : WINDOWS.H already included. MFC apps must not #include <windows.h>
Die MFC included selbst windows.h... man soll es halt nicht vor dem afx.h machen (aus irgendwelchen "#define" Gründen)...