删除MDIForm系统菜单的最大最小项时产生的错误

jiajy 2003-08-20 12:54:14
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Boolean) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long

Sub MDIForm_Load()
Dim hMenu As Long

hMenu = GetSystemMenu(Me.hwnd, False)
call DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND)
call DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND)
call DrawMenuBar(Me.hwnd)
end sub

函数DeleteMenu,DrawMenuBar执行都成功,但是最大最小菜单项还存在,为什么???
...全文
39 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jackile 2003-10-05
  • 打赏
  • 举报
回复
那个是api啊,msdn中没有具体的啊!
jiajy 2003-08-20
  • 打赏
  • 举报
回复
ch21st:
按照上面的方法,成功了。非常感谢!
有个问题请教,为什么当没有
Private Const MF_BYPOSITION = &H400
时,即使函数RemoveMenu执行成功了,系统菜单中的最大最小菜单项还是存在,
而且在MSDN中也没有讲到要设置MF_BYPOSITION的值。

谢谢!
zhhaidong 2003-08-20
  • 打赏
  • 举报
回复
up
道素 2003-08-20
  • 打赏
  • 举报
回复
那这样呢

Option Explicit
'
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Const MF_BYPOSITION = &H400
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long


Const WS_MINIMIZEBOX = &H20000
Const WS_MAXIMIZEBOX = &H10000
Const GWL_STYLE = (-16)


Private Sub MDIForm_Load()

Dim SystemMenu As Long

SystemMenu = GetSystemMenu(hwnd, 0)
RemoveMenu SystemMenu, 4, MF_BYPOSITION
RemoveMenu SystemMenu, 3, MF_BYPOSITION
SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, _
GWL_STYLE) And Not (WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)


End Sub
zyl910 2003-08-20
  • 打赏
  • 举报
回复
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const WS_MINIMIZEBOX = &H20000 '最小化
Private Const WS_MAXIMIZEBOX = &H10000 '最大化
Private Const GWL_STYLE = (-16)


Sub MDIForm_Load()
Dim TempStyle As Long
TempStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
TempStyle = TempStyle And Not WS_MINIMIZEBOX '最小化
TempStyle = TempStyle And Not WS_MAXIMIZEBOX '最大化
Call SetWindowLong(Me.hwnd, GWL_STYLE, TempStyle)
End Sub
jiajy 2003-08-20
  • 打赏
  • 举报
回复
ch21st:
该方法只能去掉MDIForm的最大最小button,不能去掉系统菜单中的最大最小菜单项。
道素 2003-08-20
  • 打赏
  • 举报
回复
如果你想去掉这两个
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long
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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Const WS_MINIMIZEBOX = &H20000
Const WS_MAXIMIZEBOX = &H10000
Const GWL_STYLE = (-16)


Private Sub MDIForm_Load()
SetWindowLong Me.hwnd, GWL_STYLE, GetWindowLong(Me.hwnd, _
GWL_STYLE) And Not (WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)
End Sub
射天狼 2003-08-20
  • 打赏
  • 举报
回复
其实这只是删除窗口的系统菜单,最大化最小化与关闭都是调用的系统,普通窗口删除完系统菜单后会自动重画,而去掉相应的按钮,不过MDI的机制可能与普通窗口不一样.

7,759

社区成员

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

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