Automatischer Aufrufen einer Methode nach dem Initialiseren des Dialoges
-
Hallo
Ich starte einen Dialog mit dlg.DoModal(). In dieser Dialog-Klasse gibts eine Methode Process. Diese Methode schreibt unteranderem Infos in eine ComboBox.
Die Process-Methode soll nach dem Initialieren des Dialoges gestartet werden (ohnen Benutzeraktion). Wie kriege ich das hin?
Ich muss einfache eine Nachricht bekommen, sobald der Dialog initialisiert worden ist.Gruess tch
-
OnInitDialog
-
Wie in deinem Hauptdialog standardmäßig drin ist: OnInitDialog bzw. WM_INITDIALOG
-
Nein, ich meinte das nicht so! Die Process-Methode soll während sie arbeitet, den Fortschritt zeigen z.B. an hand eines Prozent-Balken.
Wenn ich die Process-Methode in der OnInitDialog()-Fuktion aufrufen würde, würde man vielleicht 2 min warten bis man den Dialog sieht. Und der Balken wäre schon auf 100%.
Meine Process-Methode soll nach OnInitDialog() automatisch aufgerufen werden.Gruess tch
-
Tja, dann schau dir mal das Thema Threads an,
und mach dir gedanken wie du bei dem Prozess den fortschritt feststellst
bzw. wie du 100% bekommst...Devil
-
Die Process-Methode arbeitet Schritt für Schritt. Nach jedem Schritt werden mit
MSG msg; while (PeekMessage(&msg, this->m_hWnd, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); }
die anstehenden Nachrichten verarbeitet. Also keine Threads! Keep it simple!
Also, weiss niemand eine Lösung?
-
Hallo THC,
wie wäre es mit einem Timer?
Ich habe so etwas auch schon in OnPaint realisiert. Dort brauchst du dann halt ein Flag, damit die Funktion nur einmal aufgerufen wird. Ist aber ein bisschen heikel. Aber damals ging es um eine MessageBox und das hat dann ganz gut geklappt. Sie wurde angezeigt, nachdem der Dialog und bevor die Steuerelemente gezeichnet wurden.
Gruß, Volle.
-
@Volle
Komischer Anwendungsfall...
-
Hallo
Habe jetzt einen anderen Lösungsweg gefunden:
Im h-File
- #define WM_USER_RUN WM_USER + 1
- virtual LRESULT OnUserMsgRun(WPARAM wParam, LPARAM lParam);
Ist eine Methode der Dialogklassecpp-File
- [code]
EGIN_MESSAGE_MAP(CEnumTblDlg, CDialog)
ON_MESSAGE(WM_USER_RUN, OnUserMsgRun)
//{{AFX_MSG_MAP(CEnumTblDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()[/code]- Die Implementation von
LRESULT CEnumTblDlg::OnUserMsgRun(WPARAM wParam, LPARAM lParam)- In OnInitDialog() rufen ich nun PostMessage(WM_USER_RUN, 0, 0) auf
Ich sende also eine Nachricht in die MSG-Warteschlange. Nachdem InitDialog() fertig ist, wird meine eigene Nachricht verarbeitet und OnUserMsgRun aufgerufen.
Gruess tch