对话框上放一个pic控件来显示一张背景图,这图显示的时候却总把它上面的控件挡住了

warsour 2009-01-22 02:30:33
想用PIC控件在界面上放一个背景图,然后再在这上面添加几个按钮,但显示的时候,那张图总把按钮挡住了,不知道有没什么好办法解决?
...全文
285 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fireway2008 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
给pic控件加上WS_CLIPSIBLINGS风格就可以了:
GetDlgItem(IDC_STATIC1)->ModifyStyle(0, WS_CLIPSIBLINGS);
注意,控件ID不要用IDC_STATIC。
[/Quote]

赞同!因为在初始的时候所有的CStatic 类型的 静态文本框 和 Picture控件都共享同一个IDC_STATIC,直接GetDlgItem指定会出错。

另外,可以试试看把被遮挡的按钮ctrl+x 剪切后,再次
ctrl+v 粘贴上去,应该也能解决被遮挡的问题。
路人乙2019 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jameshooo 的回复:]
SetWindowPos(hwndPic, HWND_BOTTOM, ...);
最好的方法是在WM_ERASEBKGND消息中直接绘制图片,而不是使用控件。
[/Quote]也可以得载onerasebackground
showxier 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jameshooo 的回复:]
最好的方法是在WM_ERASEBKGND消息中直接绘制图片,而不是使用控件。
[/Quote]

同意.

你看图片在程序中的作用了,如果仅仅只是显示好看,并不要求跟用户有太多交互,那就在背景中绘了.
warsour 2009-01-23
  • 打赏
  • 举报
回复
根本就没响应WM_ERASEBKGND消息,把上面的代码写到OnPaint()里面就可以了,不过这样做似乎更简单GetDlgItem(IDC_STATIC1)->ModifyStyle(0, WS_CLIPSIBLINGS); 谢啦~记得用CTRL+D调整下顺序~
cnzdgs 2009-01-22
  • 打赏
  • 举报
回复
给pic控件加上WS_CLIPSIBLINGS风格就可以了:
GetDlgItem(IDC_STATIC1)->ModifyStyle(0, WS_CLIPSIBLINGS);
注意,控件ID不要用IDC_STATIC。
jackyy_000503 2009-01-22
  • 打赏
  • 举报
回复
响应类的WM_EraseBkgnd 消息,在函数里加入以下代码,把图片画在窗体上当背景,这样就不会挡住按钮了。函数中的 IDB_BITMAP47 是加入资源的图片ID,把这个换成你资源里的图片ID,其它代码不变,就可以了。
BOOL CAddPoi::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rect;
CBitmap bitmap;
BITMAP bmp;
CDC dcCompatible;

bitmap.LoadBitmap(IDB_BITMAP47);
bitmap.GetBitmap(&bmp);
dcCompatible.CreateCompatibleDC(pDC);
CBitmap *pOlBitmap = dcCompatible.SelectObject(&bitmap);
GetWindowRect(&rect);

pDC->SetStretchBltMode(COLORONCOLOR);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
dcCompatible.SelectObject(pOlBitmap);
DeleteDC(dcCompatible.m_hDC);
return TRUE;
//return CDialog::OnEraseBkgnd(pDC);
}
jbhas 2009-01-22
  • 打赏
  • 举报
回复
TAB顺序+透明
fandh 2009-01-22
  • 打赏
  • 举报
回复
改变TAB键的顺序,好像刷新顺序与这个有关,你将他们间的顺序设置先后试试!
warsour 2009-01-22
  • 打赏
  • 举报
回复
BOOL CFlvRipperDlg::OnEraseBkgnd(CDC* pDC)
{
static CBrush hbr;

CRect rc;
GetClientRect(&rc);

if(hbr.m_hObject==NULL){
hbr.CreatePatternBrush(&bmp);
bmp.DeleteObject();
}
pDC->FillRect(&rc,&hbr);
return 1;
}

这样写不知道是不是可以,怎么发现根本就没响应这个消息呢ON_WM_ERASEBKGND()
jameshooo 2009-01-22
  • 打赏
  • 举报
回复
几句话难以说清。还有一种办法可用,就是把按钮都创建为pic控件的子窗口。
warsour 2009-01-22
  • 打赏
  • 举报
回复
直接绘制不是很熟,能否给点代码提示下
jameshooo 2009-01-22
  • 打赏
  • 举报
回复
SetWindowPos(hwndPic, HWND_BOTTOM, ...);
最好的方法是在WM_ERASEBKGND消息中直接绘制图片,而不是使用控件。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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