经你这么一说,我倒想到另一个方法,新建一个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 LongPrivate 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& = &H2Private Sub Form_Load() SetWindowPos Me.Hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End SubPrivate 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
ON_WM_NCPAINT()//绘非客户区时。
ON_WM_NCACTIVATE()//非客户区有焦点和失去焦点时。
ON_WM_NCCALCSIZE()//计算窗体尺寸时
应该是安装一个钩子,并拦截失去焦点的消息.如何操作?
SendMessage xx.hWnd, WM_NCACTIVATE, true/false, ByVal 0&
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 LongPrivate 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& = &H2Private Sub Form_Load()
SetWindowPos Me.Hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End SubPrivate 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
m_hOwner = CreateWindowEx(0, wc.lpszClassName, "OwnerWindow", _
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, App.hInstance, ByVal 0&)
UpdateWindow m_hOwner
ShowWindow m_hOwner, SW_SHOWNORMAL中的m_hOwner换成已存在的Form1,如:m_hOwner=Form1.hwnd, m_hTool=Form2.hwnd?
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欢迎交流 [email protected],欢迎开发非Microsoft自带控件.从底层和原理关注软件开发.
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