TN001: Registro de classe janela

Esta anotação descreve as rotinas MFC que registram as especiais WNDCLASSes necessários pelo Microsoft Windows. Atributos específicos de WNDCLASS usado pelo MFC e Windows são discutidos.

O problema

Os atributos de um objeto de CWnd , como um HWND no Windows, são armazenados em dois locais: o objeto de janela e a WNDCLASS. Um WNDCLASS é diferente de uma classe C++. O nome do WNDCLASS é passado para funções de criação de janela geral como CWnd:: Create e CFrameWnd::Create no parâmetro lpszClassName.

Este WNDCLASS deve ser registrado através de uma das quatro meios:

WNDCLASSes e MFC

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

Estilo Estilo da janela: Veja abaixo
LpfnWndProc janela proc, deve ser AfxWndProc
CbClsExtra não usado (deve ser zero)
CbWndExtra não usado (deve ser zero)
HInstance preenchido automaticamente com AfxGetInstanceHandle
HIcon ícone de quadro windows, veja abaixo
HCursor cursor para quando o mouse estiver sobre a janela, consulte abaixo
HbrBackground cor de fundo, consulte abaixo
LpszMenuName não usado (deve ser NULL)
LpszClassName veja abaixo o nome de classe

Fornecido WNDCLASSes

Em versões anteriores do MFC (anterior ao MFC 4.0), havia um número de classes de janela predefinidas fornecidas. Essas classes de janela já não são fornecidos por padrão por causa de problemas técnicos relacionados ao controle de versão (várias versões do MFC carregados no espaço de um endereço), bem como as preocupações relativas ao fato de que aplicativos MFC e OLE controles podem usar as DLLs do MFC.

A seguinte referência é fornecida para ajudar a migrar o código que usa estes anteriormente fornecidas WNDCLASSes. Aplicativos devem usar AfxRegisterWndClass (com parâmetros apropriados) no lugar dessas classes.

A seguir mostra as classes e seus atributos:

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

Existem dois ícones que oferecem suporte a aplicativos MDI com tipos de documento único (um ícone para o aplicativo principal, o outro ícone de documento iconic/MDIChild windows). Para vários tipos de documento com ícones diferentes, você deve registrar adicionais WNDCLASSes ou use a função CFrameWnd:: LoadFrame.

CFrameWnd:: LoadFrame registrará automaticamente um WNDCLASS usando os atributos padrão "AfxFrameOrView", mas usando a identificação do ícone você especificar como o primeiro parâmetro para LoadFrame.

Os valores de cor de fundo e o cursor para o MDIFrameWnd não são utilizados desde que a área de cliente de MDIFrameWnd é completamente coberta pela janela "MDICLIENT". Microsoft não incentive tão subclassificação a janela "MDICLIENT" usar as cores padrão e tipos de cursor quando possível.

Subclassing controles

Se você subclasse ou superclasse um Windows controlar (por exemplo, CButton), em seguida, sua classe automaticamente Obtém os atributos WNDCLASS fornecidos na implementação de Controlarar do Windows.

A função AfxRegisterWndClass

MFC fornece uma rotina 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)

Essa função retorna uma Cadeia de caracteres temporária do nome da classe de janela registrado gerado. Consulte a Referência de biblioteca de classes para obter mais detalhes.

A Cadeia de caracteres retornada é um ponteiro temporário para um buffer de Cadeia de caracteres estática que é válido até a Avançar chamada ao AfxRegisterWndClass. Se você quiser manter essa Cadeia de caracteres ao redor, armazená-lo em uma variável CString . Por exemplo,

CStrin&g strWndClass = AfxRegisterWndClass (CS_DBLCLK,...);
...
PWnd CWnd * = novo CWnd;
pWnd-gt;Criar (strWndClass,...);

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

O RegisterClass e funções de AfxRegisterClass

Se você quiser fazer alguma coisa mais sofisticada que fornece o AfxRegisterWndClass , você pode chamar a API do Windows RegisterClass ou a função do MFC AfxRegisterClass. O CWnd, CFrameWnd e CMDIChildWnd criar funções levam um nome de Cadeia de caracteres de lpszClassName para a classe de janela como o primeiro parâmetro. Qualquer nome de classe de janela pode ser usado, independentemente de como ele foi registrado.

É importante usar AfxRegisterClass (ou AfxRegisterWndClass) em uma DLL no Win32. Win32 não cancelar o automaticamente registro classes registrados por uma DLL, para isso deve ser feito explicitamente quando a DLL é finalizada. Usando AfxRegisterClass em vez de RegisterClass isso é feito automaticamente para você. AfxRegisterClass mantém uma lista de classes exclusivos registrados por sua DLL e irá cancelar o automaticamente registro, em seguida, quando a DLL é encerrado. Ao usar o RegisterClass em uma DLL, você deve assegurar que todas as classes são não registradas quando o DLL é finalizada (em seu DllMain função). Não fazer isso pode causar RegisterClass falha inesperadamente quando sua DLL é usada por outro aplicativo de cliente.

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index