用bmp贴图画自定义窗口的问题?

linaren 2005-07-12 08:58:24

1.我用了几个bmp图片贴到Dialog窗体的标题栏上,并且屏蔽掉了最小化、最大化、系统菜单,
并且在OnNcPaint里屏蔽掉CDialog::OnNcPaint(),
出现的问题是:当在任务栏中右击此窗体的栏位时,我画的标题栏、窗体边框都还原成系统默认的了,
切换一下其它窗体就又正常了,这是为什么,怎样解决?

2.我是在OnPaint()中画出窗体的背景色(是个bmp图),窗口初弹出时正常,但在拖动时,会把窗体上的控件给覆盖掉,这是为什么,怎么解决?

^_^我是初学mfc编程,不知道它的原理,望各位大虾指教,谢谢!
...全文
206 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dirdirdir3 2005-07-13
  • 打赏
  • 举报
回复
在WM_ERASEBKGROUND消息中画图。
goodboyws 2005-07-13
  • 打赏
  • 举报
回复
标题栏上的东东用GetWindowDC, 在OnNcPaint()里画,其它部分用CPaintDC dc(this);在OnPaint里画,明白?
linaren 2005-07-13
  • 打赏
  • 举报
回复
to goodboyws(深夜不眠者) :
我用 CPaintDC dc(this);画的背景不能显示出来?
goodboyws 2005-07-13
  • 打赏
  • 举报
回复
既然GetWindowDC能画出来,bmpDC不会有问题,你的问题可能是groupbox挡住了其它东西
linaren 2005-07-13
  • 打赏
  • 举报
回复
程序没带,不过今天还是要结贴了,
希望能向各位大虾交个朋友,以后多讨教的!
QQ:469207257
linaren 2005-07-13
  • 打赏
  • 举报
回复
^_^谢谢
to goodboyws(深夜不眠者) :
代码如下:
CPaintDC dc(this);
CDC bmpDC ;
bmpDC.CreateComparibleDC(&dc);
bmpDC.SelectObject( pbmp );
dc.BitBlt(...,&bmpDC,...);
bmpDC.DeleteDC();

会不会问题出在bmpDC上了,应该是用CPaintDC 是吗?
goodboyws 2005-07-13
  • 打赏
  • 举报
回复
呵呵,我就说嘛, groupbox去掉试试, 它可不是透明的



"对话框的OnPaint里试试个就知道了"
我试过不下十次了
linaren 2005-07-13
  • 打赏
  • 举报
回复
to goodboyws:
我在对话框上就拖上两个按钮、一个groupbox在上面,bmp图片也不大是strenchbit上的
^_^你在对话框的OnPaint里试试个就知道了,真的不出来,
并且我画是放到OnPaint里缺省代码后面放着的
goodboyws 2005-07-13
  • 打赏
  • 举报
回复
CPaintDC dc(this)画不出来是不可能的(标题栏除外),除非你还有其他控件?是不是有个很大的Picture在对话框上
OnEraseBkgroungd一般适用于阻止刷新,最好别用来画
linaren 2005-07-13
  • 打赏
  • 举报
回复
^_^我这新出现个有趣的问题:
当在OnEraseBkgroungd里画背景时,标题栏就画不出来,恢复到系统默认的了,
当在OnPaint里画背景时,用GetWindowDC()画时,拖动窗口把窗体上的控件给覆盖掉了,
用CPaintDC dc(this)时,背景出不来了
这简直是鱼与熊掌不能兼得吗?^_^我自己都晕了!
大虾们这怎么解决?谢谢了
goodboyws 2005-07-12
  • 打赏
  • 举报
回复
如果你标题栏上的确不需要什么东西的话,那么标题栏确实可以去掉,我给你的代码是重绘标题栏上的按钮用的
goodboyws 2005-07-12
  • 打赏
  • 举报
回复
因为 CPaintDC dc(this);实际上把有控件的地方挖掉了, 而GetWindowDC没有做这个工作
goodboyws 2005-07-12
  • 打赏
  • 举报
回复
用CPaintDC dc(this);
标题栏在OnNCPaint里画
linaren 2005-07-12
  • 打赏
  • 举报
回复
pDC = this->GetWindowDC();
goodboyws 2005-07-12
  • 打赏
  • 举报
回复
pDC是哪来的,应该用
CPaintDC dc(this);
只有这个DC才有效的限制了区域
linaren 2005-07-12
  • 打赏
  • 举报
回复
我想问一下,要画背景都是怎么来做,背景能画成透明的是不是就不会覆盖控件了当拖动时?
我现在画的不是透明的
linaren 2005-07-12
  • 打赏
  • 举报
回复
to goodboyws(深夜不眠者) :
我在OnPaint里就只用了窗体的DC画的,大致的流程是这样的:
CDC bmpDC ;
bmpDC.CreateComparibleDC(pDC);
bmpDC.SelectObject( pbmp );
pDC->BitBlt(...,&bmpDC,...);
bmpDC.DeleteDC();
Zhymax 2005-07-12
  • 打赏
  • 举报
回复
屏蔽WM_NCACTIVATE消息

BOOL CWnd::OnNcActivate(BOOL bActive)
{
return TRUE;
}

goodboyws 2005-07-12
  • 打赏
  • 举报
回复
1.我正好做过这方面的东西,可以给你说的详细一点,在你的对话框里加上以下代码
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
//{{AFX_MSG_MAP(CXXXDlg)
ON_WM_INITMENU()
......
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CXXXDlg::OnInitMenu(CMenu* pMenu)
{
CODDialog::OnInitMenu(pMenu);
SendMessage(WM_NCPAINT);
}
LRESULT CXXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == 0x02A2)
return 0;
else if (message == WM_NCHITTEST)
{
LRESULT lRet = CDialog::WindowProc(message, wParam, lParam);
if (lRet == HTZOOM || lRet == HTMINBUTTON || lRet == HTCLOSE)
return HTCAPTION;
else
return lRet;
}
else if (message == WM_SETCURSOR || message == WM_NCLBUTTONDOWN || message == WM_NCLBUTTONDBLCLK)
{
ModifyStyle(WS_SYSMENU, 0);
LRESULT lRet = CDialog::WindowProc(message, wParam, lParam);
ModifyStyle(0, WS_SYSMENU);
return lRet;
}
return CDialog::WindowProc(message, wParam, lParam);
}
2.要看你自己的代码是怎么写的,一般的说在OnPaint里不要用其他控件的DC
flyelf 2005-07-12
  • 打赏
  • 举报
回复
去掉对话框的标题栏风格就不会出现这种现象了
加载更多回复(1)

15,979

社区成员

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

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