Para implementar uma janela, derive uma classe de CWindowImpl. Em sua classe derivada, declare um mapa da mensagem e as funções de manipulador de mensagem. Agora você pode usar sua classe de três formas diferentes:
Criando uma janela baseada a uma Novo classe do Windows
CWindowImpl contém a macro DECLARE_WND_CLASS para declarar informações de classe do Windows. Essa macro implementa a função GetWndClassInfo , que usa CWndClassInfo para definir as informações de uma Novo classe do Windows. Quando CWindowImpl:: Create é chamado, esta classe de Windows é registrada e uma nova janela é criada.
&Notanbsp;CWindowImpl passa NULL para a macro DECLARE_WND_CLASS , que significa que ATL irá gerar um nome de classe do Windows. Para especificar seu próprio nome, passe uma Cadeia de caracteres para DECLARE_WND_CLASS na sua CWindowImpl-classe derivada.
A seguir é um exemplo de uma classe que implementa uma janela baseada a uma Novo classe do Windows:
classe CMyWindow: CWindowImpllt pública;CMyWindow >,...
{
público:
/ / Opcionalmente especificar o nome da Novo classe do Windows
DECLARE_WND_CLASS("myname") / / se essa macro não é especificada no seu
/ / classe, ATL gerará um nome de classe
...
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER (WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / Fazer algum código de pintura
return 0;
}
}
Para criar uma janela, criar uma instância de CMyWindow e, em seguida, chame o método Create.
&Notanbsp; Para substituir as informações de classe do Windows padrão, implemente o método de GetWndClassInfo na sua classe derivada por configuração os membros CWndClassInfo os valores apropriados.
Superclassing uma classe existente do Windows
A macro de DECLARE_WND_SUPERCLASS permite criar uma janela que superclassificar um Windows existente classe. Especifique esta macro em seu CWindowImpl-classe derivada. Como qualquer outra janela ATL, as mensagens são manipuladas por um mapa da mensagem.
Quando você usa DECLARE_WND_SUPERCLASS, uma Novo classe do Windows será registrada. Essa nova classe será o mesmo que a classe existente que você especifica, mas irá substituir o procedimento de janela com CWindowImpl:: WindowProc (ou com a função que substitui esse método).
Seguinte é um exemplo de uma classe que superclassificar Editar padrão classe:
classe CMyEdit: CWindowImpllt pública;CMyEdit >,...
{
público:
/ / "Editar" é o nome de classe padrão do Windows.
/ / "MyEdit" é o nome da Novo classe do Windows
/ / que será baseado na classe de editar.
DECLARE_WND_SUPERCLASS ("Editar", "MyEdit")
...
BEGIN_MSG_MAP(CMyEdit)
MESSAGE_HANDLER (WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnChar(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / Fazer algum código de manipulação de caractere
}
}
Para criar a janela Editar superclassificada, criar uma instância de CMyEdit e, em seguida, chame o método Create.
Para obter mais informações sobre superclassing, consulte Superclassing de procedimento de janela do Win32 SDK.
Subclassificação uma janela existente
Para "subclasse" uma janela existente, derive uma classe de CWindowImpl e declare um mapa da mensagem, como nos dois casos anteriores. Observe, entretanto, que você não especificar quaisquer informações de classe do Windows, uma vez que você irá subclasse uma janela já existente.
Em vez de chamar de criar, chamada SubclassWindow e passá-lo a alça para a janela existente que você deseja subclasse. Uma vez que a janela é subclasse, ele usará CWindowImpl:: WindowProc (ou a função que substitui esse método) para mensagens diretas ao mapa da mensagem. Para desanexar uma janela subclassed a partir de seu objeto, chamada UnsubclassWindow. Procedimento de janela original da janela, em seguida, será restaurado.
Para obter mais informações sobre subclassificação, consulte Subclassificação de procedimento de janela do Win32 SDK.