O artigo anterior apresenta o aplicativo simples de dica, e este artigo dará um exemplo de personalização do Windows. Esta janela de dica personalizada tem um bom efeito, com vidro como borda e um efeito de sombra.
No entanto, antes disso, devemos introduzir como personalizá -lo. Vamos dar uma olhada em vários métodos virtuais, o CreateParams define o estilo da janela, queremos substituí -lo para que ele não tenha fronteiras. O NCPaint desenha a borda da janela e também precisamos cobri -la, porque não precisamos da borda. A tinta é mais importante, por isso deve ser abordada no conteúdo da área de cliente da janela. Mas o mais importante é o ActivateHint, que definirá o tamanho da janela e exibirá. A implementação desta classe é dada abaixo:
unidade wdhintwnd;
interface
usos
Windows, classes, controles, gráficos, formulários, sysutils, extctrls;
tipo
Twdhintwnd = classe (thintwindow)
Privado
FWNDBMP: TBITMAP;
Fhintbmp: tbitmap;
protegido
Procedimento CreateParams (Var Params: TCreateParams);
Pintura de procedimento;
procedimento ncpaint (dc: hdc);
{Desenhe o prompt de imagem}
procedimento drenghintimg (bmp: tbitmap; ahint: string);
{Obtenha a imagem da área de desktop correspondente à janela imediata}
Procedimento getDesktopimg (BMP: TBITMAP; R: Trect);
{Trate a imagem da área da área de trabalho para fazê -la parecer um pedaço de vidro com uma pequena sombra}
Procedimento eFeCtHandle (WNDBMP, HINTBMP: TBITMAP);
público
Construtor Create (Anowner: TComponent);
destruidor destruir;
Procedimento ActivateHint (Rect: Trect; const ahint: string);
fim;
Implementação
{Twdhintwnd}
procedimento twdhintwnd.activateHint (ret: Trect; const ahint: string);
var
P: TPOint;
Começar
// Obtenha um tamanho apropriado para exibir o texto aqui
Fhintbmp.width: = rect.right - ret.left;
Fhintbmp.Height: = ret.Bottom - Rect.top + 4;
Drawhintimg (fhintbmp, ahint);
Fwndbmp.width: = rect.right - ret.left + 23;
FwnDBMP.Height: = Rect.Bottom - Rect.top + 27;
Inc (Rect.right, 23);
Inc (Rect.Bottom, 27);
BoundsRect: = Rect;
se deixado <screen.desktopleft então
Esquerda: = screen.desktopleft;
Se top <screen.desktoptop, então
Topo: = screen.desktoptop;
Se esquerda + width> screen.desktopwidth então
Esquerda: = screen.desktopwidth - largura;
Se top + altura> Screen.desktophEight, então
Topo: = screen.desktopheight - altura;
Getdesktopimg (fwndbmp, boundsRect);
EffetHandle (fwnDBMP, fhintbmp);
P: = clienttoscreen (ponto (0, 0));
SetWindowPos (Handle, hwnd_top mais, px, py, 0, 0,
Swp_showwindow ou swp_noactivate ou swp_nosize);
fim;
construtor twdhintwnd.create (awner: tComponent);
Começar
herdado;
FwnDBMP: = tbitmap.create;
Fwndbmp.pixelformat: = pf24bit;
Fhintbmp: = tbitmap.create;
fim;
procedimento twdhintwnd.createParams (var params: tcreateParams);
Começar
herdado;
// Remova a borda da janela
Params.style: = params.style e não ws_border;
fim;
destruidor twdhintwnd.destroy;
Começar
Fwnndbmp.free;
Fhintbmp.free;
herdado;
fim;
procedimento twdhintwnd.getdesktopimg (bmp: tbitmap; r: Trect);
var
C: Tcanvas;
Começar
C: = tcanvas.create;
tentar
C.Handle: = getDC (0);
BMP.CANVAS.COPRECT (RECT (0, 0, BMP.Width, BMP.Height), C, R);
Finalmente
C.Free;
fim;
fim;
procedimento twdhintwnd.efefectHandle (wndbmp, hintbmp: tbitmap);
var
R: Trect;
I, J: Inteiro;
P: Pbytearray;
Transst, transstangle: número inteiro;
Começar
R: = ret (0, 0, wndbmp.width - 4, wndbmp.Height - 4);
Frame3d (wndbmp.canvas, r, clmedgray, clbtnshadow, 1);
// seja um efeito de sombra sob a janela
Transst: = 60;
para j: = wndbmp.Height - 4 a wndbmp.Height - 1 do
Começar
P: = wndbmp.scanline [j];
Transstangle: = transst;
para i: = 3 a wndbmp.width - 1 do
Começar
// se estiver no canto inferior direito
Se i> wndbmp.width - 5 então
Começar
P [3*i]: = p [3*i]*transstangle div 100;
P [3*i + 1]: = p [3*i + 1]*transstangle div 100;
P [3*i + 2]: = p [3*i + 2]*transstangle div 100;
Transstangle: = transstangle + 10;
se transstangam> 90, então transstangle: = 90;
fim
mais começam
P [3*i]: = p [3*i]*transst div 100;
P [3*i + 1]: = p [3*i + 1]*transst div 100;
P [3*i + 2]: = p [3*i + 2]*transst div 100;
fim;
fim;
Transst: = transst + 10;
fim;
// seja um efeito de sombra no lado direito da janela
para j: = 3 a wndbmp.Height - 5 do
Começar
P: = wndbmp.scanline [j];
Transst: = 60;
para i: = wndbmp.width - 4 a wndbmp.width -1 do
Começar
P [3*i]: = p [3*i]*transst div 100;
P [3*i + 1]: = p [3*i + 1]*transst div 100;
P [3*i + 2]: = p [3*i + 2]*transst div 100;
Transst: = transst + 10;
fim;
fim;
Wndbmp.canvas.draw (10, 10, hintbmp);
fim;
procedimento twdhintwnd.ncpaint;
Começar
// Recarregar não permite desenho de fronteira
fim;
procedimento twdhintwnd.paint;
Começar
Canvas.coPirect (clientRect, fwndbmp.canvas, clientRect);
fim;
procedimento twdhintwnd.drawhintimg (bmp: tbitmap; ahint: string);
var
R: Trect;
Começar
Bmp.canvas.brush.color: = Application.hintcolor;
Bmp.canvas.pen.color: = Application.hintcolor;
Bmp.canvas.rectangle (0, 0, bmp.width, bmp.Height);
Bmp.canvas.font.color: = screen.hintfont.color;
R: = ret (0, 0, bmp.width, bmp.Height);
Inc (R.Left, 2);
Inc (R.Top, 2);
DrawText (bmp.canvas.handle, pchar (ahint), -1, r, dt_left ou dt_noprefix ou
Dt_wordbreak ou drawtextbidimodeFlagSreadingOnly);
fim;
Inicialização
Application.showhint: = false;
HINTWindowClass: = TWDHINTWND;
Application.showhint: = true;
fim.
Basta adicionar a unidade ao seu projeto e executar o programa para ver o efeito.
As partes importantes do programa foram comentadas e aqui estão apenas alguns pontos importantes, antes de tudo, inicialização
Em parte, aqui, defina a apresentação do aplicativo como false, observe o código -fonte VCL e saiba que o aplicativo destruiu uma HintWindow, e a definição de HintWindowclass é a seguinte:
Thintwindowclass = classe de Thintwindow;
HintWindowclass: ThintWindowclass = ThintWindow;
Aqui, substituímos o TWDHINTWND e, finalmente, defina o Showhint como TRUE.
No método ActivateHint, processaremos o efeito. da janela imediata, para que haja transparência, o efeito é agora. Em segundo lugar, desenhe a borda do vidro e finalmente faça um efeito de sombra na direita e na parte inferior da janela.
Em relação à implementação de efeitos de sombra, a tecnologia Alpha é usada.
Dst.red = src.red * alpha + (1-alfa) * dst.red;
Dst.green = src.green * alpha + (1-alfa) * dst.green;
Dst.blue = src.blue * alpha + (1-alfa) * dst.blue;
O valor do alfa está entre 0 e 1, o que significa completamente opaco quando é 1, mas a cor que usaremos para misturar é preta, ou seja, 0, então, o que o código acima vê é o seguinte:
P [3*i]: = p [3*i]*transstangle div 100;
O princípio da janela prompt de vidro é aproximadamente assim. Mas como uma janela rápida, acho que é o suficiente.