TN001: Registro de classe de janela

Esta anotação descreve as rotinas MFC que registram o especial WNDCLASSes necessárias pelo Microsoft Windows.Específico WNDCLASS atributos usados pelo MFC e Windows são discutidos.

O problema

Os atributos de um CWnd de objeto, como um HWND tratar no Windows, são armazenadas em dois locais: o objeto de janela e o WNDCLASS.O nome do WNDCLASS é passado para funções de criação de janela geral, como CWnd::Create e CFrameWnd::Create na lpszClassName parâmetro.

Isso WNDCLASS deve ser registrado por meio de quatro formas:

  • Implicitamente, usando um MFC fornecido WNDCLASS.

  • Implicitamente por subclasses um controle do Windows (ou algum outro controle).

  • Explicitamente chamando o MFC AfxRegisterWndClass ou AfxRegisterClass.

  • Explicitamente chamando a rotina Windows RegisterClass.

Campos WNDCLASS

O WNDCLASS estrutura consiste em vários campos que descrevem uma classe de janela.A tabela a seguir mostra os campos e especifica como elas são usadas em um aplicativo MFC:

Campo

Descrição

lpfnWndProc

janela proc, deve ser umAfxWndProc

cbClsExtra

não usado (deve ser zero)

cbWndExtra

não usado (deve ser zero)

hInstance

preenchida automaticamente comAfxGetInstanceHandle

hIcon

ícone para o windows de quadro, consulte abaixo

hCursor

cursor para quando o mouse estiver sobre a janela, consulte abaixo

hbrBackground

cor de plano de fundo, consulte abaixo

lpszMenuName

não usado (deve ser nulo)

lpszClassName

nome de classe, consulte abaixo

Fornecido WNDCLASSes

Versões anteriores do MFC (antes da MFC 4.0), fornecidas várias classes de janela predefinidas.Essas classes de janela não são fornecidos por padrão.Os aplicativos devem usar AfxRegisterWndClass com os parâmetros apropriados.

Se o aplicativo fornece um recurso com a identificação de recurso especificado (por exemplo, AFX_IDI_STD_FRAME), a MFC usará esse recurso.Caso contrário, ele usará o recurso de padrão.O ícone, o ícone de aplicativo padrão é usado e o cursor, o cursor de seta padrão é usado.

Dois ícones de suportam a aplicativos MDI com tipos de documento único: um ícone do aplicativo principal, outro ícone de documento icônico/MDIChild windows.Para vários tipos de documento com ícones diferentes, você deve registrar adicionais WNDCLASSes ou use o CFrameWnd::LoadFrame função.

CFrameWnd::LoadFrameregistrará um WNDCLASS usando a identificação do ícone você especificar como o primeiro parâmetro e os seguintes atributos padrão:

  • estilo de classe: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • ícone AFX_IDI_STD_FRAME

  • cursor de seta

  • Cor de plano de fundo COLOR_WINDOW

Os valores de cor de fundo e o cursor para o CMDIFrameWnd não são usados desde a área do cliente de CMDIFrameWnd totalmente coberto pela MDICLIENT janela.Microsoft não incentive subclassificação de MDICLIENT janela use cores padrão e tipos de cursor quando possível.

Controles de Superclassing e subclassificação

Se você subclasse ou superclasse um Windows controle (por exemplo, CButton) e sua classe obtém automaticamente o WNDCLASS atributos fornecidos na implementação do Windows desse controle.

A função AfxRegisterWndClass

MFC fornece uma função auxiliar para registrar uma classe de janela.Dado um conjunto de atributos (estilo de classe de janela, cursor, Pincel de plano de fundo e ícone), um nome sintético é gerado e a classe de janela resultante está registrada.Por exemplo,

const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);

Esta função retorna uma seqüência de caracteres temporária do nome da classe de janela registrado gerado.Para obter mais informações sobre esta função, consulte AfxRegisterWndClass.

A seqüência retornada é um ponteiro temporário para um buffer de cadeia de caracteres estática.Ela é válida até a próxima chamada para AfxRegisterWndClass.Se você deseja manter essa seqüência de caracteres ao redor, armazená-lo em um CString variável, como no exemplo:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...

AfxRegisterWndClasslança um CResourceException se a classe de janela falhou registrar (por causa de parâmetros inválidos ou falta de memória do Windows).

RegisterClass e funções de AfxRegisterClass

Se você deseja fazer algo mais sofisticado do que o que AfxRegisterWndClass fornece, você pode chamar a API do Windows RegisterClass ou a função MFC AfxRegisterClass.O CWnd, CFrameWnd e CMDIChildWndCreate funções levar um lpszClassName nome de seqüência para a classe de janela como primeiro parâmetro.Você pode usar qualquer nome de classe de janela registrado, independentemente do método usado para registrá-lo.

É importante usar AfxRegisterClass (ou AfxRegisterWndClass) em uma DLL no Win32.Win32 não automaticamente o registro classes registrados por uma DLL, para que cancelar você deve explicitamente registro classes quando a DLL é finalizada.Usando AfxRegisterClass em vez de RegisterClass isso é manipulado automaticamente para você.AfxRegisterClassmantém uma lista de classes exclusivos registrados por sua DLL e serão automaticamente o registro-los quando a DLL é encerrado.Quando você usa RegisterClass em uma DLL, você deve garantir que todas as classes são registradas quando a DLL é finalizada (no seu DllMain função).Falha ao fazer isso pode causar RegisterClass falha inesperadamente quando outro aplicativo cliente tenta usar sua DLL.

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria