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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【MFC】定义XP风格的工具栏

發布時間:2024/4/24 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MFC】定义XP风格的工具栏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 案例概述
    • 02. 開發環境
    • 03. 關鍵技術
    • 04. 程序設計
    • 05. 秘笈心法
    • 06. 源碼下載
    • 07. 附錄

01. 案例概述

網上的許多軟件都具有漂亮的工具欄,咱們模仿XP風格的工具欄,設計了一個自定義的工具欄按鈕,效果如下圖所示。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wrUKqxhg-1614937100041)(assets/image-20210305173744393.png)]

02. 開發環境

系統環境:Windows 10

開發環境:Visual Studio 2019

03. 關鍵技術

在MFC中,繪制工具欄、樹視圖、列表視圖等控件需要處理NM_CUSTOMDRAW通知消息。首先從CToolBarCtrl類派生一個子類,本例為CXPBar,在該類的消息映射部分添加反射消息映射宏ON_NOTIFY_REFLECT,代碼如下:

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnOwnerDraw)

編寫NM_CUSTOMDRAW消息處理函數OnOwnerDraw,實現工具欄按鈕的繪制。

04. 程序設計

(1)創建基于對話框的應用程序。

(2)由CToolBarCtrl派生一個新類CXPBar。

#pragma once// XPBarclass XPBar : public CToolBarCtrl {DECLARE_DYNAMIC(XPBar)public:XPBar();virtual ~XPBar();public:COLORREF m_TextColor;COLORREF m_HotColor;COLORREF m_LineColor;BOOL m_IsDraw;public:void DrawButton(CDC* pDC, const RECT& rect, UINT uState);void OnOwnerDraw(NMHDR* pNotifyStruct, LRESULT* pResult);protected:DECLARE_MESSAGE_MAP() public:afx_msg void OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult); };// XPBar.cpp: 實現文件 //#include "pch.h" #include "5XPBar.h" #include "XPBar.h"// XPBarIMPLEMENT_DYNAMIC(XPBar, CToolBarCtrl)XPBar::XPBar() {//初始化m_HotColor = RGB(193, 210, 238);m_TextColor = RGB(0, 0, 255);m_LineColor = RGB(49, 106, 197);m_IsDraw = TRUE; }XPBar::~XPBar() { }void XPBar::DrawButton(CDC* pDC, const RECT& rect, UINT uState) {CPoint pt;GetCursorPos(&pt);ScreenToClient(&pt);CRect rect1;GetClientRect(rect1);if (rect1.PtInRect(pt)){if (uState & CDIS_HOT){CPen pen(PS_SOLID, 1, m_LineColor);CPen* pOldPen = pDC->SelectObject(&pen);CBrush brush(m_HotColor);CBrush* pOldBrush = pDC->SelectObject(&brush);pDC->Rectangle(&rect);pDC->SelectObject(pOldBrush);pDC->SelectObject(pOldPen);}} }void XPBar::OnOwnerDraw(NMHDR* pNotifyStruct, LRESULT* pResult) {NMTBCUSTOMDRAW* pCustomDraw = (NMTBCUSTOMDRAW*)pNotifyStruct;CDC dc;dc.Attach(pCustomDraw->nmcd.hdc);pCustomDraw->clrText = m_TextColor;switch (pCustomDraw->nmcd.dwDrawStage){case CDDS_PREPAINT:*pResult = CDRF_NOTIFYITEMDRAW;break;case CDDS_ITEMPREPAINT:DrawButton(&dc, pCustomDraw->nmcd.rc, pCustomDraw->nmcd.uItemState);*pResult = TBCDRF_NOEDGES; //不繪按鈕邊框break;}dc.Detach(); }BEGIN_MESSAGE_MAP(XPBar, CToolBarCtrl)ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, XPBar::OnNMCustomdraw) END_MESSAGE_MAP()// XPBar 消息處理程序void XPBar::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) {LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼*pResult = 0; }

(3)添加CXPBar類的NM_CUSTOMDRAW消息的實現函數,實現代碼如下。

