国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

定制任務(wù)欄上的系統(tǒng)菜單

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

MF_BITMAP 指明該菜單項(xiàng)是一位圖,在 lpNewItem 參數(shù)代表位圖句柄
MF_CHECKED 在菜單項(xiàng)的前面放上一個(gè)“選中”標(biāo)記
MF_DISABLED 屏蔽該菜單項(xiàng),但不象平常那樣變成灰色
MF_ENABLED 與 MF_DISABLED 相反
MF_GRAYED 除了有 MF_DISABLED 的作用以外,還把該菜單項(xiàng)變灰
MF_MENUBREAK 把該菜單與現(xiàn)有菜單并排放在一起
MF_MENUBARBREAK 與 MF_MENUBREAK 相同,除了在中間放一條豎線外
MF_OWNERDRAW 表明該菜單項(xiàng)為自繪菜單項(xiàng),還必須處理一切的顯示、更新問題
MF_POPUP 該菜單項(xiàng)為一子菜單,uIDNewItem 參數(shù)代表其句柄
MF_SEPARATOR 與上一菜單項(xiàng)畫上一分割線,系統(tǒng)將忽略 lpNewItem 和
uIDNewItem 參數(shù)
MF_STRING 該菜單項(xiàng)是一文本字串,lpNewItem 是其內(nèi)容
MF_UNCHECKED 取消該菜單項(xiàng)前面的“選中”標(biāo)記
  我們看到,除了MF_POPUP,MF_BITMAP,MF_OWNERDRAW以外,MF_STRING是最常用的菜單? 義方法,uIDNewItem在這里是命令消息的wParam參數(shù)。朋友們還記得獲取普通菜單的句柄用GetMenu,那么獲取系統(tǒng)菜單的句柄就應(yīng)該用GetSyst-emMenu。這時(shí)有一個(gè)問題:程序怎么知道該獲取的系統(tǒng)菜單是窗口上的系統(tǒng)菜單,還是任務(wù)欄上的系統(tǒng)菜單呢?這就依靠傳遞給GetSystemMenu的是哪一個(gè)參數(shù)。因?yàn)槲覀儺?dāng)前考慮的是任欄,因此這個(gè)參數(shù)就必須是application.Handle。假如這時(shí)候就著手編制一個(gè)PRoject檢驗(yàn)一下,朋友們就會(huì)發(fā)現(xiàn)...“我”定義的菜單怎么沒有反應(yīng)!原來該菜單項(xiàng)根本沒有在Application里處理過。顯然,我們還得過濾一下傳到Application的WM_SYSCOMMAND消息。為了加深了解,我們首先追加一個(gè)簡(jiǎn)單的任務(wù)欄系統(tǒng)菜單: 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; // 定義三個(gè)用戶消息,用來處理菜單項(xiàng)被點(diǎn)擊
// 時(shí)相應(yīng)的動(dòng)作
My_SimpleCMD2 = WM_USER + 2;
My_SimpleCMD3 = WM_USER + 3;
...
procedure TDemoForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage; //定義自己的消息處理過程
//定義了提交、反饋、處理三個(gè)菜單項(xiàng)
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;
....
   當(dāng)我們處理的事務(wù)比較多并且可分組,以上的做法就比較煩瑣,這時(shí)就應(yīng)該定義成多個(gè) MF_POPUP ,其各個(gè)子菜單除了uIDNewItem 傳遞這個(gè)子菜單的句柄外,另外獨(dú)特之處在于消息過濾器的 Msg.wParam 是各個(gè)菜單項(xiàng)的 Command。這個(gè)Command是在構(gòu)建 TPopupMenu 時(shí)就定義了。無論是否是 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 在消息處理機(jī)制上是稍微有點(diǎn)不同的,另外,假如要在菜單前面加上圖標(biāo)的話,這在Delphi 4.x、Delphi 5.x 版本下是不成問題,假如是在 Delphi 3.x 下的話,只要定義成自繪 MenuItem即可,不過稍許復(fù)雜了一點(diǎn)。在應(yīng)用過程中,需要提醒的是,這幾組定義不能一起使用:A. MF_DISABLED, MF_ENABLED, 和 MF_GRAYED
B. MF_BITMAP, MF_STRING, 和 MF_OWNERDRAW
C. MF_MENUBARBREAK 和 MF_MENUBREAK
D. MF_CHECKED 和 MF_UNCHECKED

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长宁区| 怀集县| 桃园市| 池州市| 兴化市| 康定县| 仁寿县| 阜城县| 佛坪县| 游戏| 新竹市| 茶陵县| 东乡| 大兴区| 澜沧| 包头市| 叙永县| 蓬莱市| 镇原县| 景东| 上高县| 河间市| 堆龙德庆县| 苍溪县| 唐海县| 南岸区| 佛教| 屯留县| 东山县| 信阳市| 吉木萨尔县| 荣昌县| 蒙阴县| 明水县| 花莲县| 神木县| 左云县| 庆云县| 琼海市| 呼伦贝尔市| 绵竹市|