我重绘了标题栏,并且想重绘标题栏按钮,但原来系统绘制的按钮会时不时的显示出来,能屏蔽掉吗?

mynamelj 2006-12-09 01:37:59
~WS_MINIMIZEBOX ~WS_MAXIMIZEBOX ~WS_SYSMENU;
虽然可以想通过修改窗口样式来屏蔽这几个按钮,但我不想这要做,因为这样处理的话系统菜单就没有了。

有其它方法可以屏蔽系统绘制按钮吗?
...全文
853 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwcbll 2010-06-25
  • 打赏
  • 举报
回复
期待 正在学习
jyl168 2007-03-06
  • 打赏
  • 举报
回复
mark
xyh2007 2006-12-20
  • 打赏
  • 举报
回复
顶!!
mynamelj 2006-12-20
  • 打赏
  • 举报
回复
我发现在EnableMenuItem操作系统菜单的时候,那几个按钮也会显示出来,真是气死人了!
我迟些结帖!
mynamelj 2006-12-20
  • 打赏
  • 举报
回复
我现在还有一点没有处理好就是弹出系统菜单时,那几个按钮还是出现,手动弹出系统菜单还是屏蔽不了...
mynamelj 2006-12-20
  • 打赏
  • 举报
回复
你在WM_NCHITTEST中屏蔽HTMINBUTTON,HTMAXBUTTON,HTCLOSE项目
hurryboylqs 2006-12-20
  • 打赏
  • 举报
回复
我最近也在画标题栏和边框,不过我是SDK方式的(大同小异),我响应WM_NCPAINT来画标题栏,可是当鼠标移动到最小化按钮或者最大化按钮时,这些小按钮回自动的弹出来,怎么解决呢?而且主窗口里有菜单,当点击菜单又弹出一个模态对话框时,主窗口刚画好的标题栏又变回原样了~~~~
lemon_wei 2006-12-16
  • 打赏
  • 举报
回复
没做过多文档的,只做过对话框的
stevphen 2006-12-15
  • 打赏
  • 举报
回复
楼上解答以及链接地址指向的例子只能针对SDI和Dialog,对于MDI是无效的,MDIFrame的default指向DefFrameProc了,里面有画最小、最大和关闭按钮的过程。
yjgx007 2006-12-15
  • 打赏
  • 举报
回复
我现在栏截了WM_NCHITTEST消息后,但WM_NCLBUTTONDOWN消息被屏蔽了,总是让我不能顺心。
=================================================================================

那就在WM_NCHITTEST,判断下光标是不是点在非客户区,如果是就手工发个消息WM_NCLBUTTONDOWN,不管怎样,始终返回TRUE(不由window默认处理).
jyl168 2006-12-15
  • 打赏
  • 举报
回复
mark
stevphen 2006-12-15
  • 打赏
  • 举报
回复
LockWindowUpdate();
UnLockWindowUpdate();
mynamelj 2006-12-13
  • 打赏
  • 举报
回复
Snow_Ice11111 2006-12-13
  • 打赏
  • 举报
回复
原来系统绘制的按钮会时不时的显示出来
----------------------------------------------------
如果效果还不理想的话,楼主只好发现按钮出现的规律,并结合Spy++看还有什么消息要处理了。
Snow_Ice11111 2006-12-13
  • 打赏
  • 举报
回复
当然,你如果把例子中“最小、最大和关闭按钮”这三个分开的图片合成一个长条的绘制(这样就没有空隙可让这三个原来的系统按钮显示了)可能也行。
mynamelj 2006-12-13
  • 打赏
  • 举报
回复
TO:Snow_Ice11111(雪上加冰) ( ) 信誉:100 Blog
---------------------
谢谢,这样不理想!
Snow_Ice11111 2006-12-13
  • 打赏
  • 举报
回复
再发一遍URL:
http://www.vckbase.com/document/viewdoc/?id=317

里面有示例工程可下,分为针对对话框的和针对SDI工程的两种都有。
例子的效果不错,不过并非完美,对话框工程下,要作如下修改(SDI的情况我还没试):

当窗口风格为Resizing的时候,鼠标刚进入窗口区域时(即鼠标图标为调整窗口大小的那几个时),会出现原来系统的最小、最大和关闭按钮未被遮住的部分,把DefWindowProc函数略加修改,改成下面即可解决:
LRESULT CTitleBarDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);

if (!::IsWindow(m_hWnd))
return lrst;

if (message==WM_SETCURSOR && lParam>=0x200000A && lParam<=0x2000011 || //只是增加了一个判断而已,其余代码未动
message==WM_MOVE||
message==WM_PAINT||
message==WM_NCPAINT||
message==WM_NCACTIVATE ||
message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
return lrst;
}
另外,当鼠标在原来系统的最小、最大和关闭按钮未被遮住的部分(即使没有显示出来也一样)点击时,这三个系统按钮同样会显示出来,并发生作用,这样一来,我们的辛苦就白费了。解决方法是:在窗口的CTitleBarDlg::OnNcLButtonDown函数中对鼠标位置进行检查,如果在这个区域(注意我们绘制的“最小、最大和关闭按钮”区域别算进去)点击时就直接返回就行了。
Snow_Ice11111 2006-12-13
  • 打赏
  • 举报
回复
WM_SETCURSOR消息也要处理,不过全处理的话标题栏会明显闪烁,所以只能处理特定情况下的WM_SETCURSOR消息。


昨夜短消息中的URL例子稍微改改就可完美解决楼主的问题。
yjgx007 2006-12-13
  • 打赏
  • 举报
回复
ding!
sirguan 2006-12-12
  • 打赏
  • 举报
回复
加载更多回复(16)

16,472

社区成员

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

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

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