★★★老问题,如何用位图成为对话框的背景!!急!!!!!!这是我仅有的109!

liwenqian 2001-05-28 03:20:00
我对位图一无所知,看了以前的问题,代码多少有点省略,试了半天不行!
时间紧(今天才提出要求,明天交),恳请各位高手提供代码。
小弟先谢了!
对话框:Dialog3
位图ID:IDB_BITMAP2
希望在dialog的OnPaint()中实现!
谢谢!
...全文
97 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
joknan 2001-05-28
  • 打赏
  • 举报
回复
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); 则背景色为透明色
huangbeyond 2001-05-28
  • 打赏
  • 举报
回复
不如直接把位图绘制在一个“STATIC”更方便划时算。
而且,不用处理ONPAINT()
只要是“用位图成为对话框的背景”,何必在意它是“自绘”还是“位图窗口”。
chief 2001-05-28
  • 打赏
  • 举报
回复
隨便找了一個給你,看合不合用。(發在你的email里)
erehw 2001-05-28
  • 打赏
  • 举报
回复

BOOL CLoginDlg::OnEraseBkgnd(CDC* pDC)
{
CString strPath;
//GetModulePath(strPath);
//strPath += "\\LoginSpalsh.bmp";
strPath = "c:\\tmp\\you.bmp";
CDC tempDC;
CRect rect;
HBITMAP hBitmap=(HBITMAP)LoadImage(AfxGetApp()->m_hInstance,strPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap m_BackBmp;
BITMAP bitmap;
m_BackBmp.Attach(hBitmap);
m_BackBmp.GetBitmap (&bitmap);
int nHeight=bitmap.bmHeight;
int nWidth =bitmap.bmWidth ;
GetClientRect(rect);
tempDC.CreateCompatibleDC(pDC);
tempDC.SelectObject(&m_BackBmp);


pDC->BitBlt(0,0, nWidth, nHeight, &tempDC, 0, 0, SRCCOPY );


tempDC.DeleteDC();


return TRUE;

//return CDialog::OnEraseBkgnd(pDC);
}

一般在OnEraseBkgnd中处理这个
要在OnPaint也可以。:D如下,
void CAboutDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting

CString strPath;
//GetModulePath(strPath);
//strPath += "\\LoginSpalsh.bmp";
strPath += "e:\\prj\\fpcontrol\\debug\\LoginSpalsh.bmp";
CDC tempDC;
CRect rect;
HBITMAP hBitmap=(HBITMAP)LoadImage(AfxGetApp()->m_hInstance,strPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap m_BackBmp;
BITMAP bitmap;
m_BackBmp.Attach(hBitmap);
m_BackBmp.GetBitmap (&bitmap);
int nHeight=bitmap.bmHeight;
int nWidth =bitmap.bmWidth ;
GetClientRect(rect);
tempDC.CreateCompatibleDC(&dc);
tempDC.SelectObject(&m_BackBmp);
//dc.FillSolidRect(rect, RGB(212,208,202));
//pDC->FillSolidRect(rect, RGB(255,255,255));


dc.BitBlt(0,0, nWidth, nHeight, &tempDC, 0, 0, SRCCOPY );


tempDC.DeleteDC();



}

16,472

社区成员

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

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

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