Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aby zaimplementować okno, należy utworzyć klasę z CWindowImplklasy . W klasie pochodnej zadeklaruj mapę komunikatów i funkcje obsługi komunikatów. Teraz możesz użyć klasy na trzy różne sposoby:
Tworzenie okna na podstawie nowej klasy systemu Windows
CWindowImpl
zawiera makro DECLARE_WND_CLASS do deklarowania informacji o klasie systemu Windows. To makro implementuje GetWndClassInfo funkcję, która używa CWndClassInfo do definiowania informacji o nowej klasie systemu Windows. Po CWindowImpl::Create wywołaniu ta klasa systemu Windows zostanie zarejestrowana i zostanie utworzone nowe okno.
Uwaga
CWindowImpl przekazuje wartość NULL do makra DECLARE_WND_CLASS , co oznacza, że usługa ATL wygeneruje nazwę klasy systemu Windows. Aby określić własną nazwę, przekaż ciąg do DECLARE_WND_CLASS w klasie pochodnej CWindowImpl.
Przykład: implementowanie okna
Poniżej przedstawiono przykład klasy, która implementuje okno na podstawie nowej klasy systemu 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ć okno, utwórz wystąpienie CMyWindow klasy , a następnie wywołaj metodę Create .
Uwaga
Aby zastąpić domyślne informacje o klasie systemu Windows, zaimplementuj GetWndClassInfo metodę w klasie pochodnej, ustawiając CWndClassInfo składowe na odpowiednie wartości.
Superklasowanie istniejącej klasy systemu Windows
Makro DECLARE_WND_SUPERCLASS umożliwia utworzenie okna, które zastępuje istniejącą klasę systemu Windows. Określ to makro w CWindowImplklasie -pochodnej. Podobnie jak w przypadku każdego innego okna ATL komunikaty są obsługiwane przez mapę komunikatów.
W przypadku korzystania z DECLARE_WND_SUPERCLASS zostanie zarejestrowana nowa klasa systemu Windows. Ta nowa klasa będzie taka sama jak określona klasa istniejąca, ale zastąpi procedurę okna (lub funkcją CWindowImpl::WindowProc , która zastępuje tę metodę).
Przykład: superklasa klasy Edit
Oto przykład klasy, która klasy superklasuje standardową klasę Edit:
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ć okno edycji superklasowej, utwórz wystąpienie CMyEdit klasy , a następnie wywołaj metodę Create .
Podklasowanie istniejącego okna
Aby podklasować istniejące okno, utwórz klasę z CWindowImpl i zadeklaruj mapę komunikatów, jak w dwóch poprzednich przypadkach. Należy jednak pamiętać, że nie określisz żadnych informacji o klasie systemu Windows, ponieważ będzie to już istniejące okno.
Zamiast wywoływać Createmetodę , wywołaj SubclassWindow i przekaż do niego dojście do istniejącego okna, w którym chcesz utworzyć podklasę. Po utworzeniu podklasy okno będzie używane CWindowImpl::WindowProc (lub funkcja, która zastępuje tę metodę), aby kierować komunikaty do mapy komunikatów. Aby odłączyć okno podklasy od obiektu, wywołaj metodę UnsubclassWindow. Oryginalna procedura okna zostanie przywrócona.