全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1219
推到 Plurk!
推到 Facebook!

請問如何用程式打開TMainMenu中的某個子選項呢

尚未結案
webber
初階會員


發表:54
回覆:76
積分:26
註冊:2004-04-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-24 18:12:26 IP:220.130.xxx.xxx 未訂閱
請問如何用程式打開TMainMenu中的某個子選項呢 有可能要打開某個子選項中的子選項 而且要讓焦點停在字選項上....    SendMessage(handle, WM_SYSCOMMAND  ,SC_KEYMENU ,ord('A')); 似乎不是一個好的辦法....    另外, 有辦法知道目前的焦點停在那個子選項上嗎    感謝您百忙之中,抽空回答    K.Top是我見過最棒的程式社群
如果沒有K.Top真不知道該怎麼活
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-24 20:37:39 IP:61.31.xxx.xxx 未訂閱
>請問如何用程式打開TMainMenu中的某個子選項呢 >有可能要打開某個子選項中的子選項    是可以做到的!不過....而且要讓焦點停在字選項上....!@#$% 難了!-_-
procedure TForm1.Button1Click(Sender: TObject);
Const
  AutoItemID = 1;  {要打開子選項的編號}
var
  ARect : TRect;
begin
  { 取得該子選項的位置座標}
  if GetMenuItemRect(Handle,MainMenu1.Handle,AutoItemID,ARect) then
  begin
    {該子選項為按下按鈕的狀態}
    HiliteMenuItem(Handle, MainMenu1.Handle,AutoItemID, MF_BYPOSITION or MF_HILITE);
    {顯示該子選項的項目}  
    with ARect do
      TrackPopupMenuEx(MainMenu1.Items[AutoItemID].Handle, 0,Left,Bottom, Handle, nil);
    {取消該子選項為按下按鈕的狀態}
    HiliteMenuItem(Handle, MainMenu1.Handle,AutoItemID, MF_BYPOSITION or MF_UNHILITE);
  end;
end;
>另外, 有辦法知道目前的焦點停在那個子選項上嗎 接管 WM_MENUSELECT 訊息就可以了。
webber
初階會員


發表:54
回覆:76
積分:26
註冊:2004-04-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-24 21:46:53 IP:61.230.xxx.xxx 未訂閱
感謝wameng大大的回答    只是我的功力太淺 不是很懂「接管 WM_MENUSELECT 訊息」是什麼意思... 另外,要如何才能開啟某個子選單中的小選項呢    K.Top是我見過最棒的程式社群
如果沒有K.Top真不知道該怎麼活 發表人 - webber 於 2005/01/24 22:16:14
webber
初階會員


發表:54
回覆:76
積分:26
註冊:2004-04-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-24 22:25:46 IP:61.230.xxx.xxx 未訂閱
我使用 ApplicationEvents 的 OnMessage中 並攔不到 WM_MENUSELECT 說      case msg.message of      WM_MENUSELECT:begin        showmessage('WM_MENUSELECT');      end;   end;    可以再麻煩 wameng 大大再指點一二嗎 感激不盡    K.Top是我見過最棒的程式社群
如果沒有K.Top真不知道該怎麼活
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-24 23:26:39 IP:61.31.xxx.xxx 未訂閱
>另外, 有辦法知道目前的焦點停在那個子選項上嗎 接管 WM_MENUSELECT 訊息就可以了    如下:
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N111111111: TMenuItem;
    N22222222221: TMenuItem;
    N3333333333331: TMenuItem;
    N44444441: TMenuItem;
    N555555551: TMenuItem;
    Label1: TLabel;
  private
    Procedure WMMENUSELECT(var Message:TWMMenuSelect);Message WM_MENUSELECT;
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.DFM}    Procedure TForm1.WMMENUSELECT(var Message:TWMMenuSelect);
begin
  Label1.Caption := inttostr(Message.IDItem);
end;
sprewell
一般會員


發表:13
回覆:21
積分:6
註冊:2003-11-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-25 10:54:44 IP:220.130.xxx.xxx 未訂閱
請問關於停留在子選項的部份, 我試了一下, ㄧ樣利用GetMenuItemRect(Handle,bbb1.Handle,1,ARect) [bbb1是含有其他Item的TMenuItem] 可以取到TRect, 不過要再做按下按鈕跟顯示項目就有點怪怪的>< 可以請大大再指點ㄧ下嗎? Delphi....我真的是摸不透你阿!!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-25 11:44:25 IP:61.31.xxx.xxx 未訂閱
引言: 請問關於停留在子選項的部份, 我試了一下, ㄧ樣利用GetMenuItemRect(Handle,bbb1.Handle,1,ARect) [bbb1是含有其他Item的TMenuItem] 可以取到TRect, 不過要再做按下按鈕跟顯示項目就有點怪怪的>< 可以請大大再指點ㄧ下嗎?
說指點不敢當! 主要認為 要讓焦點停在字選項上.... 就系統消息機制面,來說是可能做不到的。 主要跟滑鼠移動相關。 事實上,應可用取巧方式。 在該項目 利用 OnDrawItem (自己畫)使其反藍聚焦。 再利用 WM_MENUSELECT 取消反藍。 發表人 - wameng 於 2005/01/25 11:56:21
系統時間:2024-05-17 14:37:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!