Partilhar via


TN001: Registro de classe de janela

Esta nota descreve as rotinas MFC que registram as classes WNDCLASSespeciais necessárias para o Microsoft Windows. Atributos específicos WNDCLASS usados pelo MFC e Windows são discutidos.

O problema

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

Este WNDCLASS registo deve ser efetuado através de um de quatro meios:

  • Implicitamente, ao usar um MFC fornecido pelo WNDCLASS.

  • Implicitamente, subclassificando um controle do Windows (ou algum outro controle).

  • Explicitamente chamando o MFC AfxRegisterWndClass ou AfxRegisterClass.

  • Explicitamente chamando a rotina do Windows RegisterClass.

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 utilizado (deve ser zero)
cbWndExtra não utilizado (deve ser zero)
hInstância preenchido automaticamente com AfxGetInstanceHandle
hIcon ícone para as janelas de moldura, veja abaixo
hCursor cursor para quando o mouse estiver sobre a janela, veja abaixo
hbrBackground cor de fundo, veja abaixo
lpszMenuName não usado (deve ser NULL)
lpszClassName nome da classe, veja abaixo

WNDCLASSes fornecidos

Versões anteriores do MFC (antes do MFC 4.0), forneciam 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 do aplicativo padrão é usado e, para o cursor, o cursor de seta padrão é usado.

Dois ícones suportam aplicativos MDI com tipos de documentos únicos: um ícone para o aplicativo principal, o outro ícone para janelas icônicas de documentos/MDIChild. Para vários tipos de documentos com ícones diferentes, deve-se registar ícones adicionais WNDCLASS ou usar a função CFrameWnd::LoadFrame.

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

  • Estilo da classe: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • ícone AFX_IDI_STD_FRAME

  • cursor de seta

  • COLOR_WINDOW cor de fundo

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

Controles de subclassificação e superclassificação

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

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);

Esta 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, armazene-a em uma variável CString , como neste exemplo:

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

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

...

AfxRegisterWndClass lançará um CResourceException se a classe window não conseguiu registrar (devido a parâmetros incorretos ou falta de memória do Windows).

As funções RegisterClass e AfxRegisterClass

Se você quiser fazer algo mais sofisticado do que o que AfxRegisterWndClass fornece, você pode chamar a API RegisterClass do Windows ou a função AfxRegisterClassMFC . As CWndfunções , CFrameWnd e CMDIChildWndCreate usam um nome de cadeia de caracteres lpszClassName para a classe window 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. Win32 não cancela automaticamente o registro de classes registradas por uma DLL, portanto, você deve explicitamente cancelar o registro de classes quando a DLL é encerrada. Ao usar AfxRegisterClass em vez de RegisterClass, isto é tratado automaticamente para si. AfxRegisterClass mantém uma lista de classes exclusivas registradas pela sua DLL e cancelará automaticamente o registro delas quando a DLL terminar. Quando você usa RegisterClass em uma DLL, você deve garantir que todas as classes não são registradas quando a DLL é encerrada (na função DllMain ). A falha ao fazer isso pode fazer com que RegisterClass falhe inesperadamente quando outra aplicação cliente tenta usar a sua DLL.

Ver também

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