Criação de Componente: Com Foco, mas sem seleção

Delphi

25/11/2003

Como criar um componente como um botão que possa receber o foco mas que não tenha o contorno pontilhado quando está com o foco?

Quero criar um componente, com praticamente as mesmas características do BitBt. Mas quero que o componente fique sem nenhum efeito 3d e sem aquele pontilhado contornando o componente quando o mesmo está com o foco. Mas o retalhe importante é que este componente tem que permitir ser selecionado com a tecla tab. Ao receber o foco a imagem vai mudar, igual como acontece quando passa o mouse em cima.


Raserafim

Raserafim

Curtidas 0

Respostas

Raserafim

Raserafim

25/11/2003

Quero apenas que ao receber o foco, não seja apresentado nenhuma mudança no botão, ou seja, não apareça o pontilhado que o windows coloca ao redor do botão.


GOSTEI 0
Beppe

Beppe

25/11/2003

O pontilhado faz parte da resposta padrão do botão, não há como evitar ele ser pintado, mas lembro que eu já consegui removê-lo.

Tem duas opções: subclasseamento ou herdar um novo controle. Herdar um novo controle é mais fácil.

type
  TButtonWithoutDots = class
  private
    procedure WMPaint(var Message: TWMPaint); WM_PAINT;
  end;

procedure TButtonWithoutDots.WMPaint(var Message: TWMPaint);
begin
  inherited;
  if Focused then
  begin
    Assert(Message.DC <> 0);
    DrawFocusRect(Message.DC, GetClientRect);
  end;
end;



GOSTEI 0
Raserafim

Raserafim

25/11/2003

Ataliba, fiz o seguinte para testar mas não deu certo:

Criei um novo componente herdando de TButton. Em sua declaração Private coloquei o procedimento:
procedure WMPaint(var Message: TWMPaint); Message WM_PAINT;
tive que acrescentar o Message antes do WM_Paint pois dava um erro ao compilar.
Utilizei o COde COmpletation (Ctrl + Shift + C) para criar o esqueleto do procedimento, então coloquei dentro:
inherited;
if Focused then
begin
Assert(Message.DC <> 0);
DrawFocusRect(Message.DC, GetClientRect);
Mas quando adiciono o componente e compilo o programa aparece um erro na classe EAssertionFailed e diz o número da linha do erro, que é a código:
Assert(Message.DC <> 0);

O que está faltando Ataliba?


GOSTEI 0
POSTAR