您的位置:首页 > 其它

MFC几种给对话框添加背景图的方法

2014-09-18 16:59 459 查看


1,目标

总结几种给MFC对话框添加背景图片的方法。


2,实现

方式一:(适用于多种格式)用CImage类可以加载多种格式的图片,在OnPaint中Draw即可。

[cpp] view
plaincopy





void CBackgroundDlg::OnPaint()  

{  

    if (IsIconic())  

    {  

        CPaintDC dc(this); // 用于绘制的设备上下文  

  

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  

  

        // 使图标在工作区矩形中居中  

        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;  

  

        // 绘制图标  

        dc.DrawIcon(x, y, m_hIcon);  

    }  

    else  

    {  

        CRect rc;  

        GetWindowRect(&rc);  

        CImage mImage;  

        if(mImage.Load(_T("1.jpg")) == S_OK)  

        {  

            //这里让图片绘制区域和窗口大小一致  

            mImage.Draw(GetDC()->GetSafeHdc(), CRect(0,0,rc.Width(),rc.Height()));  

        }  

    }  

}  

方式二:(bmp格式)用CDC的StretchBlt 方法绘制适用窗口大小的位图。

[cpp] view
plaincopy





void CBackgroundDlg::OnPaint()  

{  

    if (IsIconic())  

    {  

        CPaintDC dc(this); // 用于绘制的设备上下文  

  

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  

  

        // 使图标在工作区矩形中居中  

        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;  

  

        // 绘制图标  

        dc.DrawIcon(x, y, m_hIcon);  

    }  

    else  

    {  

        //加载位图  

        CBitmap bitmap;  

        bitmap.LoadBitmap(IDB_BITMAP1);  

  

        //选入DC  

        CClientDC cdc(this);   

        CDC comdc;  

        comdc.CreateCompatibleDC(&cdc);  

        comdc.SelectObject(&bitmap);  

  

        //生成BITMAP  

        BITMAP bit;  

        bitmap.GetBitmap(&bit);  

  

        //客户区域  

        CRect rect;  

        GetClientRect(rect);  

          

        //用客户区的DC绘制所生成的BITMAP,并适应为窗口大小  

        cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&comdc,0,0,bit.bmWidth,bit.bmHeight,SRCCOPY);  

    }  

}  

方式三:(bmp格式)用CDialog的OnCtlColor()消息响应处理背景画刷。

加载位图资源IDB_BITMAP1,在Dlg类头文件中加入:

[cpp] view
plaincopy





CBrush m_brush;  

在OnInitDialog()中加入:

[cpp] view
plaincopy





       CBitmap bmp;  

bmp.LoadBitmap(IDB_BITMAP1);   //IDB_BITMAP1是图片资源ID  

m_brush.CreatePatternBrush(&bmp);  

给Dlg类添加WM_CTLCOLOR消息处理函数OnCtlColor,修改return 为我们的画刷:

[cpp] view
plaincopy





HBRUSH CBackgroundDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  

{  

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

  

    return (HBRUSH)m_brush;  

}  

这里就让大家看一种不同的效果,平铺(后面的效果图3)


3,效果

方式一效果图:



方式二效果图:



方式三效果图:




4,源码

VS2008sp1工程免费下载:

http://yun.baidu.com/s/1tL1wy

原文连接:http://blog.csdn.net/dpsying/article/details/17288135
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: