Criação de Componente: Com Foco, mas sem seleção
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.
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
Curtidas 0
Respostas
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
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.
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
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?
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