DELPHI美化界面(2009開始TPanel增加了ParentBackGround)


1.透明問題。

要重新調整界面確實很麻煩,以前用DELPHI開發的界面都很土,和WEB真是沒辦法比。(我以前用的是DELPHI7),現在回想起來,DELPHI難做的原因是:沒有透明控件。所有控件都是不透明的,並且大部分控件就是灰色的,一放到窗體上,就像一塊膏葯一樣貼在上面。即使界面上放幾副圖片也難以和控件的那種灰灰的顏色融合起來。所以,一直在想QQ是怎么開發的。還是挺佩服騰訊那幫家伙的。

后來打開DELPHI2009,竟然發現有些控件支持背景,特別是PANEL控件,比以前增加了一個ParentBackGround屬性。這個發現讓我激動萬分。透明問題解決了一般,雖然不能像WPF或者FLAX那樣設置透明度,但是至少能和背景融合,不會像一塊膏葯了。這樣就使得在窗體上放置圖片成了可能。

2.按鈕控件

隨后有產生了一個新的問題,就是按鈕。不管用什么類型的按鈕,都是灰色的,沒有顏色設置屬性。即使使用SPEEDBUTTON,FLAT屬性設置成TRUE,當鼠標移上去 的時候,還是會出現一個和圖片和不吻合的灰框,非常難看。

   

我想要讓這個灰框完全和背景融合,根本沒辦法做到,打開SPEEDBUTTON的代碼,在他的Paint方法里發現如下代碼:

Details := ThemeServices.GetElementDetails(ToolButton);

ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect);

PaintRect := ThemeServices.ContentRect(Canvas.Handle, Details, PaintRect);

原來DELPHI在畫一個按鈕的時候,不管如何情況,都需要調用ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect);也就是使用WINDOWS操作系統的主題畫一個按鈕。而WINDOWS操作系統的主題默認設置是灰的。就是這個原因導致了這個膏葯的產生。研究了半天代碼,沒有發現DELPHI提供如何方法或者事件來屏蔽使用操作系統主題畫按鈕的這段代碼。實在沒轍,只能自己寫一個SPEEDBUTTON控件。

這個控件很簡單,就把SPEEDBUTTON控件的代碼抄抄過來,然后屏蔽掉ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect);就可以畫一個只有圖片的SPEEDBUTTON了。

3.PAGECONTROL

由於我們現在這個項目用到了大量的PAGECONTROL,但是正常情況下這個PAGECONTROL是沒有ParentBackGround,同樣會在背景上出現一個灰色的邊框.

由於項目需要,PAGECONTROL的TAB頁還需要增加一個關閉按鈕,為了偷懶,用OWNERDROW,自己畫了一個X進去,這樣的結果導致畫面更加難看。邊框一條粗粗的線條沒辦法取消掉。繼續研究TABECONTROL代碼。發現,當STYLE設置成非tsTabs的時候,就回取消掉邊框。

這個發現意味着PAGECONTROL還是可以用的,只不過TAB需要自己畫。研究了半天騰訊TT,發現他的PAGECONTROL的頭是用圖片和一些特效畫出來的,其實做起來也挺簡單的,只不過要坐一些各種線條的圖片。偷個懶,先不用圖片畫一個。

鑒於前面的發現,現在的PANEL是支持透明的,就用PANEL畫一個TAB頁的頭。

這樣就可以用這個控件去控制PAGECONTROL了。當然這個控件的關閉按鈕還是使用了SPEEDBUTTON,如果換成前面的自己寫的SPEEDBUTTON,並且用圖片,就會有很好的效果了。

有了這個基礎,在在這些PANEL上設置圖片的話,就可以很方便的做到很漂亮的效果了。

4.沒有CAPTION的窗體

WINDOWS默認的窗體的最上面都是一個藍色條的CAPTION,並且右邊只有三個系統按鈕,如果想自己加一個也不方便。如果整個窗體風格采用圖片的畫,着條藍色的先非常不和諧。所以必須取消掉。

   

實現方法很簡單,把窗體的BorderStyle設置成bsNone,就沒有邊框了。然后就是放置圖片,由於PANEL支持透明,不存在任何問題,右上方放置3個用前面提到的自己開發的SPEEDBUTTON。然后就是要實現圓角和畫邊框。

代碼如下:

unit Unit1;

   

interface

   

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, HlCaptionPnl, pngimage, StdCtrls;

   

type

TForm1 = class(TForm)

imgLeft: TImage;

HlCaptionPanel1: THlCaptionPanel;

Memo1: TMemo;

imgRight: TImage;

procedure FormCreate(Sender: TObject);

private

hr:THandle;

{ Private declarations }

procedure WMNCHitTest(var Msg:TWMNCHitTest); message WM_NCHITTEST;

procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT;

   

procedure DrawFormLine;

