控件SetParent桌面后任务栏多出

soraking2000 2009-07-15 09:38:05
目的:使控件超出所在窗口的部分不被窗口剪掉。即控件能像combobox的下拉部分一样可以超出窗口。
实现:1、使用API函数SetParent,将控件的父窗口设为桌面。
2、具体实现:
在Form1上建立一个Picture1,一个Command1,代码如下:
Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Private Sub Command1_Click()
SetParent Picture1.hwnd, 0
End Sub

3、问题是:将picture1的父窗口设为桌面后,在系统的任务栏多出一个bar。如何消去?


单击看大图


...全文
459 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
soraking2000 2009-07-25
  • 打赏
  • 举报
回复
近期将推出全套控件.包括:
1.vistaShayooForm
2.vistaShayooListBox
3.vistaShayooMenu
4.vistaShayooTextBox
5.vistaShayooStatusBar
6.vistaShayooTooltip
7.vistaShayooCalendar
8.vistaShayooScrollBar
9.vistaShayooCheckBox
10.vistaShayooRadio
11.vistaShayooGrid
12.vistaShayooButton
13.vistaShayooMdiTabs
14.vistaShayooFrame
15.vistaShayooToolBar
16.vistaShayooRibbon
17.vistaShayooListView
18.vistaShayooMsgbox
19.vistaShayooLed
20.vistaShayooDock
soraking2000 2009-07-25
  • 打赏
  • 举报
回复
关于此主题(完全自绘超出父窗口的窗口)的贴子:
http://topic.csdn.net/u/20090716/19/772419b0-b147-45d7-a81b-6085de55926c.html
http://topic.csdn.net/u/20090715/21/da4a07db-15ea-4fef-a110-0dc9be9f3e6a.html
http://topic.csdn.net/u/20090714/09/5f9e994f-5f79-4aaa-b7b9-5b6543632341.html
http://topic.csdn.net/u/20090714/09/aff8197b-ae7a-40ad-bbd8-38f05ffd6c83.html
经过一星期的奋战终于解决。用这种原理开发的ShayooMenu.ocx,vista日历控件,combobox控件,listbox控件和其他ocx界面及测试程序如下:


测试程序for VB 6.0 点击下载
欢迎交流 shayoo@126.com,欢迎开发非Microsoft自带控件.从底层和原理关注软件开发.
波导终结者 2009-07-16
  • 打赏
  • 举报
回复
经你这么一说,我倒想到另一个方法,新建一个Form2,把标题栏隐去,总在最前,鼠标拖动即可

Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST& = -1
Private Const SWP_NOSIZE& = &H1
Private Const SWP_NOMOVE& = &H2

Private Sub Form_Load()
SetWindowPos Me.Hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Call ReleaseCapture
Call PostMessage(Hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
End If
End Sub
波导终结者 2009-07-16
  • 打赏
  • 举报
回复
把picture设为总在最前试试
soraking2000 2009-07-16
  • 打赏
  • 举报
回复
不好用.首先,setparent后,是将picture1放到一个窗口中去的,所以想将picture1置于顶层,应该得到picture1.parent.hwnd,将此句柄置于顶层,而不是picture1.hwnd.其次,picture1.parent已经置为桌面窗口,所以setwindowpos picture1.parent.hwnd并不起作用. 请测试.
波导终结者 2009-07-16
  • 打赏
  • 举报
回复
用setwindowpos把picture设为总在最前
soraking2000 2009-07-16
  • 打赏
  • 举报
回复
可能MS做的Combobox等控件的原理有可能是这样,其实当在Combobox箭头上单击时,已经将焦点从Combobox的父窗口转移到Combobox上,并使其zoder位于最顶层,但并不会让combobox的父窗口的标题栏重绘成灰色,并捕捉Mouse Capture,当MoouseDown时,再将焦点移回并且原来.
soraking2000 2009-07-16
  • 打赏
  • 举报
回复
但是这样做的结果是,单击后,焦点移到了picture1上,并且picture1被档住了。实现不了图上的效果。
波导终结者 2009-07-15
  • 打赏
  • 举报
回复
试了一晚上,知道原因了
setparent的父句柄不能为零,这样不是真正的将其父窗口设为桌面,而对其隐藏任务栏图标的操作也无效了。试了窗口是有效的。

想要隐藏掉,必须先取得桌面的正确句柄

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_EXSTYLE = (-&H14)
Private Const WS_EX_APPWINDOW As Long = &H40000
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Const SW_HIDE = 0
Private Const SW_SHOW = 5
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Sub ShowHideTaskBarButton(ByVal hWnd As Long, ByVal fShow As Boolean)
Dim lExStyle As Long
lExStyle = GetWindowLong(hWnd, GWL_EXSTYLE)
lExStyle = IIf(fShow, lExStyle Or WS_EX_APPWINDOW, lExStyle And Not WS_EX_APPWINDOW)
ShowWindow hWnd, SW_HIDE
lExStyle = SetWindowLong(hWnd, GWL_EXSTYLE, lExStyle)
ShowWindow hWnd, SW_SHOW
End Sub

Private Sub cmdHideInTaskBar_Click()
Dim i As Long, j As Long

j = FindWindowEx(0&, 0&, "Progman", vbNullString)
j = FindWindowEx(j, 0&, "SHELLDLL_DefView", vbNullString)
j = FindWindowEx(j, 0&, "SysListView32", vbNullString)
i = Picture1.hWnd
SetParent Picture1.hWnd, j
ShowHideTaskBarButton i, True
End Sub
soraking2000 2009-07-15
  • 打赏
  • 举报
回复
1楼说得不好用.
波导终结者 2009-07-15
  • 打赏
  • 举报
回复
先存下picture1的句柄,用函数
SetWindowLong(句柄,GWL_EXSTYLE,WS_EX_TOOLWINDOW)

ShowWindow(句柄, SW_HIDE );
哪个有效请自行尝试

1,488

社区成员

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

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