MFC工具欄CToolBar從專家到小白

CToolBar m_wndTool;
//創建控件
m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC);
//加載工具欄資源
m_wndTool.LoadToolBar(IDR_TOOL_LOAD)  //在.rc中定義:IDR_TOOL_LOAD	BITMAP	"res\\tool_load.bmp"//工具欄中單個按鈕的樣式、大小
CSize bSize;
bSize.cx = 80;
bSize.cy = 32;
m_wndTool.GetToolBarCtrl().SetButtonSize(bSize);
m_wndTool.GetToolBarCtrl().SetBitmapSize(bSize);//設置按鈕文字
SetButtonText();//設置樣式
DWORD dwStyle = m_wndTool.GetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_1));
DWORD olddwStyle = dwStyle;
DWORD tempStyle  = dwStyle;
tempStyle |= TBSTYLE_CHECK;  //支持復選框行為。常用于選中狀態切換,如點擊后保持按下(選中)狀態,再次點擊時恢復原狀。
m_wndTool.SetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_2), dwStyle);//刪除控件
m_wndTool.GetToolBarCtrl().DeleteButton(m_wndTool.CommandToIndex(IDS_TOOLBAR_3));//隱藏控件
m_wndTool.GetToolBarCtrl().HideButton(IDS_TOOLBAR_4, TRUE);//顯示工具欄控件
m_wndTool.ShowWindow(SW_SHOW);
//重新定位和調整工具欄和其他控件欄的大小
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

創建控件CToolBar::CreateEx()

virtual BOOL CreateEx(CWnd* pParentWnd,DWORD dwCtrlStyle = TBSTYLE_FLAT,DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,CRect rcBorders = CRect(0, 0, 0, 0),UINT nID = AFX_IDW_TOOLBAR);

CWnd* pParentWnd:父窗口的指針。
DWORD dwCtrlStyle:工具欄控件的樣式。
DWORD dwStyle:窗口的擴展樣式。這些樣式來自Windows SDK,定義了窗口的行為和外觀。
CRect rcBorders:工具欄邊框的尺寸。
UINT nID:工具欄的ID。AFX_IDW_TOOLBAR是MFC預定義的一個ID,用于默認的工具欄。

CToolBar 類
工具欄控件和按鈕樣式

加載工具欄資源

1.在資源文件中增加Toolbar資源文件
在這里插入圖片描述

2.在.rc文件中定義資源路徑映射

IDR_TOOL_1	BITMAP	"res\\tool_1.bmp"

3.加載資源

m_wndTool.LoadToolBar(IDR_TOOL_LOAD)

設置按鈕大小

CSize bSize;
bSize.cx = 80;
bSize.cy = 32;
m_wndTool.GetToolBarCtrl().SetButtonSize(bSize);
m_wndTool.GetToolBarCtrl().SetBitmapSize(bSize);

獲取按鈕個數GetButtonCount()

int nCount = m_wndTool.GetToolBarCtrl().GetButtonCount();

設置、獲取按鈕信息GetButtonInfo()

//設置。TBBS_BUTTON:標準按鍵
m_wndTool.SetButtonInfo(0, IDS_TOOLBAR_1, TBBS_BUTTON, 0);//獲取
UINT nID, nStyle;
int nImage;
m_wndTool.GetButtonInfo(i, nID, nStyle, nImage); 

按鈕類型

工具欄控件樣式

設置按鈕文字

