Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Para implementar uma janela, derive uma classe de CWindowImpl. Na classe derivada, declare um mapa de mensagens e as funções do manipulador de mensagens. Agora você pode usar sua classe de três maneiras diferentes:
Criando uma janela com base em uma nova classe do Windows
CWindowImpl contém a macro DECLARE_WND_CLASS para declarar informações de classe do Windows. Esta macro implementa a GetWndClassInfo função, que usa CWndClassInfo para definir as informações de uma nova classe do Windows. Quando CWindowImpl::Create é chamada, essa classe do Windows é registrada e uma nova janela é criada.
Observação
CWindowImpl passa NULL para a macro DECLARE_WND_CLASS, o 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 em sua CWindowImplclasse derivada.
Exemplo: Implementar uma janela
A seguir está um exemplo de uma classe que implementa uma janela com base em uma nova classe do 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;
}
};
Para criar uma janela, crie uma instância de CMyWindow e, em seguida, chame o Create método.
Observação
Para substituir as informações de classe padrão do Windows, implemente o GetWndClassInfo método em sua classe derivada definindo os CWndClassInfo membros para os valores apropriados.
Superclassificando uma classe existente do Windows
A macro DECLARE_WND_SUPERCLASS permite criar uma janela que superclasses uma classe existente do Windows. Especifique essa macro na sua classe derivada CWindowImpl. Como qualquer outra janela ATL, as mensagens são tratadas por um mapa de mensagens.
Quando você usa DECLARE_WND_SUPERCLASS, uma nova classe do Windows será registrada. Essa nova classe será a mesma que a classe existente especificada, mas substituirá o procedimento de janela por CWindowImpl::WindowProc (ou pela função que substitui esse método).
Exemplo: Superclasse a classe Edit
A seguir está um exemplo de uma classe que é uma superclasse da classe Edit padrão.
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;
}
};
Para criar a janela Edit superclassificada, crie uma instância de CMyEdit e chame o Create método.
Subclassificando uma janela existente
Para subclassificar uma janela existente, derive de uma classe CWindowImpl e declare um mapa de mensagens, como nos dois casos anteriores. Observe, no entanto, que você não especifica nenhuma informação de classe do Windows, pois você subclassificará uma janela já existente.
Em vez de chamar Create, chame SubclassWindow e passe o identificador para a janela existente que você deseja subclassificar. Uma vez que a janela é subclassificada, ela usará CWindowImpl::WindowProc (ou sua função que substitui esse método) para direcionar mensagens para o mapa de mensagens. Para desanexar uma janela subclassificada do seu objeto, chame UnsubclassWindow. O procedimento original da janela será então restaurado.