zoukankan      html  css  js  c++  java
  • VS2010 MFC中在对话框上添加工具栏以及工具栏提示信息并改变图标支持256色

    网上资料:

    在基于单文档和基于多文档的MFC中,工具栏是自动添加的,但是在基于对话框的MFC中则需要编者用代码添加,而且工具栏的提示信息的添加也较SDI和MDI要复杂的多,下面讲的是:如何在基于对话框的MFC中添加工具栏,以及工具栏的提示信息,以及改变工具栏的图标,使其支持256色。

    1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1

    2.在主程序的.h文件中加入变量:

                       CToolBar m_wndtoolbar;//添加工具栏

                       CImageList m_ilToolBar;//使工具栏图标显示256色

    3.在主程序的.h文件中加入函数:

    afx_msg BOOL OnToolTipText(UINT NID, NMHDR* pNMHDR, LRESULT* pResult);//使工具栏显示提示信息

    4.在主程序的.h文件中的BEGIN_MESSAGE_MAP(CDetectorDlg, CDialog)函数里加入:

             ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipText )//使工具栏显示提示信息

    5.在主程序的.cpp文件中,在初始化的地方(OnCreate或者OnInitDialog)加入:

    //添加一个平面工具栏

    if (!m_wndtoolbar.CreateEx( this,TBSTYLE_FLAT ,  WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS,

        CRect(4,4,0,0)) ||    !m_wndtoolbar.LoadToolBar(IDR_TOOLBAR1) )

    {

             TRACE0("failed to create toolbar\n");

             return FALSE;

    }

    m_wndtoolbar.ShowWindow(SW_SHOW);

    RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

    //使工具栏图标显示256色

    HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),

    MAKEINTRESOURCE(IDR_TOOLBAR1), //加载IDB_TOOLBAR

    IMAGE_BITMAP, //按位图格式

    0,0, // cx,cy

    LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );

    CBitmap bm;

    bm.Attach(hbm);

    m_ilToolBar.Create(24,24,ILC_COLOR8, 4, 4);

    m_ilToolBar.Add(&bm,(CBitmap*)NULL);

    m_wndtoolbar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

    6.在主程序的.cpp文件中编译函数OnToolTipText//使工具栏显示提示信息

    BOOL CDetectorDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)

    {

    ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);

            

             // UNICODE消息

             TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;

             TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

             //TCHAR szFullText[512];

             CString strTipText;

             UINT nID = pNMHDR->idFrom;

            

             if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||

                       pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))

             {

                       // idFrom为工具条的HWND

                       nID = ::GetDlgCtrlID((HWND)nID);

             }

            

             if (nID != 0) //不为分隔符

             {

                       strTipText.LoadString(nID);

                       strTipText = strTipText.Mid(strTipText.Find('\n',0)+1);

                      

    #ifndef _UNICODE

                       if (pNMHDR->code == TTN_NEEDTEXTA)

                       {

                                lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));

                       }

                       else

                       {

                                _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));

                       }

    #else

                       if (pNMHDR->code == TTN_NEEDTEXTA)

                       {

                                _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));

                       }

                       else

                       {

                                lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));

                       }

    #endif

                      

                       *pResult = 0;

                      

                       // 使工具条提示窗口在最上面

                       ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|

                                SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);

                       return TRUE;

             }

             return TRUE;

    }

    7.在ResourceView的String资源里,将工具栏中每个按钮的ID都对应上希望显示的提示信息即可,例如:

    toolbar中有一按钮的ID是IDC_OPENFILE,希望显示的提示信息为“打开文件” 那么,你需要做的就是在string资源中加入一条ID同样是IDC_OPENFILE,  内容是: 打开文件

    在运行的时候,将鼠标放在按钮上面就会提示 "打开文件"了

    这样就完成了所有的步骤。

  • 相关阅读:
    css深入理解之margin
    position:fixed相对父级元素定位而不是浏览器
    移动web基础
    css多行文本溢出显示省略号
    30丨案例:为什么参数化数据会导致TPS突然下降
    29丨案例:如何应对因网络参数导致的TPS%08呈锯齿状
    28丨案例:带宽消耗以及Swap(下)
    27丨案例:带宽消耗以及Swap(上)
    26丨案例:理解TPS趋势分析
    25丨SkyWalking:性能监控工具之链路级监控及常用计数器解析
  • 原文地址:https://www.cnblogs.com/lxt287994374/p/2957132.html
Copyright © 2011-2022 走看看