MFC 替换对话框背景图

1.在网站下载一副自己喜欢的图片做背景,注意图片大小跟分辨率,一般选择不大于2M的图片

 2.在对话框头文件加一个CBrush变量,变量名是m_bkBrush

3.OnInitDialog中初始化它,定义如下

BOOL CMFCDialogUIDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
 
    // 将“关于...”菜单项添加到系统菜单中。
 
    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
 
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        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:  在此添加额外的初始化代码
 
    CString strBmpPath = _T(".\\res\\Background.png");
 
    CImage img;
 
    img.Load(strBmpPath);
 
    MoveWindow(0, 0, img.GetWidth(), img.GetHeight());
 
    CBitmap bmpTmp;
 
    bmpTmp.Attach(img.Detach());
 
    m_bkBrush.CreatePatternBrush(&bmpTmp);


CRgn rgnTmp;
RECT rc;
GetClientRect(&rc);
rgnTmp.CreateRoundRectRgn(rc.left + 3, rc.top + 3, rc.right - rc.left - 3, rc.bottom-rc.top -3, 6, 6);
SetWindowRgn(rgnTmp, TRUE);

 
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

4.注意此时的窗口大小为图片的大小,并不一定符合你原始对话框的大小,在MoveWindow(0, 0, img.GetWidth(), img.GetHeight());之前加如下代码

RECT rc0;
GetClientRect(&rc0);设置断点运行,确定对话框的长度跟宽度,然后在MoveWindow(0, 0, img.GetWidth(), img.GetHeight())语句中的img.GetWidth(), img.GetHeight()前面乘以相应的 系数就可以得到原始窗口大小的背景图片。

例如:rc0.width=970;rc0.height=1610;

          img.GetWidth()=2550;

          img.GetHeight()=2888;

     那么img.GetWidth()*0.38=970;

            img.GetHeight()*0.557=1610;

5.在Dlg类中添加消息相应函数WM_CTLCOLOR,添加如下代码


HBRUSH CMFCDialogUIDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
 
    if (pWnd == this)
    {
        return m_bkBrush;
    }
 
    return hbr;

6.添加消息相应函数WM_NCHITTEST,并添加代码

LRESULT CMFCDialogUIDlg::OnNcHitTest(CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    LRESULT ret = CDialogEx::OnNcHitTest(point);
    return (ret == HTCLIENT) ? HTCAPTION : ret;
}
使得对话框可以自由拖动

7  运行程序

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值