Zwischenfrage
-
Hallo,
in einer DLL erzeuge ich einen Dialog, den ich über eine hilfsklasse
instanziere die von CWinThread hergelitten ist.Frage : wenn der Dlg (der auch PreTranslateMessage bekommt) beendet wird,
möchte ich das die CWinApp in Run() den CWinThread beendet, und die Klasse
soll dann mit delete this entfernt werden:Wenn ich den Dialog schließe, bekomme ich unten als letzte Nachricht:
WM_NCLBUTTONDOWNEigentlich sollte ja nach beenden von Run() ExitInstance ausgelöst werden
warscheinlich verwechsel ich hier etwas, zuvor hatte ich den Dialog
einfach mit einem Windows Hook mit Nachrichten versorgt. Ich denke
mal das CWinThread das nicht anders macht ?Danke für Hinweise.
Im Header:
#include "resource.h" class CMyAsyncDllDlg : public CDialog { .... }; class CAdapter : public CWinThread { public: CAdapter(){} ~CAdapter(){} CMyAsyncDllDlg m_Dlg; BOOL CAdapter::InitInstance() { if(!m_Dlg.Create(IDD_LUAEDITOR)) return FALSE; m_pMainWnd = &m_Dlg;//?? return TRUE; } BOOL CAdapter::ExitInstance() { return TRUE; } int CAdapter::Run() { MSG msg; BOOL bRet; while((bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { //kommt erst garnicht if(bRet == -1 || msg.message == WM_DESTROY)//??? { //ExitInstance(); break; } else { PreTranslateMessage(&msg); TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } };
Aufrufer stelle:
CAdapter* adapter = new CAdapter(); adapter->CreateThread(CREATE_SUSPENDED); adapter->m_bAutoDelete = true; adapter->ResumeThread();
-
Erledigt : Das enden des Dialogs setzt m_pMainWnd = 0
int CServiceAdapter::Run() { MSG msg={0}; BOOL bRet; while(m_pMainWnd) { if(PeekMessage(&msg, m_pMainWnd->m_hWnd, 0, 0, PM_REMOVE)) { PreTranslateMessage(&msg); TranslateMessage (&msg); DispatchMessage (&msg); } WaitMessage();//! } return msg.wParam; }
-
Das sollte so funktionieren.
Du musst nur auf WM_QUIT achten.Wenn der Dialog zerstört wird, dann wird WM_QUIT ausgelöst.
Du musst bei einem selbst erzeugten Dialog selbst DestroyWindow aufrufen. Sollte das zerstörte Fenster identisch mit m_pMainWnd sein, dann wird auch PostQuitMessage ausgelöst.
Dein while(m_pMainWnd) ist falsch und überflüssig.
Das die letzte Nachricht, die per Peek/GetMessage kommt WM_NCLBUTTONDOWN ist, ist auch logisch. WM_DESTROY wird nicht über die Messagequeue ausgeliefert sondern direkt übermittelt.
-
okay thx