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.

InformationsquelleAutor AJG85 | 2011-08-26
Schreibe einen Kommentar