nichtmodalen Dialog bei bedarf anzeigen
-
Hallo,
Ich habe ein problem. Und zwar habe ich einen nichtmodalen Dialog erzeugt, der beim klicken auf einen "SelftestBtn()" angezeigt werden soll, und wenn die Procedure "OnSelftestBtn" fertig ist soll dieser wieder versteckt werden.
Beim 1. Versuch tritt folgendes Problem auf:
Mit "ShowWindow(SW_NORMAL)" (siehe Fettdruck im Code) wird beim laufen der Anwendung zuerst der Rahmen des Dialoges angezeigt, jedoch der Inhalt erst am Ende von "OnSelftestBtn". Aber zu diesem Zeitpunkt soll der Dialog wieder geschlossen werden, und so hat der Anwender keine Chance den Inhalt der Dialoges zu sehen, bzw. sieht Ihn zu spaet und weiss nichts damit anzufangen.
2. Versuch:
Ich habe mir gedacht, wenn ich den Dialog ueber einen unabhaengigen Thread anzeigen lasse, dann geht dass. Nun wird aber der gesamte Dialog nur am Ende von "OnSelftestBtn" angezeigt. Auch wenn ich den Thread auf hoechste Priroritaet setzte.
Ich bin sehr dankbar, wenn mir jemand da weiterhelfen kann.
Gruesse Lutz
//Ausschnitt aus Adaptionpage.cpp void CAdaptionPage::OnSelftestBtn() { CDaoDatabase db; CVerbindungSet vs; CKabelExSet ks; CString strCabel1,strCabel2; CString strGesCabel1, strGesCabel2; CString strGesCabelA1, strGesCabelA2; CString strX1,strX2; CString strSig1,strSig2; CString strAder1, strAder2; CString Pin, strV; BOOL isFinishedPins; BOOL isFinishedConnections; CButton *pButton; int noOfSig = 0; CKPGPropSheet* pSheet = (CKPGPropSheet*)GetParent(); CProofObjPage* pProofObjPage = (CProofObjPage*)pSheet->GetPage(1); CMainFrame* pFrame = (CMainFrame*)pSheet->GetParent(); CSetupPage* pSetupPage = (CSetupPage *)pSheet->GetPage(0); int max_no_of_channels = pSetupPage->m_channelCnt; [b]// pSheet->m_pStatusDialog->ShowWindow(SW_NORMAL); //1.Versuch pSheet->m_pShowStatusThread->ResumeThread();//2.Versuch[/b] pFrame->SetStatusText(0,"Busy"); pButton = (CButton*)GetDlgItem(IDC_CABELS_RADIO); pButton->SetCheck(0); pButton = (CButton*)GetDlgItem(IDC_PARTS_RADIO); pButton->SetCheck(0); CListBox *pListBox = (CListBox*)GetDlgItem(IDC_TODO_LIST); // fuer Statusausgaben pListBox->ResetContent(); UpdateWindow(); BeginWaitCursor(); : ://weiterer Code, berechnung ca 4 sec :Hier die Definition von den Belangreichen Variablen
CStatusDialog ist Abgeleitet von CDialog
CShowStatusThread ist Abgeleitet von CWinThread//Ausschnitt aus KPGPropsheet.h public: CStatusDialog* m_pStatusDialog; CShowStatusThread* m_pShowStatusThread;
-
Hallo Lutz,
das Problem ist wahrscheinlich, dass die WM_PAINT - Messages vom Dialog nicht verarbeitet werden können, während deine Funktion läuft.
Schreib' dir eine Funktion HandleEvents, die dies erledigt:
void HandleEvents() { MSG msg; while (::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE)) { if (!AfxGetApp()->PumpMessage()) { return; } } }Die musst du dann nach Anzeigen des Dialoges und und nach jeder Status-Änderung aufrufen.
Allerdings können dann währenddessen auch die Menüs deiner Applikation bedient werden. Du solltest also zusätzlich noch das Haupfenster 'disable'n.
void CAdaptionPage::OnSelftestBtn() { ... AfxGetMainWnd()->EnableWindow(FALSE); pSheet->m_pStatusDialog->ShowWindow(SW_NORMAL); HandleEvents(); ... pSheet->m_pStatusDialog->ShowWindow(SW_HIDE); AfxGetMainWnd()->EnableWindow(TRUE); ... }
-
Vielen Dank Uwe,
Jetzt klappt es.
