亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

定制任務欄上的系統菜單

2019-11-17 05:10:11
字體:
來源:轉載
供稿:網友
  通常,當我們在特定的場合或是在多應用的環境運行自己或其他的應用程序時, 會在多窗口之間進行頻繁的切換,以實施實時的交互得到所期望的結果,對于這樣的“笨”辦法,我們會不厭其煩地進行好多次,甚至是無數次。
好在Win 9x 在任務欄上顯示了我們所運行或期望的程序,并配備了相應的右鍵系統彈出菜單,使我們在使用時方便多了。問題是那些都是缺省的系統菜單(命令),對于我們來說沒太大的幫助,下面我所介紹的就是利用Win9x 為我們設定的任務欄系統菜單來達到快速、簡捷的獲取信息(執行命令)的目的。提到系統菜單,就讓我們聯想到底層的 WIN32系統調用:AppendMenu、Inert- Menu、ModifyMenu。僅此三個函數,就足可以讓我們對缺省的系統菜單進行定制,應用自如了。為簡單起見,本文就 AppendMenu 進行一些介紹,其余的請朋友們參WIN32API 幫助文件。以下是: AppendMenu 函數原型: BOOL AppendMenu(
HMENU hMenu, // 要定制的菜單句柄
UINT uFlags, // 怎樣定制菜單項
UINT uIDNewItem, // 要定制的菜單項標識或子菜單句柄
LPCTSTR lpNewItem // 要定制的菜單項(字串)
);
在 AppendMenu 函數里,lpNewItem 和 uIDNewItem 參數依靠 uFlags 的不同
標志而有所變化,讓我們來看一看 uFlags 到底有那一些定義值:

MF_BITMAP 指明該菜單項是一位圖,在 lpNewItem 參數代表位圖句柄
MF_CHECKED 在菜單項的前面放上一個“選中”標記
MF_DISABLED 屏蔽該菜單項,但不象平常那樣變成灰色
MF_ENABLED 與 MF_DISABLED 相反
MF_GRAYED 除了有 MF_DISABLED 的作用以外,還把該菜單項變灰
MF_MENUBREAK 把該菜單與現有菜單并排放在一起
MF_MENUBARBREAK 與 MF_MENUBREAK 相同,除了在中間放一條豎線外
MF_OWNERDRAW 表明該菜單項為自繪菜單項,還必須處理一切的顯示、更新問題
MF_POPUP 該菜單項為一子菜單,uIDNewItem 參數代表其句柄
MF_SEPARATOR 與上一菜單項畫上一分割線,系統將忽略 lpNewItem 和
uIDNewItem 參數
MF_STRING 該菜單項是一文本字串,lpNewItem 是其內容
MF_UNCHECKED 取消該菜單項前面的“選中”標記
  我們看到,除了MF_POPUP,MF_BITMAP,MF_OWNERDRAW以外,MF_STRING是最常用的菜單? 義方法,uIDNewItem在這里是命令消息的wParam參數。朋友們還記得獲取普通菜單的句柄用GetMenu,那么獲取系統菜單的句柄就應該用GetSyst-emMenu。這時有一個問題:程序怎么知道該獲取的系統菜單是窗口上的系統菜單,還是任務欄上的系統菜單呢?這就依靠傳遞給GetSystemMenu的是哪一個參數。因為我們當前考慮的是任欄,因此這個參數就必須是application.Handle。假如這時候就著手編制一個PRoject檢驗一下,朋友們就會發現...“我”定義的菜單怎么沒有反應!原來該菜單項根本沒有在Application里處理過。顯然,我們還得過濾一下傳到Application的WM_SYSCOMMAND消息。為了加深了解,我們首先追加一個簡單的任務欄系統菜單: Unit AddMenuDemo;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,Menus;
type
TDemoForm = class(TForm)
procedure FormCreate(Sender: TObject);
...
private
{ Private declarations }
// 我的消息過濾器
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
...
public
{ Public declarations }
...
end;