procedure CreateHr;

protected

procedure Resize; override;

   

public

{ Public declarations }

end;

   

var

Form1: TForm1;

   

implementation

   

{$R *.dfm}

   

procedure TForm1.CreateHr;

begin

// hr:=CreateRoundRectRgn(0,21,Width,Height,80,80);

hr:=CreateRoundRectRgn(0,0,Width,Height,10,10);

SetWindowRgn(handle,hr,true);

end;

   

procedure TForm1.DrawFormLine;

var

dc: hDc;

Pen: hPen;

OldPen: hPen;

OldBrush: hBrush;

begin

dc := GetWindowDC(Handle);

Self.Refresh;

   

Pen := CreatePen(PS_SOLID, 1, RGB(0, 0, 200));

// Pen := CreatePen(PS_SOLID, 2, RGB(18, 49, 99));

// Pen := CreatePen(PS_SOLID, 1, RGB(0, 255, 0));

OldPen := SelectObject(dc, Pen);

OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));

RoundRect(dc,0,0,Width - 1,Height - 1,10,10);

// RoundRect(dc,1,1,Width - 1,Height - 1 ,15,15);

SelectObject(dc, OldBrush);

SelectObject(dc, OldPen);

DeleteObject(Pen);

   

// Pen := CreatePen(PS_SOLID, 1, RGB(255, 255, 255));

Pen := CreatePen(PS_SOLID, 1, RGB(137, 245, 255));

OldPen := SelectObject(dc, Pen);

OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));

// Self.Refresh;

RoundRect(dc,1,1,Width - 2,Height - 2,10,10);

SelectObject(dc, OldBrush);

SelectObject(dc, OldPen);

DeleteObject(Pen);

   

   

ReleaseDC(Handle, Canvas.Handle);

   

end;

   

procedure TForm1.FormCreate(Sender: TObject);

begin

CreateHr;

   

imgRight.Left := ClientWidth - imgRight.Width;

imgRight.Top := 0;

imgLeft.Left := 0;

imgLeft.Width := imgRight.Left;

imgLeft.Top := 0;

HlCaptionPanel1.ShowButton('D:\Nouse\delphi2009Test\界面\CapPanel2\Bmp\Button\CloseButton.bmp',

'D:\Nouse\delphi2009Test\界面\CapPanel2\Bmp\Button\MaxButton.bmp',

'D:\Nouse\delphi2009Test\界面\CapPanel2\Bmp\Button\MinButton.bmp',

'D:\Nouse\delphi2009Test\界面\CapPanel2\Bmp\Button\RestoreButton.bmp');

   

end;

   

procedure TForm1.Resize;

begin

inherited;

CreateHr;

end;

   

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);

var

tmpPoint: TPoint;

const

C_BORDERWIDTH = 4;

begin

tmpPoint.X := Msg.Pos.x;

tmpPoint.Y := Msg.Pos.y;

   

tmpPoint := ScreenToClient(tmpPoint);

   

Memo1.Lines.Add('x:' + IntToStr(tmpPoint.X) + 'y:' + IntToStr(tmpPoint.X));

if (tmpPoint.x <= C_BORDERWIDTH) and (tmpPoint.y <= C_BORDERWIDTH) then

begin

Msg.Result := HTTOPLEFT;//左上

end else

if (tmpPoint.x <= C_BORDERWIDTH) and (tmpPoint.y >= Height - C_BORDERWIDTH) then

begin

Msg.Result := HTBOTTOMLEFT;//左下

end else

if (tmpPoint.x >= Width - C_BORDERWIDTH) and (tmpPoint.y <= C_BORDERWIDTH) then

begin

Msg.Result := HTTOPRIGHT;//右上

end else

if (tmpPoint.x >= Width - C_BORDERWIDTH) and (tmpPoint.y >= Height - C_BORDERWIDTH) then

begin

Msg.Result := HTBOTTOMRIGHT;//右下

end else

if (tmpPoint.x <= C_BORDERWIDTH) then

begin

Msg.Result := HTLEFT;//左

end;

if (tmpPoint.x >= Width - C_BORDERWIDTH) then

begin

Msg.Result := HTRIGHT;//右

end;

if (tmpPoint.Y <= C_BORDERWIDTH) then

begin

Msg.Result := HTTOP;//上

end;

if (tmpPoint.y >= Height - C_BORDERWIDTH) then

begin

Msg.Result := HTBOTTOM;//下

end;

   

end;

   

procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);

begin

DrawFormLine;

   

   

end;

   

end.

   

這樣界面的美化技術工作基本完成了。

主窗體如下:

接下去的工作就是交給美工,制作圖片和選擇顏色。

5.最后美工給我的結果

(還不是很滿意,繼續修改)

 

http://blog.csdn.net/zang141588761/article/details/51355221


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM