Okno z CWindowImpl wykonawcze
Aby zaimplementować okna, czerpią klasy z CWindowImpl.W klasie pochodnej zadeklarować mapę wiadomości i funkcje obsługi wiadomości.Można teraz użyć klasy trzy różne sposoby:
Tworzenie okna oparte na nową klasę Windows
Superklasa istniejącej klasy systemu Windows
Istniejące okno podklasy
Tworzenie okna oparte na nową klasę Windows
CWindowImplzawiera DECLARE_WND_CLASS makro zadeklarować informacje klasy systemu Windows.To makro implementuje GetWndClassInfo funkcji, która używa CWndClassInfo do definiowania informacji nową klasę systemu Windows.Gdy CWindowImpl::Create nazywa to Windows klasa jest zarejestrowana i tworzone jest nowe okno.
[!UWAGA]
CWindowImplprzekazuje NULL do DECLARE_WND_CLASS makra, co oznacza ATL wygeneruje Nazwa klasy systemu Windows.Aby określić własne nazwy, przekazać ciąg DECLARE_WND_CLASS w sieci CWindowImpl-klasy.
Przykład
Oto przykład klasy, która implementuje okno oparte na nową klasę Windows:
class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
// Optionally specify name of the new Windows class
DECLARE_WND_CLASS(_T("MyName"))
// If this macro is not specified in your
// class, ATL will generate a class name
BEGIN_MSG_MAP(CMyCustomWnd)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
// Do some painting code
return 0;
}
};
Aby utworzyć okna, należy utworzyć wystąpienie CMyWindow , a następnie wywołać Tworzenie metody.
[!UWAGA]
Aby zastąpić domyślne informacje o klasy systemu Windows, należy zaimplementować GetWndClassInfo metoda w klasie pochodnej przez ustawienie CWndClassInfo członków na odpowiednie wartości.
Po jest przykład klasy tej edycji standardowych superklas klasy:
class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
// "Edit" is the name of the standard Windows class.
// "MyEdit" is the name of the new Windows class
// that will be based on the Edit class.
DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))
BEGIN_MSG_MAP(CMyEdit)
MESSAGE_HANDLER(WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
// Do some character handling code
return 0;
}
};
Aby utworzyć superclassed okno edycji, należy utworzyć wystąpienie CMyEdit , a następnie wywołać Tworzenie metody.
Superclassing istniejącej klasy systemu Windows
DECLARE_WND_SUPERCLASS makro umożliwia tworzenie okna tego istniejące Windows superklas klasy.Określenie to makro programu CWindowImpl-klasy.Podobnie jak inne okna ATL wiadomości są obsługiwane przez mapę wiadomości.
Kiedy używać DECLARE_WND_SUPERCLASS, nowa klasa Windows zostanie zarejestrowany.To nowa klasa będzie identyczna z klasy istniejącej, określić, ale zastąpią procedury okna z CWindowImpl::WindowProc (lub z funkcji ta metoda zastępuje).
Tworzenie podklas istniejące okno
Do podklasy istniejące okno pochodzić z klasy CWindowImpl i zadeklarować mapę wiadomości, jak w poprzednich dwóch przypadków.Należy jednak zauważyć, że nie określisz wszelkie informacje klasy systemu Windows, ponieważ będzie już istniejące okno podklasy.
Zamiast wywołania Tworzenie, call SubclassWindow i przekazać jej uchwyt istniejące okno chcesz podklasy.Po podklasy okna będą używać CWindowImpl::WindowProc (lub funkcja ta metoda zastępuje) wiadomości do mapy wiadomości bezpośrednich.Aby odłączyć subclassed okno z obiektu, wywołanie UnsubclassWindow.Następnie procedurę okna oryginalnego okna zostaną przywrócone.