BOOL CMy5XPBarDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標// TODO: 在此添加額外的初始化代碼m_ImageList.Create(22, 22, ILC_COLOR24 | ILC_MASK, 1, 1);m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));m_ToolBar.Create(WS_CHILD | TBSTYLE_FLAT | WS_VISIBLE | CBRS_NOALIGN, CRect(0, 0, 0, 0), this, 111);m_ToolBar.SetImageList(&m_ImageList);TBBUTTON buttons[5];for (int i = 0; i < 5; i++){buttons[i].idCommand = 100 + i;buttons[i].iBitmap = i;buttons[i].fsStyle = TBSTYLE_FLAT;buttons[i].fsState = TBSTATE_ENABLED;buttons[i].iString = IDS_ABOUTBOX;}m_ToolBar.AddButtons(5, buttons);TBBUTTONINFO bInfo;bInfo.cbSize = sizeof(TBBUTTONINFO);bInfo.dwMask = TBIF_TEXT;bInfo.pszText = TEXT("系統登錄");BOOL ret = m_ToolBar.SetButtonInfo(100, &bInfo);bInfo.pszText = TEXT("商品銷售");m_ToolBar.SetButtonInfo(101, &bInfo);bInfo.pszText = TEXT("銷售查詢");m_ToolBar.SetButtonInfo(102, &bInfo);bInfo.pszText = TEXT("系統幫助");m_ToolBar.SetButtonInfo(103, &bInfo);bInfo.pszText = TEXT("關于");m_ToolBar.SetButtonInfo(104, &bInfo);m_ToolBar.SetButtonWidth(50, 80);m_ToolBar.MoveWindow(10, 10, 100, 50);return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }

05. 秘笈心法

反射消息的應用

實例中對反射消息的一次運用,反射消息是指子控件向父控件發送消息,而父控件并沒有處理該消息,而是把消息返回給子控件,讓子控件來處理這個消息,這就形成了一去一回的反射過程,映射宏中有幾個是帶REFLECT字樣的,都代表是反射類型。

06. 源碼下載

下載:【MFC】定義XP風格的工具欄.rar

07. 附錄

總結

以上是生活随笔為你收集整理的【MFC】定义XP风格的工具栏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲 在线 | 国产福利不卡视频 | 天堂久久网 | sesese99| 能在线观看的av网站 | 欧美男人操女人 | 日日夜夜精| 日韩av高清无码 | 亚洲精品视频一区二区三区 | 亚洲精品久久久久久久久久吃药 | 久久艹中文字幕 | 神马久久香蕉 | 国产伦精品一区二区三区免费视频 | 国产午夜精品一区二区三区欧美 | 欧美午夜激情影院 | 李丽珍毛片| 亚洲天堂伊人网 | 欧美一级淫片免费视频魅影视频 | 欧美一区二区三区成人精品 | xxxx 国产| 91网站免费 | 最新中文字幕第一页 | 色老头一区二区三区在线观看 | 另类专区成人 | 欧美日韩人妻精品一区 | 日韩人妻无码一区二区三区 | 白丝动漫美女 | 亚洲乱码中文字幕久久孕妇黑人 | 国产乱淫av麻豆国产 | 快播怡红院 | 婷婷视频在线观看 | 超碰女优| 丁香激情五月 | 一区二区的视频 | 美女让男生桶 | 亚洲乱码国产乱码精品精剪 | 国产黄色网 | 欧美日韩在线二区 | 久久精品国产亚洲av麻豆色欲 | 日韩经典一区二区 | 在线网站av| 黄色福利片 | 亚洲二区在线播放视频 | 精品少妇人妻av免费久久久 | 欧美图片一区二区三区 | 午夜一区在线 | 天堂成人 | 亚洲视频免费在线播放 | 韩国短剧在线观看 | 夜夜草视频| 99热思思 | 欧美日韩在线成人 | 麻豆影视在线播放 | 亚洲欧洲自拍偷拍 | 综合激情五月婷婷 | 手机在线亚洲 | 亚洲一区二区三区在线 | 天天拍夜夜操 | 欧美日韩亚洲成人 | 视频一区二区三区在线观看 | 91精品国产乱码久久久张津瑜 | 国产精品成人午夜视频 | 1024久久| 三级视频网站在线观看 | 91污网站| 亚洲天堂男人的天堂 | 亚洲一区二区免费视频 | 亚洲AV无码久久精品国产一区 | 国产91色在线 | 尤物视频官网 | 成人爽爽视频 | 色婷婷综合久久久久中文一区二区 | 成人精品三级 | 亚洲欧美国产高清va在线播放 | 天天天天天天天天干 | 亚洲国产天堂 | 欧美精品一区二区三区三州 | 久久精品免费电影 | 久久久成人免费视频 | 欧美性在线观看 | 在线免费国产视频 | 无码人妻精品一区二区三区9厂 | 精品久久久久久久久久久久久久 | 综合激情网站 | 潘金莲一级淫片aaaaaaa | 波多野结衣免费在线视频 | 日本高清视频一区二区三区 | 秋霞99| 人妻互换一区二区三区四区五区 | 农村少妇久久久久久久 | 欧美乱码精品一区二区三区 | videos麻豆 | 日韩欧美中文在线 | 久久久电影 | 亚州av在线播放 | 欧美成人午夜精品免费 | 一级黄色片片 | 免费视频一区二区 | 美女av毛片 |