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