/**加載語言文件**/
int nCount = m_wndTool.GetToolBarCtrl().GetButtonCount();
UINT nID, nStyle;
int nImage;
for (int i = 0; i < nCount; i++)
{m_wndTool.GetButtonInfo(i, nID, nStyle, nImage);  //獲取按鈕信息nID,用于關聯語言文件sLoader = tr(nID);  //從語言文件加載m_wndTool.SetButtonText(i, sLoader);
}
/**繪制文字到按鈕上**/
CImageList*	cImageList = NULL;
cImageList = m_ImgList;CBitmap		cBitmap;
BITMAP		bmBitmap;
if (!cBitmap.Attach(LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_TOOL_1), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_CREATEDIBSECTION)) ||!cBitmap.GetBitmap(&bmBitmap))  //附加圖片資源return FALSE;//按鈕圖片上輸出文本
CDC  memDc;
CDC* pDC = GetDC();
memDc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap;
pOldBitmap = memDc.SelectObject(&cBitmap);
memDc.SetBkMode(TRANSPARENT);
memDc.SetTextColor(RGB(0,0,0));CRect rcButton(0, 32, 0, 32 + nBtnWidth);
int nCount = GetToolBarCtrl().GetButtonCount();
int i;
CString sText;
UINT nID, nStyle;;
int nImage;
for ( i = 0; i < nCount; i++)
{GetButtonInfo(i, nID, nStyle, nImage);GetButtonText(i, sText);rcButton.left	= i*nBtnWidth;rcButton.right	= (i+1)*nBtnWidth;memDc.DrawText(sText, rcButton, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
memDc.SelectObject(pOldBitmap);
memDc.DeleteDC();
ReleaseDC(pDC);BOOL bFlag = FALSE;
if ( cImageList )
{cImageList->DeleteImageList();delete cImageList;bFlag = TRUE;
}
//按鈕圖片上輸出文本
CSize		cSize(bmBitmap.bmWidth, bmBitmap.bmHeight); 
int			nNbBtn	= cSize.cx/nBtnWidth;
RGBTRIPLE*	rgb		= (RGBTRIPLE*)(bmBitmap.bmBits);
COLORREF	rgbMask	= RGB(rgb[0].rgbtRed, rgb[0].rgbtGreen, rgb[0].rgbtBlue);
cImageList = new CImageList;
m_ImgList = cImageList;
if (!cImageList->Create(nBtnWidth, cSize.cy, ILC_COLOR24|ILC_MASK, nNbBtn, 0))  //創建多個圖標區return FALSE;if (cImageList->Add(&cBitmap, rgbMask) == -1)  //將位圖分割為多個圖標并添加到圖像return FALSE;
SendMessage(TB_SETIMAGELIST, 0, (LPARAM)cImageList->m_hImageList);  //向工具欄控件發送消息,設置新的圖像列表。
cBitmap.DeleteObject();
cBitmap.Detach();

cImageList->Add(&cBitmap, rgbMask):圖像列表會根據初始化時指定的圖標尺寸(nBtnWidth x cSize.cy),?從左到右依次切割位圖,每個子區域作為一個圖標添加到列表中。

工具欄用途

TB_SETIMAGELIST:設置工具欄用于顯示處于默認狀態的按鈕的圖像列表。
TB_SETHOTIMAGELIST:設置工具欄控件將用于顯示熱按鈕的圖像列表
TB_SETDISABLEDIMAGELIST:設置工具欄控件將用于顯示禁用的按鈕的圖像列表。

TB_SETIMAGELIST 消息

按鈕樣式設置

//獲取按鈕樣式
DWORD dwStyle = m_wndTool.GetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_1));//設置按鈕樣式
DWORD olddwStyle = dwStyle;
DWORD tempStyle  = dwStyle;
tempStyle |= TBSTYLE_CHECK;  //支持復選框行為。常用于選中狀態切換,如點擊后保持按下(選中)狀態,再次點擊時恢復原狀。
m_wndTool.SetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_2), dwStyle);

RepositionBars()

重新定位和調整工具欄和其他控件欄的大小。

RepositionBars的用法和參數的意義
MFC狀態欄之RepositionBars

隱藏控件

m_wndTool.GetToolBarCtrl().HideButton(IDS_TOOLBAR, TRUE);

禁用控件

m_wndTool.GetToolBarCtrl().EnableButton(IDS_TOOLBAR, FALSE);

刪除控件

m_wndTool.GetToolBarCtrl().DeleteButton(m_wndTool.CommandToIndex(IDS_TOOLBAR));

設置按鈕狀態

DWORD dwState = m_wndTool.GetToolBarCtrl().GetState(IDS_TOOLBAR_1);
m_wndTool.GetToolBarCtrl().SetState(IDS_TOOLBAR_2, dwState);

綁定按鈕的點擊事件