var
DemoForm1: TDemoForm;
implementation
const
My_SimpleCMD1 = WM_USER + 1; // 定義三個用戶消息,用來處理菜單項被點擊
// 時相應的動作
My_SimpleCMD2 = WM_USER + 2;
My_SimpleCMD3 = WM_USER + 3;
...
procedure TDemoForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage; //定義自己的消息處理過程
//定義了提交、反饋、處理三個菜單項
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_STRING,
My_SimpleCMD1,提交);
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_STRING,
My_SimpleCMD2,反饋);
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_SEPARATOR,
0, ); // 定義一分割線
AppendMenu(GetSystemMenu(Application.Handle, FALSE),MF_STRING,
My_SimpleCMD3,處理);

end;

procedure TDemoForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
// 定制自己的消息處理過程
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = My_SimpleCMD1) then
begin
ShowMessage(正在提交...);
Handled := True;
...
end;
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = My_SimpleCMD2) then
begin
ShowMessage(正在反饋...);
Handled := True;
...
end;
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = My_SimpleCMD3) then
begin
ShowMessage(正在處理...);
Handled := True;
...
end;
end;
....
   當我們處理的事務比較多并且可分組,以上的做法就比較煩瑣,這時就應該定義成多個 MF_POPUP ,其各個子菜單除了uIDNewItem 傳遞這個子菜單的句柄外,另外獨特之處在于消息過濾器的 Msg.wParam 是各個菜單項的 Command。這個Command是在構建 TPopupMenu 時就定義了。無論是否是 MenuItem 或 PopupMenu,其Command的值都是順序遞增的。以下是一范例:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem; // Caption := 范例一;
