Implementação de uma janela com CWindowImpl
Para implementar uma janela, derivar uma classe de CWindowImpl. Em sua classe derivada, declare um MAP da mensagem e as funções do manipulador de mensagens.Agora você pode usar a classe de três maneiras diferentes:
Criar uma janela baseada em uma nova classe do Windows
Superclasse uma classe existente do Windows
Subclasse de uma janela existente
Criando uma janela com base em uma nova classe do Windows
CWindowImpl contém o DECLARE_WND_CLASS macro declarar informações da classe.Essa macro implementa o GetWndClassInfo função, que usa CWndClassInfo para definir as informações de uma nova classe do Windows.Quando CWindowImpl::Create é chamado, esta Windows classe está registrado e uma nova janela é criada.
Observação: |
---|
CWindowImpl passagens NULO to the DECLARE_WND_CLASS macro significa que ATL irá gerar um nome de classe do Windows. Para especificar seu próprio nome, passe uma seqüência de caracteres para DECLARE_WND_CLASS no seu CWindowImpl-classe derivada. |
Exemplo
A seguir é um exemplo de uma classe que implementa uma janela baseada 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, telefonar o Criar método.
Observação: |
---|
Para substituir as informações de classe do Windows padrão, implemente o GetWndClassInfo método na sua classe derivada, definindo o CWndClassInfo membros com valores apropriados. |
A seguir é um exemplo de uma classe que superclasses edição padrão classe:
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 edição superclassificada, crie uma instância de CMyEdit e, em seguida, chamamos o Criar método.
Superclassing uma classe existente do Windows
The DECLARE_WND_SUPERCLASS macro permite que você crie uma janela que superclasses um Windows classe.Especificar essa macro no seu CWindowImpl-classe derivada. Como qualquer Outros janela ATL, as mensagens são tratadas por um MAP da mensagem.
Quando você usa DECLARE_WND_SUPERCLASS, uma nova classe do Windows será registrada. Essa nova classe será o mesmo que a classe existente que você especificar, mas substituirá o procedimento de janela por CWindowImpl::WindowProc (ou com a função que substitui esse método).
Subclassificação uma janela existente
Criar subclasse de uma janela existente, derivar uma classe de CWindowImpl e declarar um MAP da mensagem, sistema autônomo nos dois casos anteriores. Observe, entretanto, não especificar nenhuma informação de classe do Windows, desde que você irá subclasse uma janela já existente.
Em vez de chamar Criar, telefonar SubclassWindow e passá-lo a alça para a janela existente para a subclasse. Depois que a janela é uma subclasse, ele usará CWindowImpl::WindowProc (ou sua função substitui esse método) para direcionar mensagens ao MAP da mensagem. Para desconectar-se uma janela em que foi feito subclassing a partir de seu objeto, telefonar UnsubclassWindow. Procedimento de janela original da janela, em seguida, será restaurado.