Compartilhar via


TN001: registro da classe Window

Esta observação descreve as rotinas MFC que registram os WNDCLASSes especiais, necessários ao Microsoft Windows. Atributos específicos WNDCLASS usados por MFC e Windows são discutidos.

O problema

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

Isso WNDCLASS deve ser registrado por meio de um dos quatro meios:

  • Implicitamente, usando um MFC fornecido para WNDCLASS.

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

  • Explicitamente chamando o MFC AfxRegisterWndClass ou AfxRegisterClass.

  • Explicitamente ao chamar a rotina RegisterClass do Windows.

Campos WNDCLASS

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

Campo Descrição
lpfnWndProc window proc, deve ser um AfxWndProc
cbClsExtra não usado (deve ser zero)
cbWndExtra não usado (deve ser zero)
hInstance preenchido automaticamente com AfxGetInstanceHandle
hIcon ícone para janelas de quadro, veja abaixo
hCursor cursor para quando o mouse estiver sobre a janela, consulte abaixo
hbrBackground cor da tela de fundo, veja abaixo
lpszMenuName não usado (deve ser NULL)
lpszClassName nome da classe, confira abaixo

WNDCLASSes fornecidos

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

Se o aplicativo fornecer um recurso com a ID de recurso especificada (por exemplo, AFX_IDI_STD_FRAME), o MFC usará esse recurso. Caso contrário, ele usará o recurso padrão. Para o ícone, o ícone de aplicativo padrão é usado e, para o cursor, o cursor de seta padrão é usado.

Dois ícones dão suporte a aplicativos MDI com tipos de documento único: um ícone para o aplicativo principal, e o outro ícone para janelas de documento/MDIChild icônicos. Para vários tipos de documento com ícones diferentes, você deve cadastrar ícones adicionais ou usar a função WNDCLASS.

CFrameWnd::LoadFrame registrará um WNDCLASS usando o ID do ícone que você especificar como primeiro parâmetro e os seguintes atributos padrão:

  • estilo de classe: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • ícone AFX_IDI_STD_FRAME

  • cursor em forma de seta

  • COLOR_WINDOW cor da tela de fundo

Os valores de cor de plano de fundo e cursor para o CMDIFrameWnd não são usados, pois a área do CMDIFrameWnd cliente é completamente coberta pela janela MDICLIENT . A Microsoft não incentiva a subclasse da janela MDICLIENT , portanto, use as cores padrão e os tipos de cursor quando possível.

Controles de subclasse e superclasse

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

A função AfxRegisterWndClass

O 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 é registrada. Por exemplo

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

Essa função retorna uma cadeia de caracteres temporária do nome da classe de janela registrada gerada. Para obter mais informações sobre essa função, consulte AfxRegisterWndClass.

A cadeia de caracteres retornada é um ponteiro temporário para um buffer de cadeia de caracteres estático. É válido até a próxima chamada para AfxRegisterWndClass. Se você quiser manter essa cadeia de caracteres ao redor, armazene-a em uma variável CString , como neste exemplo:

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);

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

...

AfxRegisterWndClass gerará um CResourceException se a classe de janela não tiver sido registrada (por causa de parâmetros ruins ou fora da memória do Windows).

As funções RegisterClass e AfxRegisterClass

Se você quiser fazer algo mais sofisticado do que o que AfxRegisterWndClass fornece, pode chamar a API RegisterClass do Windows ou a função AfxRegisterClassMFC. As CWndfunções , CFrameWnd e CMDIChildWndCreate tomam um nome de cadeia de caracteres lpszClassName para a classe de janela como o 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. O Win32 não cancela automaticamente as classes registradas por uma DLL, portanto, você deve cancelar explicitamente as classes de registro quando a DLL for encerrada. Ao usar AfxRegisterClass em vez disso RegisterClass , isso é tratado automaticamente para você. AfxRegisterClass mantém uma lista de classes exclusivas registradas pela DLL e as cancelará automaticamente quando a DLL for encerrada. Ao usar RegisterClass em uma DLL, você deve garantir que todas as classes não sejam registradas quando a DLL for encerrada (em sua função DllMain ). Não fazer isso pode fazer com que RegisterClass falhe inesperadamente quando outro aplicativo cliente tenta utilizar sua DLL.

Consulte também

Notas técnicas por número
Notas técnicas por categoria