Compartilhar via


TN001: registro da classe Window

Essa observação descreve as rotinas de MFC que registra o especiais WNDCLASSes necessário pelo Microsoft Windows. Os atributos específicos de WNDCLASS MFC usados pelo e as janelas são discutidos.

O problema

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

Este WNDCLASS deve ser registrado em um dos quatro mídia:

  • Usando implicitamente WNDCLASSMFC fornecido.

  • Subclassing implicitamente um controle do windows (ou qualquer outro controle).

  • Chamar explicitamente o MFC AfxRegisterWndClass ou AfxRegisterClass.

  • Chamando explicitamente a rotina RegisterClassdo windows.

Campos de WNDCLASS

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

Campo

Descrição

lpfnWndProc

o processo de janela, deve ser AfxWndProc

cbClsExtra

não usado (deve ser zero)

cbWndExtra

não usado (deve ser zero)

hInstance

preenchida automaticamente com AfxGetInstanceHandle

hIcon

o ícone do windows do quadro, consulte abaixo

hCursor

o cursor para quando o mouse for na janela, consulta abaixo

hbrBackground

a cor do plano de fundo, consulte abaixo

lpszMenuName

não deve ser usado (NULL)

lpszClassName

o nome da classe, consulte abaixo

WNDCLASSes fornecido

Versões anteriores (MFC antes de MFC 4,0), desde que vários a janela predefinida classifica. Essas classes da janela não são fornecidas 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 MFC), o usará esse recurso. Se não usará o recurso padrão. Para o ícone, o ícone de aplicativo padrão é usado, e para o cursor, o cursor padrão de seta é usado.

Dois ícones oferecem suporte a aplicativos MDI com tipos de valor único documento: um ícone para o aplicativo principal, o outro ícone do documento/windows icônicos de MDIChild. Para vários tipos de documento com ícones diferentes, você deverá registrar WNDCLASSadicional es ou usar a função de CFrameWnd::LoadFrame .

CFrameWnd::LoadFrame registrará WNDCLASS usando a ID do ícone que você especifica 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

  • Cor do plano de fundo de COLOR_WINDOW

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

Controles de Subclassing e de Superclassing

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

A função de AfxRegisterWndClass

MFC O fornece uma função auxiliar para registrar uma classe da janela. Dado um conjunto de atributos (estilo da classe da janela, cursor, escova em segundo plano, e o ícone), um nome sintético é gerado, e a classe resultante da janela é 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 registrado gerado da janela. Para obter mais informações sobre essa função, consulte AfxRegisterWndClass.

A cadeia de caracteres retornado é um ponteiro para um buffer temporário estática da cadeia de caracteres. É válido até a próxima chamada a AfxRegisterWndClass. Se você quiser manter em relação a essa cadeia de caracteres, armazená-las em uma variável de CString , como neste exemplo:

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

AfxRegisterWndClass lançará CResourceException se a classe da janela não registrou (devido aos parâmetros inválidos, ou fora de memória do windows).

As funções de RegisterClass e de AfxRegisterClass

Se você quiser fazer nada mais sofisticado do que o AfxRegisterWndClass fornece, você pode chamar a API do windows RegisterClass ou a função AfxRegisterClassMFC. CWnd, CFrameWnd e funções de CMDIChildWndCreate têm um nome de cadeia de caracteres de lpszClassName para a classe da janela como o primeiro parâmetro. Você pode usar qualquer nome de classe registrado na janela, independentemente do método usado para registrar o.

É importante usar AfxRegisterClass (ou AfxRegisterWndClass) em uma DLL no Win32. O Win32 não faz automaticamente as classes o registro registradas por uma DLL, assim você deve cancelar explicitamente classes da DLL é encerrado. Usando AfxRegisterClass em vez de RegisterClass isso é tratado automaticamente para você. AfxRegisterClass mantém uma lista de classes exclusivas registradas pelo DLL e cancelará eles automaticamente quando o DLL termina. Quando você usa RegisterClass em uma DLL, você deve assegurar que todas as classes é registrado quando o é encerrado DLL (na função de DllMain ). A falha isso pode fazer com que RegisterClass falhar inesperadamente quando outro aplicativo cliente tenta usar o DLL.

Consulte também

Outros recursos

Observações técnicas por número

Observações técnicas por categoria