一些技巧性的问题.

codekiwi 2003-03-08 01:00:14
1.如何使我的窗体不显示推出按钮(就是右上脚的叉叉)
2.怎样给没有Click事件的控件加上Click事件
3.怎样拖动一个没有标题的窗口.

问了这么多真是很不好意思,感谢作答,同样感谢up
...全文
80 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsclub 2003-03-08
  • 打赏
  • 举报
回复
第2问还是用SubClass吧:
'-------------Module----------------------
Option Explicit

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Public Const GWL_WNDPROC As Long = (-4)
Public Const WM_LBUTTONUP As Long = &H202
Public Const WM_LBUTTONDOWN As Long = &H201


Private PrevWndProc As Long

Public Function MyWindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Select Case uMsg

Case WM_LBUTTONDOWN:
Debug.Print "WM_LBUTTONDOWN"
MyWindowProc = 1
Exit Function
Case WM_LBUTTONUP:
Debug.Print "WM_LBUTTONDOWN"
MsgBox "您抬起了鼠标的左键!"
MyWindowProc = 1
Exit Function
Case Else
End Select

MyWindowProc = CallWindowProc(PrevWndProc, hWnd, uMsg, wParam, lParam)
End Function

Public Sub SetHook(ByVal hFrmWnd As Long)
PrevWndProc = SetWindowLong(hFrmWnd, GWL_WNDPROC, AddressOf MyWindowProc)
End Sub
Public Sub UnHook(ByVal hFrmWnd As Long)
Call SetWindowLong(hFrmWnd, GWL_WNDPROC, PrevWndProc)
End Sub

'------------------------End-------------------------------------


'--------------------Form1----------------------------------------
Option Explicit

Private Sub Form_Load()
SetHook HScroll1.hWnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnHook HScroll1.hWnd
End Sub
'--------------End---------------------------------

期待更好的答案…………
Sean918 2003-03-08
  • 打赏
  • 举报
回复
楼上的 “灰掉 X”我要收藏,别和我抢!
dsclub 2003-03-08
  • 打赏
  • 举报
回复
1.可以灰掉X扭
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Const MF_BYPOSITION = &H400&
Const MF_REMOVE = &H1000&
Private Sub Form_Load()
Dim hSysMenu As Long, nCnt As Long
' Get handle to our form's system menu
' (Restore, Maximize, Move, close etc.)
hSysMenu = GetSystemMenu(Me.hwnd, False)

If hSysMenu Then
' Get System menu's menu count
nCnt = GetMenuItemCount(hSysMenu)
If nCnt Then
' Menu count is based on 0 (0, 1, 2, 3...)
RemoveMenu hSysMenu, nCnt - 1, MF_BYPOSITION Or MF_REMOVE
RemoveMenu hSysMenu, nCnt - 2, MF_BYPOSITION Or MF_REMOVE ' Remove the seperator
DrawMenuBar Me.hwnd
' Force caption bar's refresh. Disabling X button
End If
End If
End Sub

2.要是有MFC的消息映射就好了…………。我再想想

3.用这个简单又确保速度:
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
ReleaseCapture
Call SendMessage(me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, ByVal 0&)
End If
End Sub
Tenner 2003-03-08
  • 打赏
  • 举报
回复
1、用这段代码可以让“退出”的“X”变为不可用:

Public Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Public Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long

Public Const MF_BYPOSITION = &H400&
Public Const MF_DISABLED = &H2&

Public Sub DisableCloseButton(Form As Form)
Dim hMenu As Long, nCount As Long
hMenu = GetSystemMenu(Form.hWnd, 0)
nCount = GetMenuItemCount(hMenu)
RemoveMenu hMenu, nCount - 1, MF_DISABLED Or MF_BYPOSITION
RemoveMenu hMenu, nCount - 2, MF_DISABLED Or MF_BYPOSITION
DrawMenuBar Form.hWnd
End Sub

3、可以用这种方法模拟
Private sngX As Single, sngY As Single

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
sngX = X
sngY = Y
End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
Me.Move Me.Left + X - sngX, Me.Top + Y - sngY
End If
End Sub
James0001 2003-03-08
  • 打赏
  • 举报
回复
1.试试着个吧,
'W98 + VB6 + SP5 -> OK
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Const MF_BYPOSITION = &H400&
Private Const MF_DELETE = &H200&
Private Const CLOSE_POS = &H6

Private Sub Form_Load()
Dim hm As Long
hm = GetSystemMenu(hwnd, 0)
If hm Then
DeleteMenu hm, CLOSE_POS, MF_BYPOSITION Or MF_DELETE
End If
End Sub

2.用hook或子类,不知行不行
3.用 wxy_xiaoyu(☆然也☆╭∩╮(︶︿︶)╭∩╮) 的方法
Sean918 2003-03-08
  • 打赏
  • 举报
回复
只去 X ,就如楼上各位所说,要自己模拟一个标题栏
linghuxiaochong 2003-03-08
  • 打赏
  • 举报
回复
去XX:
设置form的ControlBox = False
然后再窗体上边用label或picturebox以假乱真,容易实现,风格多样。见过 金山词霸 吗?我想那就是这样实现的吧(假设其界面是vb左的话)。
dwenj 2003-03-08
  • 打赏
  • 举报
回复
1.窗体属性controlbox设成false

2.Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

zhangwh6882 2003-03-08
  • 打赏
  • 举报
回复
1、你的意思是要保留最大化最小化按钮?好像不是很容易直接实现。你可以选择简单的使关闭按钮无效,或者是把标题栏去掉,自己用一个label模拟标题栏,按钮自己添就行了,想用几个就用几个,样式也可以自己选择。
codekiwi 2003-03-08
  • 打赏
  • 举报
回复
1.如何使我的窗体不显示推出按钮(就是右上脚的叉叉)
如果我只想去掉叉叉,该怎么办?
Sean918 2003-03-08
  • 打赏
  • 举报
回复
1.设置 form的 ControlBox = False

2."给没有Click事件的控件加上Click事件",如果他有鼠标响应事件的话,可在其响应事件里模拟,没有的话,就如楼上的shape控件的模拟单机,但是这种方法可能产生错误,不推荐。 一般需要自己做控件来满足。

3.这个其实比较简单。以下是个例子:

'''直接copy代码运行
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lngReturnValue As Long

If Button = 1 Then
'Release capture
Call ReleaseCapture
'Send a 'left mouse button down on caption'-message to our form
lngReturnValue = SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
ElseIf Button = 2 Then
End
End If

End Sub
northwolves 2003-03-08
  • 打赏
  • 举报
回复
1.窗体属性controlbox设成false
2.
shape的模拟单击
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If X >= Shape1.Left And X <= Shape1.Left + Shape1.Width And Y >= Shape1.Top And Y <= Shape1.Top + Shape1.Height Then
MsgBox "you click shape1"
End If
End Sub
3.想想。
Sean918 2003-03-08
  • 打赏
  • 举报
回复
MARK

7,763

社区成员

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

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