m_wndTool.SetButtons(NULL, 3);  //設置按鈕數量
m_wndTool.SetButtonInfo(0, IDS_TOOLBAR_0, TBBS_BUTTON, 0);
m_wndTool.SetButtonInfo(1, IDS_TOOLBAR_1, TBBS_BUTTON, 1);
m_wndTool.SetButtonInfo(2, IDS_TOOLBAR_2, TBBS_BUTTON, 2);
m_wndTool.Invalidate();  //強制刷新

MFC 工具欄實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76262.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java面試系列】Spring Boot微服務架構下的分布式事務處理與性能優化詳解 - 3-5年Java開發必備知識

【Java面試系列】Spring Boot微服務架構下的分布式事務處理與性能優化詳解 - 3-5年Java開發必備知識 引言 在當今的微服務架構中&#xff0c;分布式事務處理和性能優化是面試中經常被問及的高頻話題。隨著系統規模的擴大&#xff0c;如何保證數據一致性和系統性能成為了開發者…

【動態規劃】 深入動態規劃—兩個數組的dp問題

文章目錄 前言例題一、最長公共子序列二、不相交的線三、不同的子序列四、通配符匹配五、交錯字符串六、兩個字符串的最小ASCII刪除和七、最長重復子數組 結語 前言 問題本質 它主要圍繞著給定的兩個數組展開&#xff0c;旨在通過對這兩個數組元素間關系的分析&#xff0c;找出…

【C++面向對象】封裝(上):探尋構造函數的幽微之境

每文一詩 &#x1f4aa;&#x1f3fc; 我本將心向明月&#xff0c;奈何明月照溝渠 —— 元/高明《琵琶記》 譯文&#xff1a;我本是以真誠的心來對待你&#xff0c;就像明月一樣純潔無瑕&#xff1b;然而&#xff0c;你卻像溝渠里的污水一樣&#xff0c;對這份心意無動于衷&a…

JavaScript性能優化(下)

1. 使用適當的算法和邏輯 JavaScript性能優化是一個復雜而重要的話題&#xff0c;尤其是在構建大型應用時。通過使用適當的算法和邏輯&#xff0c;可以顯著提高代碼的效率和響應速度。以下是一些關鍵策略和實踐&#xff0c;用于優化JavaScript性能&#xff1a; 1.1. 采用適當…

螞蟻 Flink 實時計算編譯任務 Koupleless 架構改造

張馮君&#xff08;遠遠&#xff09; Koupleless PMC 螞蟻集團技術工程師 就職于螞蟻集團中間件團隊&#xff0c;參與維護與建設螞蟻 SOFAArk 和 Koupleless 開源項目、內部 SOFAServerless 產品的研發和實踐。 本文 3488 字&#xff0c;預計閱讀 11 分鐘 業務背景 基于開源 A…

使用pycharm社區版調試DIFY后端python代碼

目錄 背景 前置條件 DIFY使用的框架 API服務調試配置步驟&#xff08;基于tag為0.15.3的版本&#xff09; 1.配置.env文件 2.關閉docker里面的docker-api-1服務 3.使用DOCKER啟動本地環境需要用到的中間件&#xff0c;并暴露端口 注意事項一&#xff1a; 注意事項二&#xff1a…

從 macos 切換到 windows 上安裝的工具類軟件

起因 用了很多年的macos, 已經習慣了macos上的操作, 期望能在windows上獲得類似的體驗, 于是花了一些時間來找windows上相對應的軟件. 截圖軟件 snipaste?????? windows和macos都有的軟件, 截圖非常好用 文件同步軟件 oneDrive: 嘗試了不同的同步軟件, 還是微軟在各…

MySQL體系架構(一)

1.1.MySQL的分支與變種 MySQL變種有好幾個,主要有三個久經考驗的主流變種:Percona Server,MariaDB和 Drizzle。它們都有活躍的用戶社區和一些商業支持,均由獨立的服務供應商支持。同時還有幾個優秀的開源關系數據庫,值得我們了解一下。 1.1.1.Drizzle Drizzle是真正的M…

【項目實訓項目博客】prompt初版實踐

通過對camel技術的理解&#xff0c;我們向其中添加了市場營銷角色的prompt 初版設計如下&#xff1a; chatchainconfig.json { "chain": [ { "phase": "DemandAnalysis", "phaseType": "SimplePhase", "max_turn_step…

[Bond的雜貨鋪] CKS 證書也到貨咯

