<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jasmine214--love

    只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

    CMemu菜單類詳解

    Posted on 2010-08-30 19:59 幻海藍夢 閱讀(524) 評論(0)  編輯  收藏 所屬分類: C++
    在VC 5的MFC中,管理菜單的類叫CMenu。下面我向大家介紹建立一個彈出式菜單的基本方法。
    一、在資源編輯器中建立一個菜單資源



       新建一個菜單資源,比如把菜單的ID號為IDC_POPMENU。此菜單有一項兩層,即有一個可彈出的菜單項,而此菜單項的彈出內容即為將要建立的彈出式菜單的內容。如右圖,“可彈出項”下的菜單即為將要建立的彈出式菜單的內容。實際上,“可彈出項”這個名稱在以后的操作中不會被用到,但VC 5不允許直接建立彈出式菜單,所以采用先建立“可彈出項”的方法。

    至于每一個菜單項的消息映射,與一般的菜單相同。

    二、使用CMenu類對象

       CMenu類的成員函數較多,但建立彈出式菜單只需用到其中幾個成員函數。

    1、LoadMenu函數

       原型:BOOL LoadMenu( UINT nIDResource );
       其中nIDResource是菜單資源的ID號,這里用的是剛建立的IDC_POPMENU。
    2、GetSubMenu函數

       原型:CMenu* GetSubMenu( int nPos ) const;

       此函數用于得到子菜單的指針。nPos為層數,0為第一層子菜單……以此類推。

    由于我們需要的是“可彈出項”的第一層子菜單,因此用GetSubMenu(0)來得到第一層子菜單的類指針。
    3、TrackPopupMenu函數

       原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL );

       其中:

    nFlags為屏幕坐標屬性和鼠標坐標屬性

    屏幕坐標屬性:

    TPM_CENTERALIGN 橫向將菜單以x居中

    TPM_LEFTALIGN 橫向將菜單以x左對齊

    TPM_RIGHTALIGN 橫向將菜單以x右對齊

    鼠標按鍵屬性(只在響應WM_CONTEXTMENU消息時有效):

    TPM_LEFTBUTTON 連續按? 右鍵不會連續彈出菜單,鼠標右鍵不可用于選定菜單項

    TPM_RIGHTBUTTON 連續按鼠標右鍵會連續彈出菜單,鼠標右鍵可用于選定菜單項

    x,y均為屏幕坐標

    lpRect 菜單所占的區域。如果為NULL,當用戶在菜單以外的區域按鼠標鍵時,菜單會消失

    三、實例

    1、當鼠標右鍵單擊程序窗口的客戶區時,程序會收到一條WM_CONTEXTMENU消息,此時是彈出菜單的最好時機

       用ClassWizard中的“Add Windows Message Handler”功能添加對WM_CONTEXT消息的響應函數,函數中代碼如下:

    void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point)

    {

    CMenu menu; //定義CMenu類對象
    menu.LoadMenu(IDC_POPMENU); //裝入剛建立的菜單IDC_POPMENU menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pWnd);
    /*GetSubMenu(0)得到IDC_POPMENU的第一層子菜單,TrackPopupMenu將菜單彈出到(x,y)處。由于設置為TPM_LEFTALIGN,所以菜單以(x,y)為左上角。*/

    }

    2、在其他時候彈出菜單也可以,比如,可以響應WM_LBUTTONDOWN消息。這樣,在鼠標左鍵單擊時也能彈出菜單

       用ClassWizard中的“Add Windows Message Handler”功能添加對WM_LBUTTONDOWN消息的響應函數,函數中代碼如下:
    void CMfc5Dlg::OnLButtonDown(UINT nFlags, CPoint point)

    {

       CMenu menu; //定義CMenu類對象 menu.LoadMenu(IDC_POPMENU); //裝入剛建立的菜單IDC_POPMENU ClientToScreen(&point); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
    /*GetSubMenu(0)得到IDC_POPMENU的第一層子菜單,TrackPopupMenu將菜單彈出到(x,y)處。由于設置為TPM_LEFTALIGN,所以菜單以(x,y)為左上角。*/

    ScreenToClient(&point);
    CDialog::OnLButtonDown(nFlags, point);

    }

       注意:在WM_LBUTTONDOWN消息中得到的point對象所存的坐標是相對于窗口客戶區的,而TrackPopupMenu中的x,y需要是相對于屏幕的,所以需用ClientToScreen函數進行轉換,但此消息響應函數要調用CDialog::OnLButtonDown(nFlags, point),故應該用ScreenToClient函數將point所存的坐標還原為相對于窗口客戶區的。

    上一篇: 制作 MSN、QQ 的消息提示窗口
    下一篇: 在單文檔中添加系統菜單項

    彈出式菜單(PopMenu)大家都熟悉,在WIN98的桌面上單擊鼠標右鍵彈出的菜單就是彈出式菜單。通常情況下,彈出式菜單在鼠標右鍵單擊時彈出,當然,也可以根據需要隨時彈出。 在VC 5的MFC中,管理菜單的類叫CMenu。下面我向大家介紹建立一個彈出式菜單的基本方法。
    一、在資源編輯器中建立一個菜單資源



       新建一個菜單資源,比如把菜單的ID號為IDC_POPMENU。此菜單有一項兩層,即有一個可彈出的菜單項,而此菜單項的彈出內容即為將要建立的彈出式菜單的內容。如右圖,“可彈出項”下的菜單即為將要建立的彈出式菜單的內容。實際上,“可彈出項”這個名稱在以后的操作中不會被用到,但VC 5不允許直接建立彈出式菜單,所以采用先建立“可彈出項”的方法。

    至于每一個菜單項的消息映射,與一般的菜單相同。

    二、使用CMenu類對象

       CMenu類的成員函數較多,但建立彈出式菜單只需用到其中幾個成員函數。

    1、LoadMenu函數

       原型:BOOL LoadMenu( UINT nIDResource );
       其中nIDResource是菜單資源的ID號,這里用的是剛建立的IDC_POPMENU。
    2、GetSubMenu函數

       原型:CMenu* GetSubMenu( int nPos ) const;

       此函數用于得到子菜單的指針。nPos為層數,0為第一層子菜單……以此類推。

    由于我們需要的是“可彈出項”的第一層子菜單,因此用GetSubMenu(0)來得到第一層子菜單的類指針。
    3、TrackPopupMenu函數

       原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL );

       其中:

    nFlags為屏幕坐標屬性和鼠標坐標屬性

    屏幕坐標屬性:

    TPM_CENTERALIGN 橫向將菜單以x居中

    TPM_LEFTALIGN 橫向將菜單以x左對齊

    TPM_RIGHTALIGN 橫向將菜單以x右對齊

    鼠標按鍵屬性(只在響應WM_CONTEXTMENU消息時有效):

    TPM_LEFTBUTTON 連續按? 右鍵不會連續彈出菜單,鼠標右鍵不可用于選定菜單項

    TPM_RIGHTBUTTON 連續按鼠標右鍵會連續彈出菜單,鼠標右鍵可用于選定菜單項

    x,y均為屏幕坐標

    lpRect 菜單所占的區域。如果為NULL,當用戶在菜單以外的區域按鼠標鍵時,菜單會消失

    三、實例

    1、當鼠標右鍵單擊程序窗口的客戶區時,程序會收到一條WM_CONTEXTMENU消息,此時是彈出菜單的最好時機

       用ClassWizard中的“Add Windows Message Handler”功能添加對WM_CONTEXT消息的響應函數,函數中代碼如下:

    void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point)

    {

    CMenu menu; //定義CMenu類對象
    menu.LoadMenu(IDC_POPMENU); //裝入剛建立的菜單IDC_POPMENU menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pWnd);
    /*GetSubMenu(0)得到IDC_POPMENU的第一層子菜單,TrackPopupMenu將菜單彈出到(x,y)處。由于設置為TPM_LEFTALIGN,所以菜單以(x,y)為左上角。*/

    }

    2、在其他時候彈出菜單也可以,比如,可以響應WM_LBUTTONDOWN消息。這樣,在鼠標左鍵單擊時也能彈出菜單

       用ClassWizard中的“Add Windows Message Handler”功能添加對WM_LBUTTONDOWN消息的響應函數,函數中代碼如下:
    void CMfc5Dlg::OnLButtonDown(UINT nFlags, CPoint point)

    {

       CMenu menu; //定義CMenu類對象 menu.LoadMenu(IDC_POPMENU); //裝入剛建立的菜單IDC_POPMENU ClientToScreen(&point); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
    /*GetSubMenu(0)得到IDC_POPMENU的第一層子菜單,TrackPopupMenu將菜單彈出到(x,y)處。由于設置為TPM_LEFTALIGN,所以菜單以(x,y)為左上角。*/

    ScreenToClient(&point);
    CDialog::OnLButtonDown(nFlags, point);

    }

       注意:在WM_LBUTTONDOWN消息中得到的point對象所存的坐標是相對于窗口客戶區的,而TrackPopupMenu中的x,y需要是相對于屏幕的,所以需用ClientToScreen函數進行轉換,但此消息響應函數要調用CDialog::OnLButtonDown(nFlags, point),故應該用ScreenToClient函數將point所存的坐標還原為相對于窗口客戶區的。
    http://blog.chinaunix.net/u2/67530/showart_602938.html
    主站蜘蛛池模板: 无码国产精品一区二区免费式影视| 日韩在线视频免费 | 99re热精品视频国产免费| 国产av无码专区亚洲国产精品| 亚洲成AV人片在线观看无| 一级特黄录像免费播放肥| 亚洲综合无码AV一区二区| 手机看片国产免费永久| 亚洲AV无码不卡无码| 最近免费中文字幕大全高清大全1| 亚洲av无码一区二区三区网站| 好久久免费视频高清| 免费国产在线观看| 国产精品手机在线亚洲| 亚洲AV网站在线观看| 岛国精品一区免费视频在线观看 | 亚洲AV成人精品网站在线播放| 91视频精品全国免费观看| 亚洲AV无码国产精品麻豆天美| 久章草在线精品视频免费观看| 亚洲AV无码乱码在线观看| 一级毛片高清免费播放| 国产精品二区三区免费播放心| 男男gvh肉在线观看免费| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产日韩一区二区三免费高清| 亚洲成a人片77777老司机| 免费看国产精品3a黄的视频| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲国产成人VA在线观看| 国产精品99精品久久免费| 亚洲精品亚洲人成在线播放| 日韩人妻无码精品久久免费一| 亚洲区精品久久一区二区三区| 久久精品无码专区免费东京热| 亚洲宅男精品一区在线观看| 亚洲国产精品一区二区九九| 亚欧免费一级毛片| 激情小说亚洲图片| 亚洲AV无码久久精品蜜桃| 免费无码不卡视频在线观看|