注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

MFC设置窗口背景为图片  

2016-05-20 22:31:50|  分类: 图像处理 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在rc中导入bmp图片,图片ID为IDB_PIC_BITMAP
在OnPaint成员函数中插入代码:
void CMy20160515_3backgroDlg::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
    {
//         CDialogEx::OnPaint();
        CPaintDC dc(this); //这里看
        CRect rect;
        GetClientRect(&rect);//取得客户区矩形的大小
        CDC dcMem;
        dcMem.CreateCompatibleDC(&dc);
        CBitmap bmpBackGround;
        bmpBackGround.LoadBitmapW(IDB_PIC_BITMAP);
        BITMAP bitmap;
        bmpBackGround.GetBitmap(&bitmap);
        CBitmap *pbmpOld = dcMem.SelectObject(&bmpBackGround);
        dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
    }
}
在这里简单介绍下DC(设备描述表)的相关MFC概念,基类是CDC,CPaintDC、CWindowDC、CClientDC、CmetafileDC,其中,CDC类是MFC绘图的根类,其他的几个类都是CDC的派生类。实际中用的多的是CDC、CPaintDC和CClientDC类。
使用 CDC 类必须首先调用 Win32 API 的 BeginPaint()函数为重绘工作做一些准备工作,在完成绘制之后还需用 Win32 API 的 EndPaint()函数来结束绘制工作。所有的绘图操作都必须在这两个函数之间完成。
CPaintDC 类是 OnPaint()函数使用的绘图类,亦即用来响应 Windows 消息 WM_PAINT(窗口刷新)的成员函数的绘图类。因此,如果为了维护图形的完整性,而需要重新编写视窗的 OnPaint()函数时,就必须使用 CPaintDC 类来定义一个绘图对象。CPaintDC 类封装了 Win32 API 的 BeginPaint()函数和 EndPaint()函数。
CClientDC 类也是 CDC 类的派生类,其绘图控制区为窗口的客户区,该类可以实时的将图形绘制到客户区上。它是为不响应 Windows 消息 WM_PAINT 的成员函数提供的绘图类,亦即在 OnPaint()函数中不使用 CClientDC 类。CClientDC 类封装了 Win32 API 的 GetDC()函数和 ReleaseDC()函数。

MFC中当视图窗口绘制或重绘制(窗口刷新消息 WM_PAINT)时,都要调用 OnDraw 函数。该函数中必须生成设备描述表类
CPaintDC 对象才能绘图,其代码示例如下:

void CTestDialog::OnPaint()
{
// Device context for painting
CPaintDC pdc(this);
// 用户在此添加代码。
}//就像文章一开始的例子,当然,这些MFC已经帮我们做好了

对于在 OnDraw 和 OnPaint 之外的函数中绘制图形,必须生成设备描述表类
CClientDC 对象才能绘图,其代码示例如下:

void CTestView::FunctionName()
{
// Device context for painting
CClientDC pdc(this);
// 用户在此添加代码。
}







  评论这张
 
阅读(15)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017