对话框背景图象的加入

noim 2000-05-23 10:07:00
以前我做过在基于对话框的程序中加入背景图象,不过现在忘了。只记得应在OnEraseBkgnd()函数里,用stretchblt()或BitBlt(),有那位高手知道,请告诉我呀!
...全文
195 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiujoe 2000-05-24
  • 打赏
  • 举报
回复
1. 获取位图信息
2. 创建设备环境
3. 获取客户窗口大小
4. 用stretchblt()将位图填充背景
panda_w 2000-05-24
  • 打赏
  • 举报
回复
你可以用StretchBlt使位图随对话框大小改变而改变
panda_w 2000-05-24
  • 打赏
  • 举报
回复
我有个例子,你可以看一下,方法和qiujoe的一样
先定义 #define BITMAP_TILE 0
#define BITMAP_CENTER 1
再在头文件中声明public变量和函数:
void SetBitmap(UINT ResID,int Type=BITMAP_TILE);
//装入位图并决定如何显示,缺省为平铺
int mType;//定义为图放置方式变量
CBrush mHollowBrush;//定义一个画笔类
CBitmap mBitmap;//定义一个位图类

加入消息映射函数: ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()

三个函数的实现为:
HBRUSH load::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
mBitmap.GetSafeHandle();
if(mBitmap.GetSafeHandle()!=NULL)//返回的位图句柄为非空时
{
switch(nCtlColor)
{
case CTLCOLOR_STATIC://为静态控件时返回空画笔
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)mHollowBrush.m_hObject;
break;
default://对其它控件,采用缺省直
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
break;
}
}
else//无位图句柄时
{
HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

}
BOOL load::OnEraseBkgnd(CDC* pDC)
{
if(mBitmap.m_hObject!=NULL)//对象句柄非空
{
CDC MemDC;
BITMAP bm;
CRect Rect;
int x=0,y=0;
GetClientRect(&Rect);//获取客户区大小
mBitmap.GetObject(sizeof(BITMAP),&bm);
//用位图上的信息,填充结构BITMAP的各个域
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=MemDC.SelectObject(&mBitmap);
//定义一个CBITMAP类,并初始化为选入到设备描述
//对象的位图
if(mType==BITMAP_CENTER)//位图置背景的中心
{
x=(Rect.Width()-bm.bmWidth)/2;//位图左上脚横坐
//标
y=(Rect.Height()-bm.bmHeight)/2;//位图右上脚横
//坐标
pDC->StretchBlt(x,y,bm.bmWidth,
bm.bmHeight,&MemDC,
0,0,Rect.right-Rect.left,
Rect.bottom-Rect.top,SRCCOPY);

}
else//位图平铺放置
{
while(y<Rect.Height())
{
while(x<Rect.Width())
{
pDC->BitBlt(x,//目标位图横坐
//标
y,//目标位图横坐标
bm.bmWidth,//要转换的块高度
bm.bmHeight,//要转换的块宽度
&MemDC,//图形数据的源设备对象
0,//源位图横坐标
0,//源位图纵坐标
SRCCOPY//表示数据不经修改直接拷贝
);
x=x+bm.bmWidth;
}
x=0;
y=y+bm.bmHeight;
}
}
MemDC.SelectObject(pOldBitmap);
//将位图对象选入内存设备描述对象
return TRUE;
}

return CDialog::OnEraseBkgnd(pDC);
}

void load::SetBitmap(UINT ResID, int Type)
{
mBitmap.LoadBitmap(ResID);//装入位图对象
mType=Type;//设置放置方式

}
在初始化函数中加入:SetBitmap(IDB_BACK,BITMAP_CENTER);
panda_w 2000-05-24
  • 打赏
  • 举报
回复
我有个例子,你可以看一下,方法和qiujoe的一样
创建工程load(基于对话框的)
先定义 #define BITMAP_TILE 0
#define BITMAP_CENTER 1
再在头文件中声明public变量和函数:
void SetBitmap(UINT ResID,int Type=BITMAP_TILE);
//装入位图并决定如何显示,缺省为平铺
int mType;//定义为图放置方式变量
CBrush mHollowBrush;//定义一个画笔类
CBitmap mBitmap;//定义一个位图类

加入消息映射函数: ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()

三个函数的实现为:
HBRUSH load::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
mBitmap.GetSafeHandle();
if(mBitmap.GetSafeHandle()!=NULL)//返回的位图句柄为非空时
{
switch(nCtlColor)
{
case CTLCOLOR_STATIC://为静态控件时返回空画笔
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)mHollowBrush.m_hObject;
break;
default://对其它控件,采用缺省直
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
break;
}
}
else//无位图句柄时
{
HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

}
BOOL load::OnEraseBkgnd(CDC* pDC)
{
if(mBitmap.m_hObject!=NULL)//对象句柄非空
{
CDC MemDC;
BITMAP bm;
CRect Rect;
int x=0,y=0;
GetClientRect(&Rect);//获取客户区大小
mBitmap.GetObject(sizeof(BITMAP),&bm);
//用位图上的信息,填充结构BITMAP的各个域
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=MemDC.SelectObject(&mBitmap);
//定义一个CBITMAP类,并初始化为选入到设备描述
//对象的位图
if(mType==BITMAP_CENTER)//位图置背景的中心
{
x=(Rect.Width()-bm.bmWidth)/2;//位图左上脚横坐
//标
y=(Rect.Height()-bm.bmHeight)/2;//位图右上脚横
//坐标
pDC->StretchBlt(x,y,bm.bmWidth,
bm.bmHeight,&MemDC,
0,0,Rect.right-Rect.left,
Rect.bottom-Rect.top,SRCCOPY);

}
else//位图平铺放置
{
while(y<Rect.Height())
{
while(x<Rect.Width())
{
pDC->BitBlt(x,//目标位图横坐
//标
y,//目标位图横坐标
bm.bmWidth,//要转换的块高度
bm.bmHeight,//要转换的块宽度
&MemDC,//图形数据的源设备对象
0,//源位图横坐标
0,//源位图纵坐标
SRCCOPY//表示数据不经修改直接拷贝
);
x=x+bm.bmWidth;
}
x=0;
y=y+bm.bmHeight;
}
}
MemDC.SelectObject(pOldBitmap);
//将位图对象选入内存设备描述对象
return TRUE;
}

return CDialog::OnEraseBkgnd(pDC);
}

void load::SetBitmap(UINT ResID, int Type)
{
mBitmap.LoadBitmap(ResID);//装入位图对象
mType=Type;//设置放置方式

}
在初始化函数中加入:SetBitmap(IDB_BACK,BITMAP_CENTER);

16,472

社区成员

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

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

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