帮帮小女子:如何将对话框的背景设置为指定的.bmp图象??小女子感激不尽......

aExplorer 2001-04-02 09:16:00
在Visual C++中,如何将对话框的背景设置为指定的.bmp图象?
...全文
145 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nitty 2001-04-02
  • 打赏
  • 举报
回复

方法三:在OnPaint()中,CPaint dc(this) ;
将位图载入与当前dc连接!
...
dc.BitBlt(...) ;
joke100 2001-04-02
  • 打赏
  • 举报
回复
这个问题有很多人提的...

方法一,就是在OnEraseBackground里用你的位图实现一个画刷,把这个画刷选进DC并画背景
方法二,就是在对话框里增加一个画刷成员变量,在OnCtlColor里用你的位图实现这个画刷,返回这个画刷的句柄即可



hemouse 2001-04-02
  • 打赏
  • 举报
回复
mm好:
从CDialog派生出一个类,在消息OnEraseBackground中处理
panda_w 2001-04-02
  • 打赏
  • 举报
回复
又是一个女程序员。这样的例子太多了,不如你自己找一个看看
给你推荐一个网站:http://www.vckbase.com/document/dialog/index.html
abcicq 2001-04-02
  • 打赏
  • 举报
回复
用个控件
xhy_rose 2001-04-02
  • 打赏
  • 举报
回复
关注
xhy_rose 2001-04-02
  • 打赏
  • 举报
回复
关注
David_lee 2001-04-02
  • 打赏
  • 举报
回复
有一个问题,如果要将标题栏也图形化呢,又或在单文档窗口中怎么用?
happylaodu 2001-04-02
  • 打赏
  • 举报
回复
1. 定义如下成员变量:
HICON m_hIcon;
CDC m_dcMem;
CBitmap m_Bitmap;
HBITMAP m_hBmpOld;
HBRUSH m_brush;
BITMAP m_bmInfo;
CPoint m_pt;
CSize m_size;

2. 在OnInitDialog中加入如下代码:
CBitmap* pBmpOld;
CRect rectClient;
VERIFY(m_brush=(HBRUSH)GetStockObject(HOLLOW_BRUSH));
VERIFY(m_Bitmap.LoadBitmap(IDB_BITMAP));

m_Bitmap.GetObject(sizeof(BITMAP),&m_bmInfo);
GetClientRect(&rectClient);
m_size.cx=rectClient.right;
m_size.cy=rectClient.bottom;
m_pt.x=rectClient.left;
m_pt.y=rectClient.top;
CClientDC dc(this);
VERIFY(m_dcMem.CreateCompatibleDC(&dc));
VERIFY(pBmpOld=m_dcMem.SelectObject(&m_Bitmap));
VERIFY(m_hBmpOld=(HBITMAP)pBmpOld->GetSafeHandle());

3. 在OnEraseBkgnd函数中加入如下代码:
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
pDC->StretchBlt(m_pt.x,m_pt.y,m_size.cx,m_size.cy,&m_dcMem,0,0,
m_bmInfo.bmWidth-1,m_bmInfo.bmHeight-1,SRCCOPY);
return TRUE;
}

4. 在OnCtrlColor中加入如下代码:
pDC->SetBkMode(OPAQUE);//如不理想,可把参数换为TRANSPARENT

5. 在OnDestroy中加入如下代码:
ASSERT(m_hBmpOld);
VERIFY(m_dcMem.SelectObject(CBitmap::FromHandle(m_hBmpOld)));

m_Bitmap.DeleteObject();
myFont.DeleteObject();

6.以上工作做好即可显示出位图,但如果你的对话框中有很多Edit或Static控件,将使界面很难看,这种情况下,建议不用这些控件,而把要显示的东西用代码输出来:很麻烦,这也是没办法的事,VC本来就不擅长于搞界面,既然要想搞得好看一点,自然要花点工夫。

比如想在对话框上放一句话,则要在OnEraseBkgnd中写成这样:
BOOL CTimeLimitDlg::OnEraseBkgnd(CDC* pDC)
{
CDC memDC;
CBitmap *m_pBitmap,*oldBitmap;

memDC.CreateCompatibleDC(pDC);

m_pBitmap=new CBitmap;
m_pBitmap->CreateCompatibleBitmap(pDC,m_size.cx,m_size.cy);

CBrush whiteBrush(0X00ffffff);
oldBitmap=memDC.SelectObject(m_pBitmap);
CBrush *oldBrush=memDC.SelectObject(&whiteBrush);//白底
memDC.PatBlt(0,0,m_size.cx,m_size.cy,PATCOPY);

memDC.SetTextColor(0X000000); //黑字

HFONT hOldFont=(HFONT__ *)memDC.SelectObject(hFont); //字体要事先设好,当作成员变量。

memDC.TextOut(50,20,"本程序旨在控制您每次上机时间,您工作");

memDC.StretchBlt(m_pt.x,m_pt.y,m_size.cx,m_size.cy,&m_dcMem,0,0,m_bmInfo.bmWidth-1,
m_bmInfo.bmHeight-1,SRCAND);
pDC->BitBlt(m_pt.x,m_pt.y,m_size.cx,m_size.cy,&memDC,0,0,SRCCOPY);

memDC.SelectObject(oldBitmap);
memDC.SelectObject(oldBrush);
memDC.SelectObject(hOldFont);
m_pBitmap->DeleteObject();
whiteBrush.DeleteObject();
CWnd::ReleaseDC(&memDC);
memDC.DeleteDC();
return TRUE;
}


后来发现,以上方法简直是笨得不能再笨(由于用TextOut函数输出字符时,会出现很不好看的白色背景色,所以上面用画到内存再进行一定处理的的方法来解决,此方法很好,也许在其它地方会很有用,但事实上这里根本就用不着它)。
CDC有一个很有用的函数:SetBkMode,如果把参数设为TRANSPARENT,则就不会在字符后面出现背景色,而是位图。

因此上述函数可简化为:
BOOL CTimeLimitDlg::OnEraseBkgnd(CDC* pDC)
{
pDC->StretchBlt(m_pt.x,m_pt.y,m_size.cx,m_size.cy,&m_dcMem,0,0,m_bmInfo.bmWidth-1,
m_bmInfo.bmHeight-1,SRCCOPY); //位图画出来
HFONT hOldFont=(HFONT__ *)pDC->SelectObject(hFont);
//字体要事先设好,当作成员变量。
int oldMode=pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(50,20,"本程序旨在控制您每次上机时间,您工作");
pDC->SetBkMode(oldMode);
return TRUE;
}
多简单!

另还有一个函数可以用:SetBkColor(RGBTRANSPARENT); 则背景色为透明色
lpvoid 2001-04-02
  • 打赏
  • 举报
回复
你可以通过重载WM_ERASEBKGND的响应函数来实现。当窗口需要重画背景时,就会产生一个WM_ERASEBKGND消息,在函数中贴一张图即可。

lpvoid 2001-04-02
  • 打赏
  • 举报
回复
你可以通过重载WM_ERASEBKGND的响应函数来实现。当窗口需要重画背景时,就会产生一个WM_ERASEBKGND消息,在函数中贴一张图即可。

lpvoid 2001-04-02
  • 打赏
  • 举报
回复
你可以通过响应Dialog的WM_ERASEBKGND消息来实现。当对话框需要重画背景时,就会产生一个WM_ERASEBKGND消息。在classwizard里重载它的响应函数,函数中贴一张背景图。
如果你希望某些控件不会挡住背景,比如静态文本框,你可以重载WM_CTLCOLOR的响应函数,返回一个空画刷:
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
CBrush hollowBrush.CreateStockObject(HOLLOW_BRUSH);
switch (nCtlColor)
{
case CTLCOLOR_STATIC:
pDC->SetBkColor(TRANSPARENT);
return (HBRUSH) hollowBrush.m_hObject; //
break;
default:
HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
return hbr;
break;
}
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