在对话框中设置背景的三种方法 .

方法一:

在OnPaint中StretchBlt

具体是:注释掉CDialog::OnPaint()或放到结尾(原因何在呢?),并加入贴图代码

[cpp] view plaincopyprint?

  1. void CqqqqqDlg::OnPaint()  
  2. {  
  3.     if (IsIconic())  
  4.     {  
  5.         CPaintDC dc(this); // device context for painting   
  6.   
  7.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
  8.   
  9.         // Center icon in client rectangle   
  10.         int cxIcon = GetSystemMetrics(SM_CXICON);  
  11.         int cyIcon = GetSystemMetrics(SM_CYICON);  
  12.         CRect rect;  
  13.         GetClientRect(&rect);  
  14.         int x = (rect.Width() - cxIcon + 1) / 2;  
  15.         int y = (rect.Height() - cyIcon + 1) / 2;  
  16.   
  17.         // Draw the icon   
  18.         dc.DrawIcon(x, y, m_hIcon);  
  19.     }  
  20.     else  
  21.     {  
  22.         //CDialog::OnPaint();//<span style="color:#6600cc;">注释此句,如果不注释的话,就放到结尾,原因何在呢?   
  23. </span>       //贴背景图片   
  24.         CPaintDC dc(this);  
  25.         CBitmap bmpBk;  
  26.         bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);  
  27.         //m_bmpBK.LoadBitmapW(IDB_BMPBK);   
  28.         BITMAP bmpSize;  
  29.         bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸   
  30.   
  31.         CRect rect;  
  32.         GetClientRect(&rect);//获取客户区尺寸   
  33.   
  34.         CDC dcMem;  
  35.         dcMem.CreateCompatibleDC(&dc);  
  36.         dcMem.SelectObject(&bmpBk);  
  37.         dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区   
  38.         //贴背景图片   
  39.     }  
  40. }  

void CqqqqqDlg::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
{
//CDialog::OnPaint();//<span style="color:#6600cc;">注释此句,如果不注释的话,就放到结尾,原因何在呢?
</span> //贴背景图片
CPaintDC dc(this);
CBitmap bmpBk;
bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);
//m_bmpBK.LoadBitmapW(IDB_BMPBK);
BITMAP bmpSize;
bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸

CRect rect;
GetClientRect(&rect);//获取客户区尺寸

CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
dcMem.SelectObject(&bmpBk);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区
//贴背景图片
}
}
执行效果截图如下:

方法二:

在OnEraseBkgnd中StretchBlt

具体是:注释掉return CDialog::OnEraseBkgnd(pDC);直接返回true(为什么不能返回这个要返回true呢?),代码如下:

[cpp] view plaincopyprint?

  1. BOOL CqqqqqDlg::OnEraseBkgnd(CDC* pDC)  
  2. {  
  3.     // TODO: Add your message handler code here and/or call default   
  4.     //贴背景图片   
  5.     CBitmap bmpBk;  
  6.     bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);  
  7.     //m_bmpBK.LoadBitmapW(IDB_BMPBK);   
  8.     BITMAP bmpSize;  
  9.     bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸   
  10.   
  11.     CRect rect;  
  12.     GetClientRect(&rect);//获取客户区尺寸   
  13.   
  14.     CDC dcMem;  
  15.     dcMem.CreateCompatibleDC(pDC);  
  16.     dcMem.SelectObject(&bmpBk);  
  17.     pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区   
  18.     //贴背景图片   
  19.     return true;  
  20.     //return CDialog::OnEraseBkgnd(pDC);   
  21. }  

BOOL CqqqqqDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
//贴背景图片
CBitmap bmpBk;
bmpBk.LoadBitmapW(IDB_BITMAP_tempbk);
//m_bmpBK.LoadBitmapW(IDB_BMPBK);
BITMAP bmpSize;
bmpBk.GetBitmap(&bmpSize);//获取背景图片尺寸

CRect rect;
GetClientRect(&rect);//获取客户区尺寸

CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&bmpBk);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区
//贴背景图片
return true;
//return CDialog::OnEraseBkgnd(pDC);
}
效果与方法一相同,图片就不贴了,参见上图。

而且这里还有一个很有意思的现象,若在OnEraseBkgnd贴图,在OnPaint()函数中不调用基类的OnPaint,即注释掉CDialog::OnPaint(),则将界面隐藏后再显示出来则控件全没了,只有对话框以及背景。如下图:

 原因见《在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次。

 

方法三:

在OnCtlColor中返回带有背景位图的画刷

 具体是:

1、在头文件中定一个背景刷

[cpp] view plaincopyprint?

  1. public:  
  2.     CBrush   m_brushBk;  

public:
CBrush m_brushBk;
2、在OnInitDialog中加入以下句

[cpp] view plaincopyprint?

  1. // TODO: Add extra initialization here   
  2. CBitmap bmp;  
  3. bmp.LoadBitmap(IDB_BITMAP_tempbk);   
  4. m_brushBk.CreatePatternBrush(&bmp);   
  5. //m_brushBk.CreateSolidBrush(RGB(0,255,0)); //用纯色作为背景   
  6.    bmp.DeleteObject();      

// TODO: Add extra initialization here
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP_tempbk);
m_brushBk.CreatePatternBrush(&bmp);
//m_brushBk.CreateSolidBrush(RGB(0,255,0)); //用纯色作为背景
bmp.DeleteObject();
 

3、在OnCtlColor函数中返回背景画刷

