關鍵字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...