天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 137|回复: 0

MFC菜单栏及工具栏实现

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
MFC菜单栏实现:

    在资源视图中,右键工程名.rc-->添加资源,选择Menu。对Menu设置ID,并对Menu菜单进行设置(即添加菜单栏的名字)

    在C***Dlg.h中,添加CMenu m_Menu;

    在C***Dlg.c的初始化中,添加m_Menu.LoadMenu(IDR_MENU1);  //  IDR_MENU1

SetMenu(&m_Menu);



MFC工具栏实现:

    工具栏的实现由好几种,现在举例两种:(推荐第一种)

第一种:

    在资源视图中,右键工程名.rc-->添加资源,选择ToolBar。打开ToolBar,为每个按钮命名ID,这样就可以生成按钮,如果发现按钮加多了,就把按钮从ToolBar拖到下方区域就没了。根据自己合成的BMP图片选择按钮数量,并选择好尺寸,按钮数量添加足够厚,点击保存,这时在res里会生成一个toolbar1.bmp,然后你需要将你的bmp替换掉这个toolbar1.bmp,名字保持一致,然后回到VS中重新加载,这样就能够进VS了。

    下面说一下BMP图标制作:

    1.先制作单张的图标,bmp格式的16*16的图片,可以用PS做,通过像素大小设置尺寸,里面的铅笔工具比较好用,对图片进行拾色Alt+鼠标左键,制作完成后保存成bmp图即可。

    2.然后使用合成软件,开始用的是TBCreator和MergePic,但后面发现VS加载工具栏图标后会有一些地方颜色与事先排序的不一致,而且会有错位,无奈换了VisualToolbar才好了。使用VisualToolbar生成hot图,然后需要将图片设置成4位bmp图。刚开始使用PS里做的,但感觉不太好用,方法是:加载图片后,图像-->模式-->索引颜色,然后文件-->存储为,选择bmp图,然后保存后悔弹出一个对话框,选择4位bmp图即可。另一种方法是用win7自带的画图工具,加载图片后,进行另存为,选择16色位图bmp,bmp4位=16色位图(2^4=16)。

    3.最后将该图片替换掉原始的toolbar1.bmp即可。

    有一个问题,使用LoadToolBar貌似只能加载4位的bmp图,无法加载16位的图,一加载就崩溃,因此这里加载的IDR_TOOLBAR1是4位bmp图。

程序方面:

在C***Dlg.h中,添加CToolBar    m_toolbar;CImageList m_ImageList;

  在C***Dlg.c的初始化中

if(!m_toolbar.CreateEx(this,TBSTYLE_TOOLTIPS|TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
                           | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_toolbar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to Create Dialog ToolBar\n");
EndDialog(IDCANCEL);
}
m_toolbar.EnableToolTips(TRUE);
m_toolbar.ShowWindow(SW_SHOW);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);                        //调整工具栏的位置
第二种方法:
    在资源视图中,右键工程名.rc-->添加资源,选择ToolBar。同时新建一个Bitmap,然后将要显示的图片进行加载,单个的图标位图大小为16*16。

    在C***Dlg.h中,添加CToolBar    m_toolbar;CImageList m_ImageList;

    在C***Dlg.c的初始化中

BOOL CDrawDemoDlg::ToolBar_Init()
{
        //创建Toolbar,加载Toolbar
        if(!m_toolbar.CreateEx(this,TBSTYLE_TOOLTIPS|TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
                           | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_toolbar.LoadToolBar(IDR_TOOLBAR1))
        {
         TRACE0("Failed to Create Dialog ToolBar\n");
        EndDialog(IDCANCEL);
        }
  
    //16位的工具栏按钮个数决定24位的工具栏按钮个数,因为那些bmp位图是显示在工具栏按钮上的
    CImageList  image;
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP2);                                                                                                        //加载24位BMP工具栏
    image.Create(16, 16, ILC_MASK | ILC_COLOR24, 3, 1);                                                                //创建图像列表,ILC_MASK表示背景透明,3个工具按钮,每次增加一个
    image.Add(&bmp,RGB(255,255,255));                                                                                                //把bmp加入到图像列表,背景颜色为白色
    m_toolbar.GetToolBarCtrl().SetImageList(&image);
    image.Detach();                                                                                                                                        //用完之后解绑
    bmp.Detach();                                                                                                                                        //用完之后解绑

    CRect rect;                                                                                                                                                //如果显示不完全,就调整一下大小
    m_toolbar.GetItemRect(0, &rect);                                                                                                //获取第一个工具按钮的大小
    m_toolbar.SetSizes(rect.Size(), CSize(16, 16));                                                                        //第一个参数是按钮大小,第二个是图片大小
    m_toolbar.EnableToolTips(TRUE);
    m_toolbar.ShowWindow(SW_SHOW);
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);                        //调整工具栏的位置
    return TRUE;
}


给工具栏增加提示消息

ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipText)

在资源视图的toolbar中为每个图标添加prompt。

BOOL CDrawDemoDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
        ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);

        //  UNICODE消息
        TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
        TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
        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;
}

给工具栏的按钮增加事件处理程序

ON_COMMAND(IDM_TEST, OnTest)//工具栏

void CDrawDemoDlg::OnTest()
{
// TODO: Add your command handler code here
MessageBox("test");
}

 

 

 

 

MFC菜单栏及工具栏实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:34 , Processed in 0.160347 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表