设置对话框背景图片 3种

WM_PAINT添加消息处理函数

void CDialog6::OnPaint()

{

CPaintDC dc(this);// device context for painting

CRect rect;

GetClientRect(&rect);

CDC dcMem;

dcMem.CreateCompatibleDC(&dc);

CBitmap bmpBackground;

bmpBackground.LoadBitmap(IDB_BITMAP2); //IDB_BITMAP是你自己的图对应的ID 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);

// Do not call CDialog::OnPaint() for painting messages

}

方法一:

在OnPaint中StretchBlt

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

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

执行效果截图如下:

方法二:

在OnEraseBkgnd中StretchBlt

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

  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. CRect rect;
  11. GetClientRect(&rect);//获取客户区尺寸
  12. CDC dcMem;
  13. dcMem.CreateCompatibleDC(pDC);
  14. dcMem.SelectObject(&bmpBk);
  15. pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bmpSize.bmWidth,bmpSize.bmHeight,SRCCOPY);//将背景图片拉伸或者压缩copy至客户区
  16. //贴背景图片
  17. return true;
  18. //return CDialog::OnEraseBkgnd(pDC);
  19. }

效果与方法一相同,图片就不贴了,参见上图。

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

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

方法三:

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

具体是:

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

  1. public:
  2. CBrush   m_brushBk;

2、在OnInitDialog中加入以下句

  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();

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

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

效果如下图所示:

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

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

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

截图如下:
 

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

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

出自http://www.cnblogs.com/lidabo/archive/2012/07/04/2576172.html

时间: 2024-07-29 12:57:04

设置对话框背景图片 3种的相关文章

MFC用代码添加对话框背景图片和按钮图片

运行环境:VS2013 一.添加对话框背景图片 ①插入位图,把生成的空白位图进行替换(xxx.bmp图片的名称和格式与生成的空白位图保持一致) ②查看属性,得到位图ID ③编写代码: void CMFC_8Dlg::OnPaint() { if (IsIconic()) { .... } else { //CDialogEx::OnPaint(); CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.Crea

ios:设置视图背景图片的方法

1. 使用一个UIImageView实例做子视图,并且放最后面UIImageView *customBackgournd = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.jpg"]];self.background = customBackground;[customBackground release]; [self addSubview:background];[self sendSubVie

Java Swing 之设置窗体背景图片

/** * 设置窗体背景图片 * @author gao */ package com.gao; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class BackgroundDemo extends JFrame{ private Image image; pri

[IOS]设置TabBar背景图片

Xcode6.1_IOS SDK 8.1 ********************************************************************** 在AppDelegate.m中设置TabBar背景图片 ********************************************************************** UITabBarController *tabBarController = [[UITabBarController

Visual Studio Code 设置透明背景图片

Visual Studio Code 设置透明背景图片 本方法不使用插件,直接添加代码修改VSCode本地的CSS文件来达到效果,诶原本想装个插件就可以优雅地敲C++,可试了好几个偶的VSCode就是不行. 1.按下Ctrl+Shift+P打开搜索栏,搜索默认配置文件Setting.json并打开 2.按下Ctrl+F快捷键搜索window.titleBarStyle并修改 "window.titleBarStyle": "custom", 3.打开VSCode目录

UIView设置背景图片几种方式

一 . 设置UIView的背景图片 1.将图片作为UIView的背景色,该方法过于占内存,不建议使用. //1.imageNamed方式 self.view.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"image.jpg"]]; //2.方式    NSString *path = [[NSBundlemainBundle]pathForResource:@"image"o

iOS-UIView-设置背景图片4种方式

一 . 设置UIView的背景图片 1.将图片作为UIView的背景色,该方法过于占内存,不建议使用. //1.imageNamed方式 self.view.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"image.jpg"]]; //2.方式    NSString *path = [[NSBundlemainBundle]pathForResource:@"image"o

MFC设置对话框背景和边框颜色

对于对话框,只需要重载默认的消息处理函数就行了: // 重载默认的消息处理函数,主要处理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY这// 几个消息就可以了 LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam); i

VC/MFC 设置对话框背景颜色(转)

方法一:调用CWinApp类的成员函数SetDialogBkColor来实现. (这个函数已经废弃) 1void SetDialogBkColor(COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0));其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色. 在InitInstance()中添加如下代码: 1SetDialogBkColor(RGB(0,0,255),RGB(255,0,0))