UI Thread mit Dialog in DLL
-
Hallo zusammen!
Folgendes möchte ich erreichen: während in einer Dll Berechnungen durchgeführt werden soll ein neuer Thread gestartet werden, der einen Dialog mit Fortschrittsbalken anzeigt. Andersherum ist das für mich aus einigen Gründen nicht zu realisieren.. nur schonmal vorweg. Was schon funktioniert ist folgendes: Der Dialog wird angezeigt, die ProgressBar läuft wunderbar durch (endlos) und ich kann den Dialog auch beenden, indem ich eine WM_QUIT message an die MessageLoop des Threads sende.
Was nicht funktioniert: Ich kriege es nicht hin, diesen Dialog in der Taskleiste zu verbergen also mit ModifyStyle( WS_EX_APPWINDOW, 0 ) bzw ModifyStyleEx...
Und: die Basisanwendung unterhalb des Dialogs zeichnet sich nicht neu, wenn dieser verschoben wird.. was ja auch erstmal richtig ist, denn die hat ja keine Zeit zum WM_PAINT message verarbeiten.. kann ich da irgendwas tricksen?
Wäre für jeden Tipp sehr sehr dankbar !!
//Edit: Hier noch ein bisschen Code:
//Header-File class CMyUIThread: public CWinThread { public: DECLARE_DYNCREATE(CMyUIThread) DECLARE_MESSAGE_MAP() public: CMyUIThread(); virtual BOOL InitInstance( ); virtual int ExitInstance( ); afx_msg void ThreadEndMessage(WPARAM wParam, LPARAM lParam); CTestDlg *m_pTestDlg; }; //CPP-File IMPLEMENT_DYNCREATE(CMyUIThread, CWinThread) BEGIN_MESSAGE_MAP(CMyUIThread, CWinThread) //{ { AFX_MSG_MAP(CMyThread) // NOTE - the ClassWizard will add and remove mapping macros here. //} } AFX_MSG_MAP ON_THREAD_MESSAGE(WM_USER+1, ThreadEndMessage) END_MESSAGE_MAP() void CMyUIThread::ThreadEndMessage(WPARAM wParam, LPARAM lParam) { PostQuitMessage(0); } BOOL CMyUIThread::InitInstance( ) { m_pTestDlg = new CTestDlg( ); m_pMainWnd = m_pTestDlg; m_pTestDlg->Create( IDD_DLG_TEST ); //m_pTestDlg->ModifyStyle( WS_EX_APPWINDOW, 0 ); //m_pTestDlg->ModifyStyleEx( WS_EX_APPWINDOW, 0 ); m_pTestDlg->SetForegroundWindow(); m_pTestDlg->ShowWindow( SW_SHOWNORMAL ); m_pTestDlg->UpdateWindow(); return TRUE; // Success } CMyUIThread::CMyUIThread() { } int CMyUIThread::ExitInstance( ) { if (m_pTestDlg) { delete m_pTestDlg; m_pTestDlg = NULL; } return 0; // Success } //Dialogaufruf aus der DLL pWaitThrd = (CMyUIThread *)AfxBeginThread(RUNTIME_CLASS(CMyUIThread), THREAD_PRIORITY_NORMAL, 0, 0/*CREATE_SUSPENDED*/,0 ); //Dialogende if (pWaitThrd) { pWaitThrd->PostThreadMessage(WM_USER+1, 0,0); pWaitThrd = NULL; }
-
1. Der Dialog wird nicht mit senden von PostQuitMessage beendet. Das solltest Du mit WM_CLOSE machen und der WM_DESTROY Handler sollte dann AfxPostQuitMessage verwenden.
http://blog.m-ri.de/index.php/2007/12/09/die-unsitte-postquitmessage-zum-beenden-eines-programmes-zu-verwenden/2. WS_EX_APPWINDOW ist ein EX-Stil und kann nicht mit ModifyStyle gesetzt werden sondern n ut mit ModifyStyleEx!
-
Hallo Martin,
danke erstmal für Deinen Hinweis. Du hast recht, das Fenster wird so nicht sauber geschlossen.
Ich habe den Code jetzt dahingehend geändert, dass ich eine WM_CLOSE Nachricht an den Dialog sende und dieser im OnDestroy das AfxPostQuitMessage() aufruft.
Das war aber eigentlich gar nicht mein Problem..

Neuzeichnen und Taskbar sind das Problem..

Wie gesagt: ich habe auch ModifyStyleEx ausprobiert ( siehe Code ) und immer wird mir der Dialog in der Taskbar angezeigt. Ich vermute irgendwie, das liegt daran dass es der m_pMainWnd des Threads ist.. aber so genau weiss ich nicht was ich dagegen tun kann.
-
Dies ist aber der korrekte Weg:
http://www.codeguru.com/cpp/frameworks/advancedui/print.php/c3227
-
Ja, das ist auch der richtige Weg.. aber er funktioniert nicht.. und ich möchte versuche herauszufinden warum ...

-
Code!