winmain soll auf das ende des dialogs warten=wie stell ich des an?
-
Ahoi leutz!
hab hier eine einfache vollnoob-frage, ist bestimmt total billig, hab aber 0 plan, wie ich des problemchen mit richtigen fachwörtern umschreibe, damit ich mit der suche weiterkomme... :p
also, es geht um folgendes: hab ne stinknormale winapi-winmain, da ist n bisschen code drin, nichts spektakuläres, aber zwischendurch erstelle ich ein dialog, und das, was im dialog abgefragt wird, ist für den nachfolgenden code sehr wichtig.
Blöderweise wird zuerst mehr oder weniger der ganze code der winapi ausgeführt, und es geht mit der nachrichtenschleife los. Dialogfenster erscheint halbe stunde später, wenn die anwendung nach einer fehlermeldung bereits qualvoll verstorben ist.
Frage: wie stell ich das denn an, dass zuerst wirklich das dialog beendet wird, bevor es mit dem code in der WinMain weitergeht?vielen dank im voraus

-
Zeig mal nen Codeausschnitt... so kann ich/man mir/sich da wenig drunter vorstellen ...
-
omg... öhm, nja, der code an sich ist schon n bissl länger... sehr viel länger, als dass man ihn bedenkenlos hier einfügen könnte... ich versuch ma das wesentliche zu extrahieren, sekunde mal...
-
also. sieht in etwa so aus:
#include //alles nötige, 1000 header... LRESULT CALLBACK WndProc(/*alles wie immer*/); int WINAPI WinMain(/*alles wie gewöhnlich*/){ //MSG variablen deklarieren... //fensterklasse createn.... //window createn //hier wir ein objekt erstellt, der ein paar extrem //wichtige schnittstellen initialisiert Initializer initializer=Initializer(); //hier macht es ein dialog auf, um benutzereingaben zu erhalten initializer.Init() //dialog sollte jetzt erscheinen //hier erwarten eine weitere funktion einen //pointer auf die vom objekten initialisierte schnittstelle useInterface(initializer.pInterface); //aus irgendeinem grund wird diese funktion aufgerufen, bevor //das dialog beendet ist, und schnittstelle initialisiert wurde //show window... //nachrichtenschleife.... } //WindowProc definition, auch nichts spannendes, sorgt nur dafür, dass //das fenster geschlossen wird, sonst nixssoo... abstrahierter gehts nich^^

hoffe, ist in etwa klargeworden, was ich meine...
-
Deinen pseudocode versteh ich nicht.
Wenn es sich aber wirklcih im einen Dialog handelt brauchst du zum einen keine Nachrichtenschleife selbst bastlen und zum anderen kehr z.b. DialogBox() erst zurück wenn der dialog beendet wird:int WinMain(...)
{
return DialogBox(....);
}das funktioniert.
-
gut, dankö sehr! werd ich gleich versuchen
-
Njo... idee=gut, klappt aber nicht in meinem fall, bzw ich weis nicht, wie ich das in meinen programm anwende. Der grund dafür ist wahrscheinlich das hier:
VC++ Dokumentation schrieb:
DialogBox():
DialogBox does not return control until the specified callback function terminates the modal dialog box by calling the EndDialog function.wenn ich aber das dialogfenster mit CreateDialog() erstelle, und mit ShowWindow() sichtbar mache, dann wird das restliche program nicht geblockt, WndProc läuft munter weiter, obwohl noch kein EndDialog() von der DlgProc kam. Und dann gibt es tonnenweise pointer die ins leere zeigen...

