FindWindow nach dem Klassennamen funktioniert nicht?
Vorwort wir haben eine seltsame Anforderung, dass alle Dialoge werden muss ungebunden für eine MFC-Anwendung. Gibt es einen besonderen dialog mit der region zeichnen und einige benutzerdefinierte Steuerelemente wählen Sie die Daten und Zeiten für die Anzeige von vergangenen und zukünftigen Daten-per-view. Ich muss in der Lage sein, um dieses Fenster zu schließen, wenn es den Fokus verliert, wird die Haupt-app bekommt einen system-Befehl, etc.
Ich dachte, der einfachste Weg, dies zu tun wäre, um die Klasse zu registrieren, zum Beispiel so:
//for CWnd::FindWindow
WNDCLASS wndcls;
SecureZeroMemory(&wndcls, sizeof(WNDCLASS));
wndcls.lpszClassName = L"CTransactionDialog";
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = AfxWndProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = NULL;
#ifndef _WIN32_WCE_NO_CURSOR
wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
#else
wndcls.hCursor = 0;
#endif
wndcls.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1);
wndcls.lpszMenuName = NULL;
BOOL retVal = AfxRegisterClass(&wndcls);
if (!retVal)
AfxMessageBox(L"AfxRegisterClass(CTransactionDialog) Failed");
Dann später in Reaktion auf verschiedene Ereignis-Handler und Nachrichten, bei denen möchte ich diese nicht-modale Fenster werden geschlossen, etwas einfaches zu machen wie diese:
CWnd* pFound = NULL;
while ((pFound = CWnd::FindWindow(L"CTransactionDialog", NULL)) != NULL)
pFound->DestroyWindow();
Jedoch trotz der Anmeldung der Klasse zu Folgen und Blick auf GetRuntimeClass
des dialogs in Frage zu Debuggen und zu sehen, das ist passt wie erwartet die FindWindow
nie zu finden scheint oder schließen diese nicht-modale Dialoge wie erwartet.
Was mache ich falsch oder gibt es einen besseren Weg zu gehen über diese?
Update: Dies ist, wie der dialog erstellen Sie über eine statische Methode der dialog-Klasse. Die dialog-Ressource für die angegebene id in create hat die Popup-Eigenschaft legen Sie das beheben sollten, zu WS_POPUP
Stil unter die MFC deckt. Der dialog sollte nicht und muss nicht ein Elternteil, soweit ich wusste.
CTransactionDialog* CTransactionDialog::ShowTransactionDialog(const CRect& crCtrlToFloatAbove, UINT dialogID, Itime defaultTime, Itime initialTime)
{
CTransactionDialog* pCTDialog = new CTransactionDialog(crCtrlToFloatAbove, dialogID, defaultTime, initialTime);
pCTDialog->Create(CTransactionDialog::IDD);
pCTDialog->ShowWindow(SW_SHOW);
return pCTDialog;
}
Update: Doh! FindWindowEx
ist nicht etwas zu finden, entweder.
CWnd::FindWindowEx(AfxGetMainWnd()->GetSafeHwnd(), NULL, L"CTransactionDialog", NULL);
Allerdings habe ich einen neuen plan. Ich bin gerade dabei mein eigenes Fenster mit der Meldung und Griff auf dem main-frame. Ich denke, ich kann sofort mit übergeben einen Zeiger auf die dialog als lParam der Nachricht und dann Gießen Sie es auf ein CWnd*
dann ruft DestroyWindow
. Es funktioniert für die meisten Fälle eine sehr Runde über Weg. Ich kann es zu Problemen mit der Minimierung und Maximierung des Haupt-frame-Fensters für Dialoge, nichts hält einen Zeiger zu haben, aber wir werden sehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
FindWindow
funktioniert nicht mit child-windows. Finden Sie ein untergeordnetes Fenster, die Sie verwenden können,FindWindowEx
, übergeben Sie die HWND des übergeordneten Fensters als ersten parameter.WS_POPUP
Stil bei der Erstellung von dialog negiertWS_CHILD
. Muss ich angeben, dass in der Klasse Registrierung sowie?Create()
? Wenn dem so ist, dann sind die Fenster werden Ihr Hauptfenster der Anwendung wie Ihre Eltern.WS_POPUP
style erstellen? Ich poste mein code snippet für die Schöpfung.CDialog::Create()
: "pParentWnd: Verweist auf das übergeordnete window-Objekt (vom Typ CWnd), auf die der dialog-Objekt gehört. Wenn es NULL ist, wird das dialog-Objekt des parent-Fenster auf das Hauptfenster der Anwendung."EndDialog()
.DoModal
soEndDialog
wäre ein Speicher-Leck am besten. @dlev Na dann in diesem Fall gebe ichFindWindowEx
einen Schuss.Klasse name bezeichnet NICHT die c++ - Klasse name - es bezeichnet die Fenster-Klasse name. Dieser name wurde verwendet, um zu registrieren, das Fenster mit den OS und hat nichts zu tun mit der c++ - Klasse.
Kann MSDN enlight Sie...
CWnd::FindWindow nicht suchen untergeordneten Fenster.
Ist es möglich, dass die mode weniger Fenster, das Sie erstellen ein Elternteil hat, der Satz und das ist der Grund, warum FindWindow nicht finden ?
WS_CHILD
flag oder was auch immer es ist? Dem Fenster seiner Klasse hat es nicht.Unten ist die einfachste und sauberste Lösung, die ich gefunden habe:
Nicht zu 100% sicher, aber ich glaube, Sie müssen Ihre Klasse name in der resource-Datei. Definieren Sie eine windows-Klasse und erstellen Sie ein Dialogfeld Klasse, aber Sie sind nicht zu verknüpfen. Einstellung der name einer Klasse in der WNDCLASS Struktur wird nicht helfen, es sei denn, Sie haben tatsächlich eine Art der Verknüpfung, um das Dialogfeld. Wenn Sie die Ressource-Datei, und definieren Sie den dialog, und Klasse name drin, dann sollte es funktionieren.