Delphi中正常視窗的實現

2021-04-12 18:33:13 字數 3119 閱讀 4769

關鍵字vcl,正常視窗,正常化

1 引言

用delphi所提供的vcl類庫編寫的windows應用程式,有乙個明顯不同於標準windows視窗的特點--主視窗的系統選單與工作列上的系統選單不相同。一般情況下,主視窗的系統選單有六個選單項而工作列系統選單只有三個選單項。實際使用中我們發現用vcl開發的程式有以下幾個方面的尷尬:

1)不夠美觀。這是肯定的,與標準不符自然會顯得有些畸形。

2)主視窗最小化時沒有動畫效果。

3)視窗不能正常與其它視窗排列平鋪。

4)工作列系統選單具有最高的優先順序。在存在模態視窗的情況下整個程式仍然可以被最小化,與模態視窗的設計相違背。

主視窗最小化動畫效果的問題在delphi 5.0以後的版本中已通過forms.pas中的showwinnoanimate函式解決,但其餘幾個問題則一直存在。儘管多數情況下這不會對應用程式帶來什麼影響,但在一些追求專業效果的場合確實不可接受的。由於c++ builder與delphi使用的是同一套類庫,所以上述問題同樣存在於使用c++ builder編寫的windows應用程式中。

在以前的文章裡(

阿甘的家

中可以找到),我已討論過這個問題,當時的敘述看起來基本上是一種取巧的方法,而我也是在偶然之中才找到那個方法的。本文的任務就是通過對vcl類庫作一些分析,說明那樣做的原理,其次再給出乙個只用3行**的方法,完完全全地解決delphi中這個"非正常視窗"的問題。

2 原理

2.1 應用程式的建立過程

programproject1;

uses

forms,

unit1in'unit1.pas' ;

begin

unitcontrols;

initialization

...initcontrols;

procedureinitcontrols;

begin

...ifnotislibrarythencreatehandle;

...end;

programtemplate;

uses

unitdllexein'unitdllexe.pas',

forms,

formmainin'formmain.pas' ,

...unitdllexe.pas**清單如下:

unitunitdllexe;

inte***ce

implementation

initialization

好了,編譯執行一下,我們看到,由於沒有建立隱藏視窗,原先工作列上的系統選單消失了,換成了主視窗的系統選單,主視窗也能夠與其它windows視窗正常排列平鋪。但帶來的問題是視窗無法最小化。怎麼回事呢?還是老方法,跟蹤一下。

2.3 主視窗最小化proceduretcustomform.wmsyscommand(varmessage: twmsyscommand);

begin

withmessagedo

begin

...withmessagedo

casemsgof

wm_syscommand:

casewparamand$fff0of

sc_minimize: minimize;

sc_restore: restore;

else

default;

...end;

...defwindowproc(fhandle, wm_syscommand, sc_minimize, 0);

//這裡fhandle值為0

...end;

3 實現

好了,既然aplication.handle實際上只是乙個在內部用來響應訊息的視窗控制代碼,而原本應該建立的看不見的視窗被我們去掉了,那我們只需要給出乙個視窗的控制代碼,用來代替那個原本多餘的隱藏視窗的控制代碼不就行了?這樣的視窗去**找?應用程式的主視窗正是上上之選,於是有了下面的**。

programtemplate;

uses

unitdllexein'unitdllexe.pas',

forms,

formmainin'formmain.pas' ;

begin

於是,一切問題都解決了。你不需要對vcl原始碼作任何修改,不需要對原有的程式作任何修改,只要在工程檔案中增加兩行**,加上unitdllexe.pas中的一行,共三行**,即可使得你的應用程式視窗完全和任何乙個標準windows視窗一樣正常。

1)工作列和視窗標題欄擁有一致的系統選單。

2)主視窗最小化時有動畫效果。

3)視窗能夠正常與其它視窗排列平鋪。

4)存在模態視窗時不能對其父視窗進行操作。

以上實現**使用於delphi的所有版本。

delphi 實現無視窗移動

procedure imglistmousedown sender tobject button tmousebutton shift tshiftstate x,y integer private procedure wmnchittest var msg twmnchittest message...

DELPHI中的視窗管理

先思考乙個問題,為什麼每個delphi程式 泛指乙個exe 都會在工作列上有乙個類似button的東西呢?這是因為有了視窗才會有這個東東出現。那什麼樣的視窗可以會在工作列出現button東東呢?讓我們進入delphi源 吧!由於視窗具有ws popup特性,且最主要的是,在createwindow時...

用Delphi7 0實現漂亮的漢字視窗

在視覺化開發的時代,窗體是絕大部分應用程式的核心,但是開發者也許已對windows一成不變的方形窗體感到厭煩。其實巧妙地使用api函式即可實現漢字形狀的窗體。本文的例項執行後將顯示乙個由 電腦報 三個漢字作為外形的窗體。當然你還可以利用本期講的方法實現更有個性的漢字視窗。設計思路 1 使用begin...