剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. 编程之美
  3. 正文

MFC自绘带背景颜色标题栏

2015年06月25日 722点热度 1人点赞 4条评论

最近在写一个EDID文件生成器,可以根据输入的一些参数生成EDID文件,大多数字节是固定的,主要是详细时序这几个字节的计算,界面用的是MFC,不过我重绘了,因为MFC原生界面太丑了。下图是EDID生成器初步的效果:
EDIDcreator

本文主要讲怎么绘制带颜色的标题栏,就像上图的蓝色背景标题栏。
1)首先是根据向导创建一个普通对话框程序,然后修改对话框Border属性为None。
EDIDcreator1

2)在void XXXXDlg::OnPaint()函数中加入如下绘制代码:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void xxxxDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting
 
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
 
        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CPaintDC dc(this);
        Graphics graph(dc);
        RECT rc;
        SolidBrush titleBrush(Color(20, 150, 250));
        SolidBrush bottomBrush(Color(20, 150, 250));
        // 获取对话框大小
        GetClientRect(&rc);
        // 绘制标题栏
        graph.FillRectangle(&titleBrush, rc.left, rc.top, rc.right-rc.left, 23);
                //绘制底部边框
        graph.FillRectangle(&bottomBrush, rc.left, rc.bottom-5, rc.right-rc.left, 5);
        
        dc.SetBkColor(RGB(20, 150, 250));
                //设置标题栏文字
        dc.SetTextColor(RGB(255, 255, 255));
        dc.TextOut(4,4,_T("EDIDCreator"));
        DeleteObject(&titleBrush);
        DeleteObject(&bottomBrush);
        ReleaseDC(&dc);
        CDialog::OnPaint();
    }
}

代码中我除了绘制标题栏,还绘制了程序底部的边框。
3)响应鼠标点击标题栏消息,实现鼠标拖动。在对话框的OnLButtonDown消息中添加如下代码:

1
2
3
4
5
6
7
8
9
10
void xxxxDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // 判断是否在标题栏,点击移动标题栏
    if ((point.y > 0) && (point.y < 25))
    {
        PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
    }
    
    CDialog::OnLButtonDown(nFlags, point);
}

到此就大功告成了,实现了一个蓝色背景的标题栏。在后面的文章中我还会介绍如何完善该标题栏,加入关闭,最小化按钮。

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: C++
最后更新:2018年09月29日

Jeff Young

代码为剑,如痴如醉

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • zhangzheng

    按照你的方法并没成功设置标题栏颜色,只是有了文字背景

    2018年08月06日
    回复
    • Jianchihu

      @zhangzheng 使用gdiplus必须初始化相关东西。
      首先在你的头文件xxxDlg.h声明变量:
      ULONG_PTR m_gdiplusStartupToken;
      接着xxxDlg.cpp:初始化gdiplus:
      Gdiplus::GdiplusStartupInput gdiInput;
      Gdiplus::GdiplusStartup(&m_gdiplusStartupToken, &gdiInput, NULL);
      结束时释放gdiplus:
      Gdiplus::GdiplusShutdown(m_gdiplusStartupToken);
      我想这几步gdiplus的初始化释放你没写吧。

      2018年08月06日
      回复
  • wunian

    请问如何完善该标题栏,加入关闭,最小化按钮

    2018年09月02日
    回复
    • Jianchihu

      @wunian

      这个要自己添加按钮,然后重绘按钮。话说现在写界面不建议MFC了(没饭吃),我已经不搞这个了,建议使用duilib,或者封装个浏览器,web写界面。

      2018年09月06日
      回复
  • 取消回复

    我的其它小窝

    公众号:码上Play(基本不更新,回答问题用)

    近期评论
    • Jeff on Windows平台WebRTC编译(持续更新)M79是2019年发布的版本,不适用这篇文章。编译…
    • haige on Windows平台WebRTC编译(持续更新)我编译的m79版本,用VS2019打开会报错, F…
    • 菜菜 on libcef编译使用--使用VS2015是真的鸟
    • Jeff on WebRTC研究:应用受限区域探测器-AlrDetector不知道你怎么得出`让gcc发送更频繁`这个结论
    • vtron on 音视频开发入门:视频基础赞一个
    版权声明

    为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

    相关文章推荐
    • web页面npapi插件资源管理问题
    • 基于FireBreath的npapi插件在Firefox下的调试
    • 对那些自称“精通c++”人的看法
    • 网络字节转换到本地字节的函数模板
    • libcef编译使用--使用VS2015

    COPYRIGHT © 2021 剑痴乎. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS