mfc编程对话框背景位图的问题

用mfc编辑对话框背景位图,出现了两个问题希望大家帮忙解决!一个就是我用的是把bitmap作为背景刷,在:OnEraseBkgnd实现自绘的,但是老是不能完全显示位图,要... 用mfc编辑对话框背景位图,出现了两个问题希望大家帮忙解决!
一个就是我用的是把bitmap作为背景刷,在:OnEraseBkgnd实现自绘的,但是老是不能完全显示位图,要么位图太大,只能显示一部分 要么位图太小 不断地刷 会出现好几个
第二个问题就是 在OnCtlColor里我对static 进行判断返回个空画刷 实现静态控件的透明 但是程序运行后 不显示了 要点击激活后才会显示 怎么才能直接就显示出来
我希望的是 整个图片都能显示在界面上 即使缩放也无所谓 就是窗口变大变小 图片也随之变化 不是截取图片的一部分作为对话框的背景 希望大家给出详细解答 - -
展开
 我来答
shuai68912009
2010-08-22
知道答主
回答量:65
采纳率:0%
帮助的人:30.3万
展开全部
BOOL COAView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap bmp;
bmp.LoadBitmap(IDB_OA);
CRect rect;
this->GetClientRect(&rect);
pDC->FillRect(&rect,&m_brushBackground);
BITMAP bm;
CDC dcMem;
bmp.GetBitmap(&bm);//得到位图尺寸
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&bmp);
pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话 会导致图片严重失真
pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),
&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
return CView::OnEraseBkgnd(pDC);
}

我保证这个不会失真,不会重绘,2楼所用的OnPaint() 在窗口改变的时候会重新绘制图形
hgreminem
2010-08-15 · TA获得超过724个赞
知道小有建树答主
回答量:350
采纳率:0%
帮助的人:377万
展开全部
背景刷?为什么不用StretchBlt呢?
将位图缩放画到窗口上就可以了,
为了避免窗口控件也被覆盖
在OnInitDialog()事件中添加
ModifyStyle(0, WS_CLIPCHILDREN | WS_CLIPSIBLINGS);

==========================
StretchBlt就是缩放的贴图操作,可以截取一部分图片贴图,也可以整张图片进行贴图,将贴图代码放在OnPaint里,如果是改变窗口大小,那么在OnSize事件里添加SendMessage(WM_PAINT, 0, 0),这样就可以刷新显示了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c58929f
2010-08-17 · 超过22用户采纳过TA的回答
知道答主
回答量:100
采纳率:0%
帮助的人:79.8万
展开全部
void CLoginDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
//在此重绘位图

CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP_DNION);//背景位图
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
bmpBackground.DeleteObject();
dcMem.DeleteDC();
CDialog::OnPaint();

// Do not call CDialog::OnPaint() for painting messages
}
看看是否是你要的,将图片作为背景,不过一般在OnPaint中添加绘图代码,没听过在OnEraseBkgnd中添加的,他是刷新才会调用的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
z_121579644
2010-08-15 · TA获得超过315个赞
知道小有建树答主
回答量:304
采纳率:0%
帮助的人:227万
展开全部
背景图片一般都在Onpain函数里面实现,再初始函数里面导入内存,每次刷新,只需用BitBlt函数刷新就行了,因为是预先导入内存,所以不会出现闪烁问题!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式