Compartilhar via


TN001: inscrição de classe de janela

Esta nota descreve as rotinas MFC registrar especial WNDCLASS es necessários ao Microsoft Windows.Específico WNDCLASS atributos usados pelo MFC e Windows são discutidos.

O problema

Os atributos de um CWnd objeto como um HWND manipular no Windows, são armazenadas em dois lugares: o objeto de janela e o WNDCLASS. O nome do WNDCLASS é passado para funções de criação de janela Geral, sistema autônomo CWnd::criar e CFrameWnd::criar no lpszClassName parâmetro.

Este WNDCLASS deve ser registrado por meio de um dos quatro significa:

  • Implicitamente, usando um MFC fornecido WNDCLASS.

  • Implicitamente por subclassificação um controle do Windows (ou algum Outros controle).

  • Explicitamente chamando o MFC AfxRegisterWndClass ou AfxRegisterClass.

  • Explicitamente chamando a rotina Windows RegisterClass.

Campos WNDCLASS

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

Campo

Descrição

lpfnWndProc

proc da janela, deve ser um AfxWndProc

cbClsExtra

não usado (deve ser zero)

cbWndExtra

não usado (deve ser zero)

hInstance

preenchida automaticamente com AfxGetInstanceHandle

hIcon

ícone do quadro de janelas, consulte abaixo

hCursor

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

hbrBackground

cor do 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 ID do recurso especificado (por exemplo, AFX_IDI_STD_FRAME), o MFC usará esse recurso.Caso contrário, ele usará o recurso de padrão.O ícone, será usado ícone do aplicativo padrão e para o cursor, o cursor de seta padrão é usado.

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

CFrameWnd::LoadFrame registrará um WNDCLASS usando a ID do ícone você especificar sistema autônomo o primeiro parâmetro e sistema autônomo seguintes atributos padrão:

  • estilo de classe: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • ícone AFX_IDI_STD_FRAME

  • cursor de seta

  • Cor do plano de fundo COLOR_WINDOW

Os valores de cor do plano de fundo e o cursor para o CMDIFrameWnd não são usadas desde a área do o clienteCMDIFrameWnd completamente é coberto pela MDICLIENT janela.Microsoft não incentive dispondo em subclasse o MDICLIENT janela tão usar as cores padrão e tipos de cursores quando possível.

Subclassificação e Superclassing controles

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

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 seqüência de caracteres temporária do nome de classe gerada janela registrado.Para obter mais informações sobre essa função, consulte AfxRegisterWndClass.

A seqüência de caracteres retornada é um ponteiro temporário para um buffer de cadeia de caracteres estática.Ela é válida até a próxima telefonar ao AfxRegisterWndClass. Se você desejar manter essa seqüência de caracteres ao redor, armazene-o em um CString variável, sistema autônomo neste exemplo:

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

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

As funções AfxRegisterClass e RegisterClass

Se você desejar fazer algo mais que sofisticadaAfxRegisterWndClass fornece, você pode telefonar a API do Windows RegisterClass ou a função do MFC AfxRegisterClass. The CWnd, CFrameWnd and CMDIChildWnd Create functions take a lpszClassName string name for the window class as the first parameter.Você pode usar qualquer nome de classe janela registrados, independentemente do método usado para registrá-lo.

É importante usar AfxRegisterClass (ou AfxRegisterWndClass) em uma DLL no Win32. Win32 não remover automaticamente registro classes registrados por uma DLL, para que você explicitamente deve cancelar registro classes quando a DLL é finalizada.Usando AfxRegisterClass em vez de RegisterClass Isso é manipulado automaticamente para você. AfxRegisterClass mantém uma lista de classes exclusivos registrados pelo sua DLL e Cancelar serão automaticamente registro-los quando a DLL é encerrado. Quando você usa RegisterClass em uma DLL, você deve assegurar que todas as classes são ou não 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