第六篇--MFC美化界面

本文详细介绍了如何使用MFC进行界面美化,包括设置背景颜色、背景图片、修改可执行文件和标题栏图标、Button的绘制、静态文本的字体及颜色处理、取消标题栏并自制标题栏以及实现标题栏拖动功能的方法,提供了实用的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MFC如何设置背景颜色

 首先,为对话框添加WM_CTLCOLOR消息,方法为:右击Dialog窗口 --> Class Wizard --> Messages --> WM_CTLCOLOR --> Add Handler --> Edit Code

然后,在Dlg.h文件中添加成员变量CBrush m_brush; 

接着,在之前Edit Code的位置,写上

HBRUSH CMFCInterfaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    return m_brush;
}

 

最后,在Dlg.cpp文件的OnInitDialog()函数后面加上m_brush.CreateSolidBrush(RGB(255, 255, 102));//设置背景颜色为黄色。编译运行函数即可。

 

2.MFC如何设置背景图片

首先在网上下载一张Bitmap的图片,放在res文件夹下

接着在OnInitDialog()后面加上如下代码

   CString strBmpPath = _T(".\\res\\backgroundone.jpg");

    CImage img;

    img.Load(strBmpPath);

    MoveWindow(0, 0, img.GetWidth(), img.GetHeight());

    CBitmap bmpTmp;

    bmpTmp.Attach(img.Detach());

    m_brush.CreatePatternBrush(&bmpTmp);

 

 

 3.MFC修改可执行文件和标题栏图标

创建一个新工程,可以什么都不加。打开.rc,  创建或打开Icon资源(以下都以Icon为例)。    
单击工程窗口的资源视图标签,选中资源ID为IDR_MAINFRAME图标资源,然后按Delete键把它删除掉,当然也可以不删,具体后面会讲到。    
从资源菜单中选择Resource,然后选择Icon,添加资源,选中Icon类型,点击导入,此时会叫你选择本地的图片,记住必须选择.ioc格式的图片,否则导入失败。    
把新图标的资源ID改为IDI_ICON(也可以不改)。 具体做法如下: 

有一点很重要,你改知道就是 打开Header Files下的Resource.h,找到Icon下的图标,系统默认是从128开始的,

#define IDR_MAINFRAME               128

#define IDR_ICONTETYPE             129(单/多文档程序的文档图标)

#define IDI_ICON1                            130

#define IDI_ICON2                            131

a.修改exe文件图标

VS2010生成的exe文件图标是用Icon下几个图标中value值最小的,顺序为IDR_MAINFRAME、IDR_ICONTETYPE、新加 的,所以想更改生成的exe文件图标,只要保证图标的value值是Icon下几个图标中最小的就可以了

  1. 导入自己的.ioc图片,并在Resource.h中,将自己加的icon资源Value改为最小,如下,因此不一定要删除IDR_MAINFRAME

  #define IDR_MAINFRAME                   129

  #define IDI_ICON1                               128(自己添加的icon) 

  2. 然后编译运行,找到你的debug目录,你将看到图标已经更改的.exe执行文件,这种方法可以将任何你喜欢的图片做成.exe文件图标

 

b.修改标题栏图标

  1. 如上操作,导入自己喜爱的ico图片,编辑新加icon的ID,比如我新加的Icon资源ID为 IDI_ICON1

  22. 基于对话框的程序,在构造函数中有一句

    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    此时把IDR_MAINFRAME改为我的IDI_ICON1的图标名。

 

4. Button的绘制

 首先,拖动几个Button到窗口,然后修改Button的Owner Draw属性为true

 接着,右击Dialog窗口 --> Class Wizard --> Messages --> WM_DRAWITEM --> Add Handler --> Edit Code

void CMFCInterfaceDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Add your message handler code here and/or call default

    //获得button标题 
    //CString btnCaption = _T("Dialog");
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

    CString btnCaption = L"";
    //设置标题
    switch (lpDrawItemStruct->CtlID)
    {
    case ID1:
        btnCaption = "1";
        break;
    case ID2:
        btnCaption = "2";
        break;
    case ID3:
        btnCaption = "3";
        break;
    default:
        ;
    }

    CRect drawRect;
    //获得绘图DC
    //得到原Button的矩形大小
    drawRect.CopyRect(&(lpDrawItemStruct->rcItem));
    //绘制控件框架 
    pDC->DrawFrameControl(&drawRect, DFC_BUTTON, lpDrawItemStruct->CtlType);


    //创建画刷
    CBrush pBrush;
    pBrush.CreateSolidBrush(RGB(100, 130, 10));
    //画矩形 
    pDC->FillRect(drawRect, &pBrush);


    //定义一个CRect用于绘制文本 
    CRect textRect;
    //拷贝矩形区域 
    textRect.CopyRect(&drawRect);
    //获得字符串尺寸
    CSize sz = pDC->GetTextExtent(btnCaption);
    //调整文本位置 居中 
    textRect.top += (textRect.Height() - sz.cy) / 2;
    //设置文本背景透明 
    pDC->SetBkMode(TRANSPARENT);
    //设置文本颜色
    pDC->SetTextColor(RGB(0, 0, 255));
    //绘制文本内容
    pDC->DrawText(btnCaption, &textRect, DT_RIGHT | DT_CENTER | DT_BOTTOM);

    CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
View Code

 

当然,对于不想要改变的Button,将Owner Draw属性设为false就行。

 

5.static text字体及颜色的绘制

颜色绘制:

在OnCTLColor中

HBRUSH CMFCInterfaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    //HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    if (pWnd == this)
    {
        return m_brush;
    }


    if (pWnd->GetDlgCtrlID() == (IDC_STATIC_TITLE))//IDC_STATIC_TITLE:标题ID
    {
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetTextColor(RGB(255, 251, 240));
        return HBRUSH(GetStockObject(HOLLOW_BRUSH));
    }

    if (pWnd->GetDlgCtrlID() == (IDC_STATIC))//IDC_STATIC:文本ID
    {
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetTextColor(RGB(0, 225, 225));
        return HBRUSH(GetStockObject(HOLLOW_BRUSH));
    }

    return hbr;

    //return m_brush;
}
View Code

 

额外提示:pDC->SetBkMode(TRANSPARENT);是设置文本背景透明。

字体绘制:

首先,在Dlg.h文件中声明Font变量CFont newFont;

然后,在OnInitDialog()函数后面加上以下代码

        CFont* font;
    font = static_title.GetFont();//获取CFont对象
    LOGFONT lf;
    font->GetLogFont(&lf);//获取LOGFONT结构体
    lf.lfHeight = -15;    //修改字体大小
    lf.lfItalic = TRUE;        //倾斜
    lf.lfWeight = 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值