日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从零起步CMFCToolBar用法详解

發(fā)布時間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零起步CMFCToolBar用法详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CMFCToolBar是vs08sp1以后引入的新的工具欄控件,和Ribbon主題結(jié)合的很好,不同與CToolBar,它是從CPane派生出來的,用法跟CToolbar 有一些不同,研究了幾天,記錄在下面。

  • 首先給出工具欄四種狀態(tài)圖標(biāo)BMP文件,這4個文件分別為圖標(biāo)按鈕的Cold、Hot、Disabled、Enabled狀態(tài),資源是從VS的MSMoney這個Demo里考出來的,每個按鈕大小時46*46。效果見下圖,這里給出本站下載資源。
  • 新建一個空白SDI文檔,選用Ribbon主題。找到資源工具欄-Toobar上右鍵新建一個toolbar,取名IDR_MYTOOLBAR,在右側(cè)的編輯欄里將新建出來的工具欄第一個圖標(biāo)的屬性-Height和width改為46*46,此時圖標(biāo)會變大。見下圖。用鉛筆工具在這個圖標(biāo)上隨便畫個東西,完成時,它的右側(cè)會多一個圖標(biāo),繼續(xù)畫,一直第6個圖標(biāo)(此時會有第7個出來,不用畫了)。
  • 導(dǎo)入下載的四個bmp文件到資源里,如下圖,ID分別取好。
  • 用類向?qū)腃MFCToolBar里派生一個新類,或者直接拷貝下面的代碼到Mainfrm.h文件里 [cpp] view plain copy print?
  • class?CMYToolBar?:?public?CMFCToolBar??
  • {??
  • public:???
  • ????DECLARE_DYNCREATE(CMYToolBar)??
  • ??
  • ????//?Construction??
  • public:??
  • ????CMYToolBar();??
  • ??
  • ????virtual?~CMYToolBar?();??
  • public:??
  • ????virtual?BOOL?LoadToolBar?(UINT?uiResID,?UINT?uiColdResID?=?0,???
  • ????????UINT?uiMenuResID?=?0,?BOOL?bLocked?=?FALSE,??
  • ????????UINT?uiDisabledResID?=?0,?UINT?uiMenuDisabledResID?=?0,??
  • ????????UINT?uiHotResID?=?0);??
  • ??
  • protected:??
  • ????afx_msg?int?OnCreate(LPCREATESTRUCT?lpCreateStruct);??
  • ????DECLARE_MESSAGE_MAP()??
  • ??
  • ????virtual?BOOL?DrawButton?(CDC*?pDC,?CMFCToolBarButton*?pButton,???
  • ????????CMFCToolBarImages*?pImages,?BOOL?bHighlighted,??
  • ????????BOOL?bDrawDisabledImages);??
  • ??
  • };??
  • class CMYToolBar : public CMFCToolBar { public: DECLARE_DYNCREATE(CMYToolBar)// Construction public:CMYToolBar();virtual ~CMYToolBar (); public:virtual BOOL LoadToolBar (UINT uiResID, UINT uiColdResID = 0, UINT uiMenuResID = 0, BOOL bLocked = FALSE,UINT uiDisabledResID = 0, UINT uiMenuDisabledResID = 0,UINT uiHotResID = 0);protected:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);DECLARE_MESSAGE_MAP()virtual BOOL DrawButton (CDC* pDC, CMFCToolBarButton* pButton, CMFCToolBarImages* pImages, BOOL bHighlighted,BOOL bDrawDisabledImages);};mainfrm類里添加控件變量 [cpp] view plain copy print?
  • CMYToolBar??????????m_wndMyToolBar;??
  • CMYToolBar m_wndMyToolBar;
  • mainfrm.cpp添加類實現(xiàn)代碼 [cpp] view plain copy print?
  • IMPLEMENT_DYNCREATE(CMYToolBar,?CMFCToolBar)??
  • ??
  • CMYToolBar::CMYToolBar()??
  • {??
  • }??
  • ??
  • ??
  • CMYToolBar::~CMYToolBar()??
  • {??
  • }??
  • ??
  • ??
  • BEGIN_MESSAGE_MAP(CMYToolBar,?CMFCToolBar)??
  • ????ON_WM_CREATE()??
  • ??????
  • END_MESSAGE_MAP()??
  • ??
  • /??
  • //?CMSMToolBar?message?handlers??
  • ??
  • int?CMYToolBar::OnCreate(LPCREATESTRUCT?lpCreateStruct)???
  • {??
  • ????if?(CMFCToolBar::OnCreate(lpCreateStruct)?==?-1)??
  • ????????return?-1;??
  • ??
  • ????SetPaneStyle(CBRS_GRIPPER?|?CBRS_BORDER_TOP?|?CBRS_BORDER_BOTTOM?|???
  • ????????CBRS_BORDER_LEFT?|?CBRS_BORDER_RIGHT|?CBRS_SIZE_DYNAMIC);??
  • ????SetBorders?();??
  • ??
  • ????SetGrayDisabledButtons?(FALSE);??
  • ??
  • ????return?0;??
  • }??
  • ??
  • ??
  • BOOL?CMYToolBar::LoadToolBar(UINT?uiResID,?UINT?uiColdResID,?UINT?uiMenuResID,???
  • ????BOOL?bLocked,??
  • ????UINT?uiDisabledResID,?UINT?uiMenuDisabledResID,??
  • ????UINT?uiHotResID)??
  • {??
  • ????if?(!CMFCToolBar::LoadToolBar?(uiResID,?uiColdResID,?uiMenuResID,?bLocked,???
  • ????????uiDisabledResID,?uiMenuDisabledResID,?uiHotResID))??
  • ????{??
  • ????????return?FALSE;??
  • ????}??
  • ??
  • ??
  • ????return?TRUE;??
  • }??
  • ??
  • BOOL?CMYToolBar::DrawButton(CDC*?pDC,?CMFCToolBarButton*?pButton,??
  • ????CMFCToolBarImages*?pImages,??
  • ????BOOL?bHighlighted,?BOOL?bDrawDisabledImages)??
  • {??
  • ????ASSERT_VALID?(pDC);??
  • ????ASSERT_VALID?(pButton);??
  • ??
  • ??
  • ????CMFCToolBarImages*?pNewImages?=?pImages;??
  • ??
  • ????CAfxDrawState?ds;??
  • ????/*?
  • ????if?(!m_bMenuMode?&&?(pButton->m_nStyle?&?(TBBS_PRESSED))?&&??
  • ????????m_PressedImages.GetCount?()?>?0)?
  • ????{?
  • ????????pNewImages?=?&m_PressedImages;?
  • ?
  • ????????pNewImages->SetTransparentColor?(afxGlobalData.clrBtnFace);?
  • ?
  • ????????pNewImages->PrepareDrawImage?(ds,?GetImageSize?(),?FALSE);?
  • ????}?
  • ????*/??
  • ????if?(!CMFCToolBar::DrawButton?(pDC,?pButton,?pNewImages,?bHighlighted,???
  • ????????bDrawDisabledImages))??
  • ????{??
  • ????????return?FALSE;??
  • ????}??
  • ??
  • ????if?(pNewImages?!=?pImages)??
  • ????{??
  • ????????pNewImages->EndDrawImage?(ds);??
  • ????}??
  • ??
  • ????return?TRUE;??
  • }??
  • IMPLEMENT_DYNCREATE(CMYToolBar, CMFCToolBar)CMYToolBar::CMYToolBar() { }CMYToolBar::~CMYToolBar() { }BEGIN_MESSAGE_MAP(CMYToolBar, CMFCToolBar)ON_WM_CREATE()END_MESSAGE_MAP()/ // CMSMToolBar message handlersint CMYToolBar::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CMFCToolBar::OnCreate(lpCreateStruct) == -1)return -1;SetPaneStyle(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT| CBRS_SIZE_DYNAMIC);SetBorders ();SetGrayDisabledButtons (FALSE);return 0; }BOOL CMYToolBar::LoadToolBar(UINT uiResID, UINT uiColdResID, UINT uiMenuResID, BOOL bLocked,UINT uiDisabledResID, UINT uiMenuDisabledResID,UINT uiHotResID) {if (!CMFCToolBar::LoadToolBar (uiResID, uiColdResID, uiMenuResID, bLocked, uiDisabledResID, uiMenuDisabledResID, uiHotResID)){return FALSE;}return TRUE; }BOOL CMYToolBar::DrawButton(CDC* pDC, CMFCToolBarButton* pButton,CMFCToolBarImages* pImages,BOOL bHighlighted, BOOL bDrawDisabledImages) {ASSERT_VALID (pDC);ASSERT_VALID (pButton);CMFCToolBarImages* pNewImages = pImages;CAfxDrawState ds;/*if (!m_bMenuMode && (pButton->m_nStyle & (TBBS_PRESSED)) && m_PressedImages.GetCount () > 0){pNewImages = &m_PressedImages;pNewImages->SetTransparentColor (afxGlobalData.clrBtnFace);pNewImages->PrepareDrawImage (ds, GetImageSize (), FALSE);}*/if (!CMFCToolBar::DrawButton (pDC, pButton, pNewImages, bHighlighted, bDrawDisabledImages)){return FALSE;}if (pNewImages != pImages){pNewImages->EndDrawImage (ds);}return TRUE; }mainfrm.cpp里的OnCreate里添加控件初始化代碼 [cpp] view plain copy print?
  • ???????UINT?uiToolbarHotID??=?IDB_HOTBITMAP;??
  • UINT?uiToolbarColdID?=?IDB_COLDBITMAP;??
  • UINT?uiToolbarDisID??=?IDB_DISBITMAP;??
  • UINT?uiToolbarPresID?=?IDB_PRESBITMAP;??
  • if?(!m_wndMyToolBar.CreateEx?(this,?TBSTYLE_FLAT,??
  • ????TBSTYLE_TOOLTIPS?|?CBRS_SIZE_DYNAMIC|??AFX_DEFAULT_TOOLBAR_STYLE)?||??
  • ????!m_wndMyToolBar.LoadToolBar?(IDR_MYTOOLBAR,?uiToolbarColdID,?0,???
  • ????TRUE,?uiToolbarDisID,?0,?uiToolbarHotID))??
  • {??
  • ????TRACE0("Failed?to?create?toolbar\n");??
  • ????return?-1;??????//?fail?to?create??
  • }??
  • ??
  • m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);???
  • EnableDocking(CBRS_ALIGN_ANY);????
  • DockPane?(&m_wndMyToolBar);??
  • m_wndMyToolBar.SetWindowText(_T("新的CMFCToolBar控件!"));??
  • UINT uiToolbarHotID = IDB_HOTBITMAP;UINT uiToolbarColdID = IDB_COLDBITMAP;UINT uiToolbarDisID = IDB_DISBITMAP;UINT uiToolbarPresID = IDB_PRESBITMAP;if (!m_wndMyToolBar.CreateEx (this, TBSTYLE_FLAT,TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC| AFX_DEFAULT_TOOLBAR_STYLE) ||!m_wndMyToolBar.LoadToolBar (IDR_MYTOOLBAR, uiToolbarColdID, 0, TRUE, uiToolbarDisID, 0, uiToolbarHotID)){TRACE0("Failed to create toolbar\n");return -1; // fail to create}m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockPane (&m_wndMyToolBar);m_wndMyToolBar.SetWindowText(_T("新的CMFCToolBar控件!"));
  • 編譯運(yùn)行,就有結(jié)果了。
  • 還要添加各個按鈕的事件代碼,按鈕就可以enable了,在.h里寫 [cpp] view plain copy print?
  • afx_msg?void?OnViewButton1();??
  • afx_msg?void?OnUpdateViewButton1(CCmdUI*?pCmdUI);??
  • afx_msg void OnViewButton1();afx_msg void OnUpdateViewButton1(CCmdUI* pCmdUI);在.cpp里寫 [cpp] view plain copy print?
  • ON_COMMAND(ID_BUTTON32774,?&CMainFrame::OnViewButton1)??
  • ON_UPDATE_COMMAND_UI(ID_BUTTON32774,?&CMainFrame::OnUpdateViewButton1)??
  • ON_COMMAND(ID_BUTTON32774, &CMainFrame::OnViewButton1)ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)按鈕ID和代碼放的位置就不多說了
  • 好了,至此完畢,可以拖動,浮動工具欄了。
  • ========================================2014.12.22============= 今天找到方法進(jìn)行工具欄狀態(tài)的更新,就是按下工具欄某按鈕之后,該按鈕一直是按下的狀態(tài),鼠標(biāo)可以移開進(jìn)行其他操作。很簡單,設(shè)置一個按下狀態(tài)標(biāo)志位bBTDown,響應(yīng) [cpp] view plain copy print?
  • ON_UPDATE_COMMAND_UI(ID_BUTTON32774,?&CMainFrame::OnUpdateViewButton1)??
  • ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)里寫 [cpp] view plain copy print?
  • pCmdUI->SetCheck(bBTDown);??
  • pCmdUI->SetCheck(bBTDown);

    這里在view區(qū)進(jìn)行了畫線的操作,工具欄按鈕一直為按下狀態(tài)。同時,鼠標(biāo)指針也進(jìn)行了更改,讓起在客戶群為十字架,其他區(qū)域為普通指針,方法為響應(yīng)WM_SETCURSOR消息,函數(shù)里寫

    [cpp] view plain copy print?
  • BOOL?CMainFrame::OnSetCursor(CWnd*?pWnd,?UINT?nHitTest,?UINT?message)??
  • {??
  • ????//?TODO:?Add?your?message?handler?code?here?and/or?call?default??
  • ????if?(bBTDown)??
  • ????{??
  • ????????CToolBarView*?pView?=?(CToolBarView*)GetActiveView();??
  • ????????ASSERT(pView);??
  • ????????ASSERT(pWnd);??
  • ????????if?(pWnd?==?pView)??
  • ????????{??
  • ????????????SetCursor(LoadCursor(NULL,IDC_CROSS));??
  • ????????????return?TRUE;//這里要返回TRUE,否則閃爍??
  • ????????}??
  • ??????????
  • ????}??
  • ??
  • ????return?CFrameWndEx::OnSetCursor(pWnd,?nHitTest,?message);??
  • }??
  • BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {// TODO: Add your message handler code here and/or call defaultif (bBTDown){CToolBarView* pView = (CToolBarView*)GetActiveView();ASSERT(pView);ASSERT(pWnd);if (pWnd == pView){SetCursor(LoadCursor(NULL,IDC_CROSS));return TRUE;//這里要返回TRUE,否則閃爍}}return CFrameWndEx::OnSetCursor(pWnd, nHitTest, message); }

    ========================================2014.12.25=============

    今天找到添加提示的方法,很簡單,在第二張圖繪制工具欄圖標(biāo)的時候,在屬性窗口的promt里直接輸入信息

    [cpp] view plain copy print?
  • 返回上一步操作\n返回按鈕??
  • 返回上一步操作\n返回按鈕就可以了,特別是\n一定要有,效果如圖

    總結(jié)

    以上是生活随笔為你收集整理的从零起步CMFCToolBar用法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 新91在线| 奇米四色777 | 亚洲国产一区二区在线观看 | 中文字幕蜜桃 | 干夜夜| 久久精品2019中文字幕 | 未满十八岁禁止进入 | 国产精品无码AV | 人成午夜 | 天天操天天爽天天干 | 日本草草影院 | 欧美成人精品欧美一级私黄 | 男人的天堂色 | 欧美日韩高清一区二区 | 综合视频在线观看 | 亚洲一区二区在线播放 | 伊人中文在线 | 制服丝袜第二页 | 国产三级视频在线播放 | 午夜一区二区三区免费 | 国产男女无套免费网站 | 青青青视频免费观看 | 538国产精品视频一区二区 | 91久久亚洲 | 国语精品 | 亚洲经典视频在线观看 | 麻豆视频一区二区三区 | 五月天丁香网 | 视频福利一区 | 国产日日日| 91禁看片| 国产青青草视频 | 性高湖久久久久久久久aaaaa | 国产成人一区二区三区 | 日本精品入口免费视频 | 日本加勒比中文字幕 | 日本精品一区二区在线观看 | 国产精品麻豆一区 | 美女网站在线免费观看 | 99久久精| 国产亚洲精品成人av久久ww | 色骚综合 | 国产嫩草影院久久久 | 欧美一线天 | 亲吻刺激视频 | 一级aaaa毛片 | 国模av| 欧美乱轮 | www.日日夜夜 | 四虎影院www | 人人夜| 9l视频自拍九色9l视频 | 狠狠爱综合网 | 中国黄色免费 | 91九色国产 | www狠狠干 | 亚洲国产精品成人av | 日韩精品免费电影 | 亚洲一区二区三区成人 | 成人一区二区三区在线 | 亚洲av少妇一区二区在线观看 | 不卡中文字幕在线观看 | 久久久久久国产精品一区 | 国产亚洲精品一区二区三区 | 久久综合操 | 亚洲av无码一区二区乱子伦as | 亚洲成网站| 中文字幕精品一区二区精品 | 男生女生操操操 | 三级黄色在线 | 骚av在线 | 日本理论片中文字幕 | 色播综合 | 99热这里只有精品8 国产一卡二 | 久久黄色视 | 亚洲第一视频区 | 亚洲第一自拍 | 欧美日韩一区二区中文字幕 | 亚洲一区中文字幕 | 欧美影院在线观看 | 亚洲偷偷自拍 | 华人永久免费视频 | 中日韩中文字幕一区二区 | 十大污网站 | 无码人妻一区二区三区一 | 欧美成人a∨高清免费观看 国产精品999视频 | 欧美xxx性 | 欧美日韩在线免费观看视频 | 99精品久久久久 | wwwwww国产| 亚洲欧美福利 | 丁香六月色婷婷 | 欧美色狠 | 亚洲av永久无码精品一区二区国产 | 欧美激情一区 | 成人免费毛片高清视频 | 国产精品免费视频一区 | 亚洲熟妇无码乱子av电影 | 影音先锋中文字幕在线视频 |