wenn ich also meine funktion so definiere:
int initializer::Init(){ return DialogBox(/* blablabla*/); }wird das programm geblockt, alles wartet auf das dialogende
wenn ich das aber so schreibe:
int initializer::Init(){ HWND hDlg=CreateDialog(/*blablbla*/); ShowWindow(hDlg, SW_SHOW); return 0; }dann geht es sofort mit dem programm weiter, bevor der benutzer was eingegeben hat, was zu einem absturz führt
frage: wie warte ich in der zweiten version von init auf das dialogende?
-
Das willst du doch mit DialogBox(...) erreichen, das der Code in deinem Programm eben nicht weiterläuft. Wenn du DialogBox aufrufst, bleibt dein gesamtes Programm stehen, bis auf die Nachrichtenschleife für deine DialogBox die du seperat zur normalen Nachrichtenschleife anlegen musst.
-
Mit DialogBox():
-DlgProc läuft=OK
-WndProc steht=OKMit CreateDialog():
-DlgProc läuft=OK
-WndProc läuft=Programmabsturz, weil DlgProc noch nicht fertig istsoweit alles klar, hoffe ich doch...
Ich will: CreateDialog(), aber so dass:
-DlgProc läuft
-Wndproc stehtaber wie bringe ich die WndProc dazu, auf das ende von DlgProc (aufruf von EndDialog() ) zu warten?

@flammenvogel: was meinst du mit "nachrichtenschleife": die WndProc oder das hier:
while(GetMessage(&msg,NULL, 0, 0)){ TranslateMessage(&msg); DispatchMessage(&msg); }falls du dieses teil meinst, dann frag ich mich, wie ich das äquivalente code für n dialog schreibe? dank im voraus
-
WARUM willst du einen nicht modalen Dialog erzeugen, wenn es an der Stelle praktischer ist einen modalen Dialog zu erstellen?
-
weil ich nicht weiss, wie ich an einen mit DialogBox() erstellten dialog irgendwelche informationen übergebe, mit einem CreateDialog()-dialog hab ichs bisher so gemacht:
//in der funktion, die das dialog erstellt: HWND hDlg=CreateDialog(/*blablabla*/); SetWindowLong(hDlg, DWL_USERDATA, reinterpret_cast<LONG>(pAbsolutelyImportantPointer) ); ShowWindow(hDlg, SW_SHOW); //... //in der DlgProc: //... case WM_SHOWWINDOW: MyObject* pObject= reinterpret_cast<MyObject*>(GetWindowLong(hDlg, DWL_USERDATA); //alles wunderbar, der nichtmodale dialog hat zugriff auf daten von außenbei einem mit DialogBox() erstellten dialog krig ich nicht ma ein handle geliefert, wenn ich mich nicht irre, wie soll ich dann dem ding irgendwelche informationen rüberschicken?
-
Andrey schrieb:
weil ich nicht weiss, wie ich an einen mit DialogBox() erstellten dialog irgendwelche informationen übergebe[...]
DialogBoxParam(...) (siehe letzter Param.) kannst du dazu benutzen.
int DialogBoxParam( HINSTANCE hInstance, // handle to application instance LPCTSTR lpTemplateName, // identifies dialog box template HWND hWndParent, // handle to owner window DLGPROC lpDialogFunc, // pointer to dialog box procedure LPARAM dwInitParam // initialization value ); [...] dwInitParam Specifies the value to pass to the dialog box in the lParam parameter of the WM_INITDIALOG message.
-
pronix.linuxdelta.de --> Kapitel 5: Dialogfelder
winapi.net --> Gerüst für einen nicht-modalen Dialog
winapi.net --> Gerüst für einen modalen Dialog
-
@ codefinder: so einfach ist es? so einfach??
ooo man, danke, ich bin echt dähmlich...thx all!

-
Diesen Effekt den du beschreibst kriegst du eben mit DialogBox hin. Alles außer die Nachrichtenschleife und deine DialogProc steht.
Bei CreateDialog ist dies auch nicht beabsichtigt. Diese Funktion ist ja gerade dazu da das alles andere nebenher weiterläuft.
Was du mir jetzt erklären musst ist, warum du nicht einfach statt CreateDialog, DialogBox als aufrufende Funktion für deinen Dialog nimmst und damit glücklich wirst?
//edit: Ups, da habe ich doch wirklich die zweite Seite des Threads nicht gesehen. Srry, damit ist dieses Posting natürlich überflüssig

-
-Andrey schrieb:
@ codefinder: so einfach ist es? so einfach??
ooo man, danke, ich bin echt dähmlich...thx all!

Jop das ist so einfach
. Kein Problem
.