读书人

MFC 怎么把窗体钉在桌面

发布时间: 2012-12-16 12:02:32 作者: rapoo

MFC 如何把窗体钉在桌面
说明:
我新手,想做一个日历(模仿DesktopSprite,但DesktopSprite有一些自己不满意的地方,就想自己来实现以下).需要实现如下功能

1 窗体钉在桌面,(就是在所有窗体的底部,或者Z次序的底部)
2 显示桌面时,它也会显示,不会隐藏.
3 能接受到鼠标消息.在拖动过程中,窗体也是种保持在最底部,(即使拖拽中穿过其他窗口).

补充说明:
查过网上的资料后,网上大致有以下几种做法:
1 不接受鼠标消息,窗体到最底层.
LONG dwNewLong = GetWindowLong(m_hWnd, GWL_EXSTYLE);
dwNewLong |= WS_EX_TRANSPARENT |WS_EX_LAYERED;
SetWindowLong(m_hWnd, GWL_EXSTYLE, dwNewLong);
但是这样的话,就接收不到鼠标消息了,而且显示桌面时,它也被隐藏了.

2 嵌入桌面
HWND hParent = ::FindWindow(_T("Progman"), NULL);
if(hParent == NULL)
hParent = ::GetDesktopWindow();
if(hParent)
{
::SetParent(GetSafeHwnd(), hParent);
}
很多都这样说,但是我实验后,这纯属坑爹!我实验后,这货的确到最底层了,而且是到桌面还下面,都看不到它的程序.




求大神帮忙解决下.
[最优解释]
设置窗口的属性 始终 处在最 顶处,
设置成WS_EX_TOPMOST就是最顶层窗口
或者用SetWindowPos函数也可以设置Z序

具体实现请参考 MSDN
[其他解释]
问题结局了

HWND hDesktop = ::FindWindow("Progman", NULL);
hDesktop = ::GetWindow(hDesktop, GW_CHILD);
CWnd* pWndDesktop = CWnd::FromHandle(hDesktop);
this->SetParent(pWndDesktop);


宁外说一下,如果最底部有其他窗体的话,是无法显示的.

还有,推荐一个窗体侦探器 Window Spy,很好用

以上两点希望多看到的新手有帮助

[其他解释]
可能有些相关:
http://msdn.microsoft.com/en-us/library/ms997507.aspx
和Spy++有什么区别吗?
[其他解释]
该回复于2012-11-26 09:51:28被管理员删除
[其他解释]

引用:
问题结局了

HWND hDesktop = ::FindWindow("Progman", NULL);
hDesktop = ::GetWindow(hDesktop, GW_CHILD);
CWnd* pWndDesktop = CWnd::FromHandle(hDesktop);
this->SetParent(pWndDesktop);


宁……


2 嵌入桌面
HWND hParent = ::FindWindow(_T("Progman"), NULL);
if(hParent == NULL)
hParent = ::GetDesktopWindow();
if(hParent)
{
::SetParent(GetSafeHwnd(), hParent);
}
问一下,你的方法和这个2方法的区别在哪里?感觉一样啊,怎么解决的。
[其他解释]
楼主的困扰在于被微软毒害太深
窗口是什么?你们告诉我,窗口是什么?
没有"窗口"会死人吗?
程序的目的是实现功能,实现程序员的想法
你自己局限在窗口的概念里,那还搞个毛啊

窗口无非就是一个包含有仿显存的内存块的区域的数据结构
你难道就不能定义一个你的窗口吗?

定义一个指向Desktop的部分区域的数据结构,简单点就是一个CRect
定义一个兼容DeskTop的DC的块,大小和上面的区域对应.

剩下的不就是截获Desktop的鼠标消息实现区域便移和更新吗?
[其他解释]
挺深奥的?

是不是像那个计算器,打开后在桌面,打开别的程序时可以把他覆盖,关闭、最小化别的程序时又显示在桌面

不知lz想做成啥功能的
[其他解释]
引用:
引用:问题结局了

HWND hDesktop = ::FindWindow("Progman", NULL);
hDesktop = ::GetWindow(hDesktop, GW_CHILD);


CWnd* pWndDesktop = CWnd::FromHandle(hDesktop);
this->SetParent(pW……




他们的父类窗口不一样
[其他解释]
引用:
楼主的困扰在于被微软毒害太深
窗口是什么?你们告诉我,窗口是什么?
没有"窗口"会死人吗?
程序的目的是实现功能,实现程序员的想法
你自己局限在窗口的概念里,那还搞个毛啊

窗口无非就是一个包含有仿显存的内存块的区域的数据结构
你难道就不能定义一个你的窗口吗?

定义一个指向Desktop的部分区域的数据结构,简单点就是一个CRect
定义一个兼容De……



没窗口搞个毛啊,用户怎么使用到程序的功能?
[其他解释]
引用:
问题结局了

HWND hDesktop = ::FindWindow("Progman", NULL);
hDesktop = ::GetWindow(hDesktop, GW_CHILD);
CWnd* pWndDesktop = CWnd::FromHandle(hDesktop);
this->SetParent(pWndDesktop);


宁……
楼主挺好的,上面说局限在窗口的人我认为不对,windows听名字就是窗口系统,在安卓跟着安卓的概念走,不要自命清高的好
[其他解释]
你是说windows7窗口小工具那样的东西,如果是可以参考这个:
http://msdn.microsoft.com/en-us/magazine/cc163370.aspx

读书人网 >VC/MFC

热点推荐