最近比較忙&#xff0c;忘記寫Blog了&#xff1a;&#xff09; 一年前黑五去官網蹲了一手Cyber Monday&#xff0c;買了英文考試券bundle&#xff0c;當時只考了cka,后來cks差點都忘記了。將近一年后&#xff0c;無意中收到官方的提醒郵件&#xff0c;說考試券本已過期&#x…

【回眸】Linux 內核 (十五) 之 多線程編程 上

前言 進程和線程 區別 線程API 1.創建線程 2.線程退出 3.線程等待 4.線程脫離 5. 線程ID獲取及比較 6.創建及銷毀互斥鎖 7.創建及銷毀條件變量 8. 等待 9.觸發 多線程編程 后記 前言 高產的幾天。 進程和線程 區別 進程——資源分配的最小單位&#xff0c;線…

127.0.0.1本地環回地址(Loopback Address)

127.0.0.1 是計算機網絡中的一個特殊IPv4地址&#xff0c;稱為本地環回地址&#xff08;Loopback Address&#xff09;&#xff0c;主要用于以下用途&#xff1a; 1. 基本定義 本地主機&#xff08;Localhost&#xff09;&#xff1a;該地址始終指向當前正在使用的計算機本身&a…

S7-1200 PLC熱電偶和熱電阻模擬量模塊

熱電偶和熱電阻模擬量模塊 S7-1200 PLC有專用用于對溫度進行采集的熱電偶模塊SM1231 TC和SM 1231RTD。熱電偶模塊有4AI和8AI兩種&#xff0c;下面以SM1231 TC 4AI為例看一下接線圖。 該模塊一共有4個通道&#xff0c;每個通道有兩個接線端子&#xff0c;比如0&#xff0c;0-。…

深度了解向量引論

今天去研究了一個基本數學原理 這個其實需要證明 今天推導了一下這個公式&#xff0c;感覺收獲挺大 下面是手工推導過程

Feign修仙指南:聲明式HTTP請求的優雅之道

各位在微服務世界摸爬滾打的道友們&#xff01;今天要解鎖的是Spring Cloud的絕世神通——Feign&#xff01;這貨堪稱HTTP界的"言出法隨"&#xff0c;只需定義接口&#xff0c;就能自動生成HTTP請求代碼&#xff01;從此告別手動拼裝URL的苦日子&#xff0c;讓你的代…

UDP學習筆記(四)UDP 為什么大小不能超過 64KB?

&#x1f310; UDP 為什么大小不能超過 64KB&#xff1f;TCP 有這個限制嗎&#xff1f; 在進行網絡編程或者調試網絡協議時&#xff0c;我們常常會看到一個說法&#xff1a; “UDP 最大只能發送 64KB 數據。” 這到底是怎么回事&#xff1f;這 64KB 是怎么來的&#xff1f;TCP…

LabVIEW 中串口設備與采集卡的同步精度

在 LabVIEW 項目開發中&#xff0c;常涉及多種設備協同工作&#xff0c;如通過串口設備采集溫度&#xff0c;利用采集卡&#xff08;如 NI 6251&#xff09;采集壓力。此時&#xff0c;設備間的同步精度至關重要&#xff0c;它直接影響系統數據的準確性與可靠性。下面&#xff…

DP_AUX輔助通道介紹

DisplayPort&#xff08;簡稱DP&#xff09;是一個由PC及芯片制造商聯盟開發&#xff0c;視頻電子標準協會&#xff08;VESA&#xff09;標準化的數字式視頻接口標準。該接口免認證、免授權金&#xff0c;主要用于視頻源與顯示器等設備的連接&#xff0c;并也支持攜帶音頻、USB…

[GESP202312 五級] 平均分配

文章目錄 題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1 輸入輸出樣例 #2輸入 #2輸出 #2 提交鏈接提示解析參考代碼 題目描述 小楊認為&#xff0c;所有大于等于 a a a 的完全平方數都是他的超級幸運數。 小楊還認為&#xff0c;所有超級幸運數的倍數都是他的幸運…

[Mysql]buffersize修改

1、找到my.cnf文件位置 ps -ef|grep mysqld 2、編輯my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改為內存的50%~70% 3、重啟服務 systemctl restart mysqld