Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
我想把 Form 控制成不能放大/縮小/移動/關閉 的方式運作可是用 Delphi 的話呢,一直沒辦法作到不能關閉(把 systemmenu 拿掉會出問題)也沒辦法作到不能移動,user 常會把我的畫面拉著到處跑..再跟我說不能輸入,看不見....
請各位幫我想想辦法吧...:)
您可以覆寫 CreateParams() 這個 TWinControl 的虛擬程序, 改變 form的 wc.Style, 將 WS_SYSMENU 這個旗標解除, 這樣, 就不會有左上角的SystemMenuBox 了.
至於不能移動.縮小/放大, 可以自已攔下 WM_NCHITTEST, 然後一概回應滑鼠點在視窗的 Client 區域, 相信這個視窗就呆呆的不會動了.
詳情可以查一下 Win32API Help 的 CreateWindow() 與 WM_NCHITTEST 的說明.
信末是我試你問題時作的程式, 請參考看看; 另外, 視窗世界已經開始其傳統, 造出這樣一個視窗, 實在不能算高明, 所以, 最好還是能多與使用者溝通.
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST; protected procedure CreateParams(var Params: TCreateParams); override; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); with Params do Style := Style xor WS_SYSMENU; // 去除 SystemMenuBox // 如果要將視窗極大化, 請參考以下這行 //Style := Style xor WS_SYSMENU or WS_MAXIMIZE; end; procedure TForm1.Button1Click(Sender: TObject); begin Close; // 不可少, 因為已經使用者已經沒有其他方法關閉此視窗了 end; procedure TForm1.WMNCHitTest(var Msg: TMessage); begin inherited; // 這樣, 放大/縮小/移動都不可能了... Msg.Result := HTCLIENT; end; end.
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |