3 Stimmen

Vorregistrierung einer ATL-Fensterklasse

Ich verwende eine Kombination aus ATL und WTL für ein Projekt und habe meine eigene Klasse von CWindowImpl die in etwa so aussieht:

class CMyControl : public CWindowImpl<CMyControl>
{
public:
    DECLARE_WND_CLASS(_T("MyClassName"))
    ...
    BEGIN_MSG_MAP(CMyControl)
        ...
    END_MSG_MAP()
};

Das ist alles gut, und wenn ich die CMyControl::Create um eine Instanz des Steuerelements zu erstellen, dann funktioniert es einwandfrei, da unter der Haube, die CWindowImpl::Create Funktion registriert die Win32-Klasse (in diesem Fall die MyClassName ).

Es ist jedoch dieses Verhalten - die Win32-Klasse wird registriert, wenn eine Instanz erstellt wird -, das mir Kopfschmerzen bereitet. Ich möchte in der Lage sein, die Klasse im Voraus zu registrieren, damit ich den Klassennamen in einer anderen Bibliothek eines Drittanbieters verwenden kann, die das Fenster mit der Win32-Klasse erstellt. CreateWindowEx aufzurufen, aber ich kann keine einfache Möglichkeit finden, dies zu tun. Gegenwärtig umgehe ich dieses Problem durch die Verwendung von static als die CreateWindowEx Klassenname und verwenden Sie dann CMyWindow::SubclassWindow um meine Klasse damit zu verknüpfen, aber das ist eine Flickschusterei.

Weiß jemand, wie man eine CWindowImpl abgeleitete Klasse, ohne tatsächlich ein Fenster zu erstellen, so dass ich den Klassennamen an CreateWindowEx erfolgreich? Ich hätte gedacht, dass es eine Standardmethode gibt, dies mit ATL Windows zu tun, da ich nicht der Erste sein kann, der auf dieses Problem stößt.

2voto

m-sharp Punkte 15347

Was Sie versuchen, wird nicht funktionieren. Das liegt daran, dass die Erstellung des ATL/WTL-Fensters über die ATL-Klasse erfolgen muss. Die Klasse registriert ihre este ptr mit einem Fenster thunk . Dieser Thunk wird zum WNDPROC und ersetzt den HWND-Parameter des WNDPROC durch den este ptr der Objektinstanz.

Kurz gesagt, wenn Sie wüssten, wie das ATL-Fenster unter der Haube funktioniert, würden Sie nicht versuchen, dies zu tun. Wenn Sie in der Lage wären, die Fensterklasse zu registrieren, würde der CreateWindowEx-Aufruf das Fenster erfolgreich erstellen. Der Thunk WNDPROC würde jedoch nicht erstellt werden, und es gäbe keine Objektinstanz, mit der Sie Ihr Fenster verknüpfen könnten, und keiner Ihrer Message-Handler würde aufgerufen. Versuchen Sie stattdessen, Ihr Fenster mit CWindowImpl::Create zu erstellen und die hwnd eines ATL-Steuerelements an Ihre Drittanbieter-Bibliothek zu übergeben, sobald es erstellt ist.

0voto

Yigang Wu Punkte 3516

Sie können Win32 API aufrufen RegisterClassEx Funktion direkt.

0voto

user53794 Punkte 3740

Sie können verwenden:

WNDPROC pUnusedWndSuperProc; 
pUnusedWndSuperProc = NULL;
CMyControl::GetWndClassInfo().Register(&pUnusedWndSuperProc);

Obwohl... Ich bin nicht sicher, warum Sie nicht einfach eine Instanz des Fensters erstellen und halten Sie es versteckt. Seine ein wenig Overhead, aber es vermeidet mucking mit den Eingeweiden der Fenster-Logik (die ziemlich komplizierte Sachen ist ... das letzte, was Sie wollen, ist einige unerwartete oder ungewöhnliche Problem mit "Thunking").

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X