Os controles ActiveX MFC: Pintar um controle ActiveX
Este artigo descreve o processo de pintura do controle ActiveX e como você pode alterar o código de pintura para otimizar o processo.(See Otimizando o desenho de controle para obter técnicas sobre como otimizar o desenho por não ter controles individualmente restauração objetos GDI selecionados anteriormente.Depois que todos os controles foi emitidos, o contêiner pode restauração automaticamente os objetos originais.)
Os exemplos neste artigo são de um controle criado pelo Assistente de controle ActiveX MFC com configurações padrão.Para obter mais informações sobre como criar um aplicativo de esqueleto controle usando o Assistente de controle MFC ActiveX, consulte o artigo Assistente de controle ActiveX MFC.
Os seguintes tópicos são abordados:
O processo geral para pintura um controle e o código criado pelo Assistente de controle ActiveX para oferecer suporte a pintura
Como otimizar o processo de pintura
Como pintar o controle usando metarquivos
O processo de pintura de um controle ActiveX
Quando os controles ActiveX são exibidos inicialmente ou são redesenhados, eles siga um processo de pintura semelhante a outros aplicativos desenvolvidos usando o MFC, com uma distinção importante: Os controles ActiveX podem estar em um estado inativo ou ativo.
Um controle ativo é representado em um contêiner de controle ActiveX por uma janela filho.Como outras janelas, é responsável pela pintura próprio quando um WM_PAINT mensagem é recebida. Classe base do controle, COleControlmanipula a esta mensagem no seu ,OnPaint função. Esta implementação padrão chama o OnDraw função de seu controle.
Um controle inativo é pintado diferente.Quando o controle está inativo, sua janela é invisível ou inexistente, para que ele não pode receber uma mensagem de pintura.Em vez disso, o controle contêiner chama diretamente o OnDraw função do controle. Isso difere pintura processo do controle ativo em que o OnPaint função de membro nunca seja chamada.
Conforme discutido nos parágrafos anteriores, sistema autônomo um controle ActiveX é atualizado depende do estado do controle.No entanto, como a estrutura chama o OnDraw função de membro em ambos os casos, você adicionar a maior parte do seu código de pintura nessa função de membro.
The OnDraw função de membro lida com pintura de controle. Quando um controle está inativo, o controle contêiner chama OnDraw, passando o contexto do contêiner de controle e as coordenadas da área retangular ocupada pelo controle.
O retângulo passado pela estrutura para o OnDraw função de membro contém a área ocupada pelo controle. Se o controle estiver ativo, o canto superior esquerdo é (0, 0) e o contexto de dispositivo passado para a janela filho que contém o controle.Se o controle estiver inativo, a coordenada do canto superior esquerdo não é necessariamente (0, 0) e o contexto de dispositivo passado para o contêiner de controle que contém o controle.
Observação: |
---|
É importante que as modificações OnDraw não dependem do ponto esquerdo superior do retângulo seja igual a (0, 0) e que você desenhar apenas dentro do retângulo passado para OnDraw. Poderão ocorrer resultados inesperados se você desenhar além da área do retângulo. |
A implementação padrão fornecida pelo MFC controle ActiveX Assistente de no arquivo de implementação de controle ActiveX (.CPP), mostrada abaixo, pinta o retângulo com um pincel branco e preenche a elipse com a cor do plano de fundo corrente.
void CMyAxUICtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
// TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
}
Observação: |
---|
Ao pintar um controle, você não deve fazer suposições sobre o estado do contexto de dispositivo é passado sistema autônomo o controlador de domínio primário o parâmetroOnDraw função. Ocasionalmente, o contexto de dispositivo é fornecido pelo aplicativo contêiner e não serão necessariamente inicializado ao estado padrão.Em particular, explicitamente selecionar canetas, pincéis, cores, fontes e outros recursos que depende de seu código de desenho. |
Otimizando o código do Paint
Depois que o controle com êxito é pintando propriamente dito, a próxima etapa é otimizar o OnDraw função.
A implementação padrão do controle ActiveX pintando pinta a área todo controle.Isso é suficiente para controles simples, mas em muitos casos o controle de redesenho seria mais rápido se apenas a parte necessária a atualização foi redesenhada, em vez de todo o controle.
The OnDraw função fornece um método fácil de otimização, passando rcInvalid, a área retangular do controle precisa redesenho. Use esta área, geralmente menores que a área todo controle, para acelerar o processo de pintura.
O controle usando metarquivos pintando
Na maioria dos casos, a pdc parâmetro para o OnDraw função aponta para um contexto de dispositivo de tela (DC). No entanto, ao imprimir imagens do controle ou durante uma sessão de visualização de impressão, o controlador de domínio recebida para renderização é um tipo especial chamado um "metarquivo DC".Ao contrário de uma tela DC, imediatamente trata as solicitações enviadas a ela, um metarquivo do controlador de domínio armazena as solicitações para ser reproduzido em um momento posterior.Alguns aplicativos recipientes também podem optar por processar a imagem do controle usando um controlador de domínio no modo de design do metarquivo.
Metarquivo desenho solicitações podem ser feitas pelo contêiner por meio de duas funções de interface: IViewObject::Draw (essa função também pode ser chamada para não-metarquivo de desenho) e IDataObject::GetData.Quando um metarquivo que DC é passado sistema autônomo um dos parâmetros, a estrutura do MFC faz uma telefonar para COleControl::OnDrawMetafile.Como esta é uma função de membro virtual substituir essa função na classe de controle para fazer qualquer processamento especial.O comportamento padrão chama COleControl::OnDraw.
Para certificar-se de que o controle pode ser desenhado na tela e Metarquivo contextos de dispositivo, você deve usar apenas as funções de membro suportados em uma tela e um metarquivo do controlador de domínio.Esteja ciente de que o sistema de coordenada não pode ser medido em pixels.
Porque a implementação padrão de OnDrawMetafile chamadas do controle OnDraw função de uso único membro funções que são adequados para um metarquivo e um contexto de dispositivo de tela, a menos que você substitua OnDrawMetafile. A seguir lista o subconjunto de CDC funções de membro que podem ser usadas em um metarquivo e um contexto de dispositivo de tela. Para obter mais informações sobre essas funções, consulte classe CDC in the Referência da MFC.
Arco |
BibBlt |
Corda |
---|---|---|
Elipse |
Escape |
ExcludeClipRect |
ExtTextOut |
FloodFill |
IntersectClipRect |
LineTo |
MoveTo |
OffsetClipRgn |
OffsetViewportOrg |
OffsetWindowOrg |
PatBlt |
Pie |
Polígono |
Polyline |
PolyPolygon |
RealizePalette |
RestoreDC |
RoundRect |
SaveDC |
ScaleViewportExt |
ScaleWindowExt |
SelectClipRgn |
SelectObject |
SelectPalette |
SetBkColor |
SetBkMode |
SetMapMode |
SetMapperFlags |
SetPixel |
SetPolyFillMode |
SetROP2 |
SetStretchBltMode |
SetTextColor |
SetTextJustification |
SetViewportExt |
SetViewportOrg |
SetWindowExt |
SetWindowORg |
StretchBlt |
TextOut |
|
Em adição a CDC funções de membro, há várias funções que são compatível em um metarquivo do controlador de domínio. Esses incluem CPalette::AnimatePalette, CFont::CreateFontIndirecttrês funções de membro de eCBrush: CreateBrushIndirect, CreateDIBPatternBrush, and CreatePatternBrush.
Funções que não são registradas em um metarquivo são: DrawFocusRect, DrawIcon, DrawText, ExcludeUpdateRgn, FillRect, FrameRect, GrayString, InvertRect, ScrollDC, e TabbedTextOut.Como um metarquivo do controlador de domínio não é realmente associado um dispositivo, não é possível usar SetDIBits GetDIBits e CreateDIBitmap com um metarquivo do controlador de domínio.Você pode usar SetDIBitsToDevice e StretchDIBits com um controlador de domínio de metarquivo sistema autônomo destino.CreateCompatibleDC, CreateCompatibleBitmap, and CreateDiscardableBitmap não são significativos com um metarquivo do controlador de domínio.
Outro ponto a considerar ao usar um metarquivo DC é o sistema de coordenada não pode ser medido em pixels.Por esse motivo, seu código desenho deve ser ajustado para se ajuste no retângulo passado para OnDraw no rcBounds parâmetro. Isso impede que acidental pintura fora do controle como rcBounds representa o dimensionar da janela do controle.
Depois de ter implementar renderização de metarquivo do controle, use contêiner de teste para testar o metarquivo.See Teste de propriedades e eventos com o contêiner de teste para obter informações sobre como acessar o contêiner de teste.
Para testar o metarquivo do controle usando o contêiner de teste
No edição menu, clicar Insira o novo controle.
No Insira o novo controle caixa, selecionar o controle e clicar OK.
O controle aparecerá no contêiner de teste.
Sobre o Controle menu, clicar Desenhar metarquivo.
Será exibida uma janela separada na qual o metarquivo é exibido.Você pode alterar o dimensionar da janela para ver como a escala afeta metarquivo do controle.Você pode fechar esta janela a qualquer momento.