N2: TMenuItem; // Caption := 范例二;
N3: TMenuItem; // Caption := 范例三;
procedure FormCreate(Sender: TObject);
...
private
{ Private declarations }
// 我的消息過濾器
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
...
public
{ Public declarations }
...
end;
...

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage; //定義自己的消息處理過程
// 定義一分割線
AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_SEPARATOR, 0, );
// 定義提交子菜單
AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_POPUP,
PopupMenu1.Handle,提交);
end;

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
// 定制自己的消息處理過程
if (Msg.message = WM_SYSCOMMAND) AND (Msg.wParam $#@60; WM_USER) then
begin
Case Msg.wParam of
// N1.Command = 1
1:ShowMessage(范例一 Command:+ IntToStr(N1.Command));
// N1.Command = 2
2:ShowMessage(范例二 Command:+ IntToStr(N2.Command));
// N1.Command = 3
3:ShowMessage(范例三 Command:+ IntToStr(N3.Command));
end;
Handled := True;
end;
...
end;
...
  可以看出,MF_STRING 與 MF_POPUP 在消息處理機制上是稍微有點不同的,另外,假如要在菜單前面加上圖標的話,這在Delphi 4.x、Delphi 5.x 版本下是不成問題,假如是在 Delphi 3.x 下的話,只要定義成自繪 MenuItem即可,不過稍許復雜了一點。在應用過程中,需要提醒的是,這幾組定義不能一起使用:A. MF_DISABLED, MF_ENABLED, 和 MF_GRAYED
B. MF_BITMAP, MF_STRING, 和 MF_OWNERDRAW
C. MF_MENUBARBREAK 和 MF_MENUBREAK
D. MF_CHECKED 和 MF_UNCHECKED

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产欧美一区二区三区同亚洲| 日韩天堂在线视频| 日韩精品免费在线视频| 国模吧一区二区| 韩国v欧美v日本v亚洲| 日韩av在线一区二区| 黑人精品xxx一区一二区| 国产性猛交xxxx免费看久久| 国内精品一区二区三区| 日韩免费在线视频| 亚洲精品中文字幕女同| 久久精品视频导航| 久久精品视频在线播放| 久久久亚洲国产天美传媒修理工| 亚洲精品一区中文| 狠狠久久亚洲欧美专区| 亚洲精品福利资源站| 一本色道久久88亚洲综合88| 亚洲精品aⅴ中文字幕乱码| 亚洲激情 国产| 在线精品国产欧美| 久久久亚洲精品视频| 欧美在线视频免费| www.美女亚洲精品| 久久97久久97精品免视看| 人体精品一二三区| 91视频8mav| 欧美国产中文字幕| 日韩美女毛茸茸| 欧美在线视频免费| 亚洲最大福利网| 91精品中文在线| 91在线免费网站| 亚洲女人天堂视频| x99av成人免费| 午夜精品免费视频| 日韩成人小视频| 国产精品高潮在线| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品视频在线播放| 日韩美女免费视频| 欧美激情在线观看视频| 97国产在线观看| 成人在线播放av| 国产精品啪视频| 久久精品99国产精品酒店日本| 色妞欧美日韩在线| 日韩免费电影在线观看| 国产一区二区三区三区在线观看| 国产精品xxxxx| 国产91av在线| 中日韩美女免费视频网站在线观看| 2019中文字幕全在线观看| 国产精品美女免费看| 日韩免费电影在线观看| 久久综合久久美利坚合众国| 国产精品99久久久久久www| 影音先锋欧美精品| 色婷婷综合久久久久中文字幕1| 国产精品亚洲片夜色在线| 亚洲小视频在线观看| 日韩av手机在线观看| 国产精品久久久久久久久久免费| 欧美老女人www| 97精品视频在线播放| 亚洲国产精品嫩草影院久久| 中文字幕免费国产精品| 91亚洲精品在线| 亚洲高清一区二| 亚洲福利在线看| 中文一区二区视频| 日本一欧美一欧美一亚洲视频| 中文字幕亚洲一区二区三区五十路| 最近2019中文字幕一页二页| 欧美日韩在线免费| 岛国av午夜精品| 国产一区二区三区久久精品| 亚洲欧美日韩爽爽影院| 亚洲理论电影网| 日韩经典中文字幕| 久久精品国产精品亚洲| 色偷偷综合社区| 久久久女人电视剧免费播放下载| 精品久久久久久久久久ntr影视| 欧美美女操人视频| 色噜噜久久综合伊人一本| 亚洲人成电影在线观看天堂色| 日韩中文字幕在线免费观看| 亚洲成av人片在线观看香蕉| 国产www精品| 亚洲aaa激情| 国产精品久久久| 美女扒开尿口让男人操亚洲视频网站| 在线国产精品播放| 国产91精品最新在线播放| 最新中文字幕亚洲| 久久久久久久久久久免费| 欧美xxxx综合视频| 久久久免费精品| 亚洲成人网在线| 亚洲免费视频网站| 国产乱肥老妇国产一区二| 亚洲自拍欧美色图| 亚洲欧洲av一区二区| 国产大片精品免费永久看nba| 欧美中文字幕精品| 国产欧美一区二区三区久久人妖| 欧美激情亚洲综合一区| 国产v综合v亚洲欧美久久| 国产综合福利在线| 成人午夜高潮视频| 国产日韩欧美在线| 日韩av手机在线看| 精品国内亚洲在观看18黄| 亚洲国产精品久久久久久| 国产成人精品久久亚洲高清不卡| 国产精品视频在线播放| 国产精品亚洲精品| 久久久久久久av| 欧美大码xxxx| 欧美精品电影免费在线观看| 黑人巨大精品欧美一区二区| 日韩在线观看免费全| 狠狠色噜噜狠狠狠狠97| 欧美日韩在线视频一区二区| 成人黄色免费看| 国产有码在线一区二区视频| 97色在线视频观看| 色偷偷av一区二区三区| 狠狠综合久久av一区二区小说| 亚洲色图13p| 91免费在线视频网站| 亚洲a中文字幕| 日韩欧美在线中文字幕| 欧美在线亚洲在线| 日韩av影视综合网| 91精品国产91久久久久久久久| 97久久超碰福利国产精品…| 日韩精品免费在线视频| 亚洲欧洲一区二区三区在线观看| 亚洲综合国产精品| 92版电视剧仙鹤神针在线观看| 欧美激情一区二区三区在线视频观看| 日韩久久精品成人| 亚洲国产精久久久久久| 伦伦影院午夜日韩欧美限制| 亚洲欧美日韩高清| 亚洲国产精品yw在线观看| 国产日韩欧美在线观看| 亚洲精品久久久久久久久| 人人澡人人澡人人看欧美| 国产成人精品日本亚洲| 欧美成人精品xxx| 国产午夜精品免费一区二区三区| 欧美二区乱c黑人| 亚洲偷欧美偷国内偷| 欧美成人在线影院| 欧美有码在线观看视频| 欧美性极品少妇精品网站| 欧美一区二区三区四区在线| 中文字幕亚洲欧美日韩高清| 成人激情视频网| 日本久久久久久久久| 欧美国产精品人人做人人爱|