[cpp] view plaincopyprint?

  1. HBRUSH CXXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
  2. {  
  3.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  4.   
  5.     // TODO:  Change any attributes of the DC here   
  6.   
  7.     // TODO:  Return a different brush if the default is not desired   
  8.     if(pWnd==this) //this代表当前对话框窗口   
  9.     {   
  10.         return   m_brushBk;   
  11.     }   
  12.   
  13.     return hbr;  
  14.   
  15. }  

HBRUSH CXXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

// TODO: Return a different brush if the default is not desired
if(pWnd==this) //this代表当前对话框窗口
{
return m_brushBk;
}

return hbr;

}
效果如下图所示:

注意这个函数里面的if判断,这个pWnd参数很关键。

我们看看,如果没有这个if判断,直接返回m_brushBk;会是什么结果呢,代码如下:

[cpp] view plaincopyprint?

  1. HBRUSH CqqqqqDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
  2. {  
  3.     HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  
  4.   
  5.     // TODO:  Change any attributes of the DC here   
  6.   
  7.     // TODO:  Return a different brush if the default is not desired   
  8.   
  9.     return  m_brushBk;  
  10.   
  11. }  

HBRUSH CqqqqqDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

// TODO: Return a different brush if the default is not desired

return m_brushBk;

}
截图如下:
 

 

看图说话,不解释,你懂的。

 这种方法的缺点是不具备StretchBlt函数的图片自动适应对话框(目标矩形)大小的功能。

时间: 2024-09-20 21:06:03

在对话框中设置背景的三种方法 .的相关文章

excel表格中隔行选取的三种方法

  excel表格中隔行选取的三种方法          有一个excel表格,需要隔N行选取.可能是隔一行,也可能是隔2行.3行. 常见的隔行选取有两种方法: 一.按ctrl键不松用鼠标逐行选取.如果需要选取的行数多,会累死人的. 二.在辅助设置公式或输入字符 - 设置筛选模式 - 筛选 - 选取 - 取消筛选模式.如果是隔列选取,这种方法就不能用了. 除了以上两种外,本文小编新发现一种新的隔行选取方法,估计绝大部分同学都没见过. 步骤1:在H3中输入公式 =A3:F3,再选取H2:H3向下复

实现PPT中局部虚化效果的三种方法

实现PPT中局部虚化效果的三种方法   下面请看实现PPT中局部虚化效果的三种方法 方法一.图片复制两份,选择图片,在格式中选择虚化,具体方法如下图所示. 方法二.用美图秀秀打开图片,在美化里面选择"背景虚化",具体方法如下图所示. 方法三.理论上讲与上面两个是重叠的,但分开将更容易理解,具体操作方法见下图. 局部虚化效果如下图所示.

C#在Winform中改变Textbox高度三种方法

原文 C#在Winform中改变Textbox高度三种方法 最近在做C# Winform项目,需要有一个能动态调整大小的Textbox,并且要是单行的.试了几次,单行模式的Textbox不能直接改高度.于是搜索了一下,整理出几个改变高度的方法. 1.将Textbox改为多行模式,设置MutliLine属性为True,然后屏蔽Enter键. private void txtTest_KeyDown (object sender, KeyEventArgs e) { if ((int)e.KeyCo

JavaScript中定义函数的三种方法

 这篇文章主要介绍了JavaScript中定义函数的三种方法,本文直接给出代码实现,同时给出了构造函数的相关知识,需要的朋友可以参考下     在JavaScript的世界里,定义函数的方法多种多样,这正是JavaScript灵活性的体现,但是正是这个原因让初学者摸不着头脑,尤其对于没有 语言基础的同学.正所谓条条大道通罗马,但是如果道路太多,会让行路者不知所措,因为不知道走那条路才是正途,呵呵,废话一大篇,闲言少叙,先看代码: 代码如下: /*第一种方法,使用function语句,格式如下*/

Android中使用定时器的三种方法_Android

本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handler负责接收消息更新UI 第一种方法:Thread.sleep();方法 Runnable runnable = new Runnable() { @Override public void run() { while (true) { mHandler.sendEmptyMessage(0); try { Thread.sl

Word文档在方框中打勾的三种方法

文档在方框中打勾的三种方法-word文档中方框内打勾"> 方法一 点击"插入→符号→其他符号",打开"符号"窗口,在"子集"处选中"数学运算符",然后选中"√",点击"插入"按钮即可.再选中"√",在"开始"菜单中"字体"中点击"带圈字符○字"工具,打开带圈字符窗口,选择"□&quo

Android中使用定时器的三种方法

本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handler负责接收消息更新UI 第一种方法:Thread.sleep();方法 Runnable runnable = new Runnable() { @Override public void run() { while (true) { mHandler.sendEmptyMessage(0); try { Thread.sl

PowerPoint中插入视频的三种方法

为了能更好地帮助大家合理地在PowerPoint课件中 插入和播放http://www.aliyun.com/zixun/aggregation/18246.html">视频文件,本文特向大家介绍PowerPoint中插入和处理视频的三种方法. 直接播放视频 这种播放方法是将事先准备好的视频文件作为电影文件直接插入到幻灯片中,该方法是最简单.最直观的一种方法,使用这种方法将视频文件插入到幻灯片中后,PowerPoint只提供简单的[暂停]和[继续播放]控制,而没有其他更多的操作按钮供选择.

Word2013中设置行距的两种方法

  方法1:在行距列表中设置 打开Word2013文档窗口,选中需要设置行距的段落或全部文档.在"开始"功能区的"段落"分组中单击"行和段落间距距"按钮,并在打开的行距列表中选中合适的行距,如图1所示. 图1 快速设置行距 方法2:在"段落"对话框中设置 用户还可以在"段落"对话框中对行距进行更详细地设置,操作步骤如下所述: 第1步,打开Word2013文档窗口,选中需要设置行间距的文档内容.然后在&quo