怎么才能不显示右上角的叉

iseelxj 2004-08-25 04:14:00
如题,谢谢
...全文
361 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
踏平扶桑 2004-08-30
  • 打赏
  • 举报
回复
如果想让用户点X不关闭程序的话可以
Private Sub Form_Unload(Cancel As Integer)
Cancel = 1
End Sub
这样点击X就不会关闭程序了
你可以另外建立一个菜单用来关闭程序(类似于退出之类的)
iseelxj 2004-08-30
  • 打赏
  • 举报
回复
感谢大家的帮助。
goodname008 2004-08-26
  • 打赏
  • 举报
回复
to BlueBeer(1win):
zyl 解释过了。 :D
AKIIscer 2004-08-25
  • 打赏
  • 举报
回复
controlbox=false
zyl910 2004-08-25
  • 打赏
  • 举报
回复
回复人: BlueBeer(1win) ( ) 信誉:132 2004-08-25 19:30:00 得分: 0


请教goodname008(卢培培,充电中......) :

在98下好像无效,与禁用效果相同


===================================

他已经说过了
他是根据WinXP的关闭按钮的坐标编写的
Win9X下没有XP界面风格,所以按钮的坐标不同

需要用GetSystemMetrics的系统常数
计算好关闭按钮的坐标



GetSystemMetrics

VB声明
Declare Function GetSystemMetrics Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
说明
返回与windows环境有关的信息
返回值
Long,取决于具体的常数索引
参数表
参数 类型及说明
nIndex Long,常数,指定欲获取的信息;如下表所示
nIndex常数设置
常数定义 取得信息
SM_ARRANGE 设置windows如何排列最小化窗口的一个标志。参考api32.txt中的ARW常数
SM_CLEANBOOT 指定启动模式。0=普通模式;1=带网络支持的安全模式
SM_CMETRICS 可用系统环境的数量
SM_CMOUSEBUTTON 鼠标按钮(按键)的数量。如没有鼠标,就为零
SM_CXBORDER, SM_CYBORDER 尺寸不可变边框的大小
SM_CXCURSOR, SM_CYCURSOR 标准指针大小
SM_CXDLGFRAME, SM_CYDLGFRAME 对话框边框的大小
SM_CXDOUBLECLK, SM_CYDOUBLECLK 双击区域的大小(参考注解)
SM_CXFRAME, SM_CYFRAME 尺寸可变边框的大小(在win95和nt 4.0中使用SM_C?FIXEDFRAME)
SM_CXFULLSCREEN, SM_CYFULLSCREEN 最大化窗口客户区的大小
SM_CXHSCROLL, SM_CYHSCROLL 水平滚动条上的箭头大小
SM_CXHTHUMB, SM_CYHTHUMB 滚动块在水平滚动条上的大小
SM_CXICON, SM_CYICON 标准图标的大小
SM_CXICONSPACING, SM_CYICONSPACING 桌面图标之间的间隔距离。在win95和nt 4.0中是指大图标的间距
SM_CXMAXIMIZED, SM_CYMAXIMIZED 最大化窗口的默认尺寸
SM_CXMAXTRACK, SM_CYMAXTRACK 改变窗口大小时,最大的轨迹宽度
SM_CXMENUCHECK, SM_CYMENUCHECK 菜单复选号位图的大小
SM_CXMENUSIZE, SM_CYMENUSIZE 菜单栏上的按钮大小
SM_CXMIN, SM_CYMIN 窗口的最小尺寸
SM_CXMINIMIZED, SM_CYMINIMIZED 最小化的窗口必须填充进去的一个矩形小于或等于SM_C?ICONSPACING
SM_CXMINTRACK, SM_CYMINTRACK 窗口的最小轨迹宽度
SM_CXSCREEN, SM_CYSCREEN 屏幕大小
SM_CXSIZE, SM_CYSIZE 标题栏位图的大小
SM_CXSIZEFRAME, SM_CYSIZEFRAME 具有WS_THICKFRAME样式的窗口的大小
SM_CXSMICON, SM_CYSMICON 小图标的大小
SM_CXSMSIZE, SM_CYSMSIZE 小标题按钮的大小
SM_CXVSCROLL, SM_CYVSCROLL 垂直滚动条中的箭头按钮的大小
SM_CYCAPTION 窗口标题的高度
SM_CYKANJIWINDOW Kanji窗口的大小(Height of Kanji window)
SM_CYMENU 菜单高度
SM_CYSMCAPTION 小标题的高度
SM_CYVTHUMB 垂直滚动条上滚动块的高度
SM_DBCSENABLED 如支持双字节则为TRUE
SM_DEBUG 如windows的调试版正在运行,则为TRUE
SM_MENUDROPALIGNMENT 如弹出式菜单对齐菜单栏项目的左侧,则为零
SM_MIDEASTENABLED 允许了希伯来和阿拉伯语
SM_MOUSEPRESENT 如安装了鼠标则为TRUE
SM_MOUSEWHEELPRESENT 如安装了带轮鼠标则为TRUE;只适用于nt 4.0
SM_NETWORK 如安装了网络,则设置位0。其他位保留未用
SM_PENWINDOWS 如装载了支持笔窗口的DLL,则表示笔窗口的句柄
SM_SECURE 如安装了安全(保密)机制,则为TRUE
SM_SHOWSOUNDS 强制视觉提示播放声音
SM_SLOWMACHINE 系统速度太慢,但仍在运行中(System is too slow for effective use but is being run anyway)
SM_SWAPBUTTON 如左右鼠标键已经交换,则为TRUE
注解
双击区域指定屏幕上一个特定的显示区域,只有在这个区域内连续进行两次鼠标单击,才有可能被当作双击事件处理
其他
常数 SM_ARRANGE, SM_CLEANBOOT, SM_CMETRICS, SM_C?MAXIMIZED, SM_C?MAXTRACK, SM_C?SIZEFRAME, SM_C?SMICON, SM_C?SMSIZE, SM_CYSMCAPTION, SM_SECURE, SM_SHOWSOUNDS, and SM_SLOWMACHINE 未获 NT 3.51 及更早版本的支持
zyl910 2004-08-25
  • 打赏
  • 举报
回复
还应该拦截WM_NCHITTEST消息
若返回值是HTCLOSE则改成HTCAPTION

BlueBeer 2004-08-25
  • 打赏
  • 举报
回复
请教goodname008(卢培培,充电中......) :

在98下好像无效,与禁用效果相同
goodname008 2004-08-25
  • 打赏
  • 举报
回复
忘了说了,补充一点:
我是在XP下测试的,绘图操作也是针对的XP比较宽的蓝色标题栏,具体的楼主可以改。
还有就是窗体要刷新。
52r 2004-08-25
  • 打赏
  • 举报
回复
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 Declare Function AppendMenu Lib "User32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
Private Declare Function GetMenuString Lib "User32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) 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_NCLBUTTONDBLCLK = &HA3
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Const MF_STRING = &H0&
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060

Private hMenu As Long
Private CloseStr As String '记录Close MenuItem的字串

'将"关闭"的那一个MenuItem 加回来
Private Sub Command1_Click()
Call AppendMenu(hMenu, MF_STRING, SC_CLOSE, CloseStr)

'令"X"能出现Enable的颜色
Call SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End Sub

Private Sub Form_Load()
hMenu = GetSystemMenu(Me.hwnd, 0)
CloseStr = String(255, 0)

'SC_CLOSE指的便是"关闭"的那一个MenuItem ID
Call GetMenuString(hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND)
CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)

Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End Sub
goodname008 2004-08-25
  • 打赏
  • 举报
回复
我觉得楼主这问题挺有意思,就多花了点时间玩了玩,实现了彻底不显示。 :D
结合上面的代码实现了真正的隐藏“X”按钮。
原理就是通过截取WM_NCPAINT消息,并进行绘图,把“X”按钮盖住。
这只是个大概意思,可能还有些细节需要再处理一下,楼主自便了。 :)

' 窗体代码:
Option Explicit
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32.dll" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Private Const MF_BYPOSITION = &H400&
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1

Private Sub Command1_Click()
Unload Me
End Sub

Private Sub Form_Load()
Dim hSystemMenu As Long
hSystemMenu = GetSystemMenu(Me.hwnd, False)
DeleteMenu hSystemMenu, 6, MF_BYPOSITION
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
Me.ScaleMode = vbPixels
End Sub

Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hwnd, GWL_WNDPROC, ret
End Sub


' 标准模块:

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 Rectangle Lib "gdi32.dll" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function GetDCEx Lib "user32.dll" (ByVal hwnd As Long, ByVal hrgnclip As Long, ByVal fdwOptions As Long) As Long
Public Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal crColor As Long) As Long
Public Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Public Declare Function GetStockObject Lib "gdi32.dll" (ByVal nIndex As Long) As Long

Public Const GWL_WNDPROC = (-4)

Private Const WM_NCPAINT = &H85
Private Const DCX_INTERSECTRGN = &H80&
Private Const DCX_WINDOW = &H1&
Private Const NULL_PEN = 8

Public ret As Long

Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WindowProc = CallWindowProc(ret, hwnd, Msg, wParam, lParam)
If Msg = WM_NCPAINT Then
Dim hdc As Long, hBrush As Long, hOldBrush As Long, hPen As Long, hOldPen As Long
hdc = GetDCEx(hwnd, wParam, DCX_WINDOW Or DCX_INTERSECTRGN)
hPen = GetStockObject(NULL_PEN)
hBrush = CreateSolidBrush(RGB(0, 90, 240))
hOldPen = SelectObject(hdc, hPen)
hOldBrush = SelectObject(hdc, hBrush)
Rectangle hdc, Form1.ScaleWidth - 20, 5, Form1.ScaleWidth + 5, 28
SelectObject hdc, hOldBrush
SelectObject hdc, hOldPen
DeleteObject hBrush
DeleteObject hPen
End If
End Function


starsoulxp 2004-08-25
  • 打赏
  • 举报
回复
还是楼上高明。
of123 2004-08-25
  • 打赏
  • 举报
回复
API 也只能令其失效,而不能彻底不显示。所以,如果有条件限制,还真的不那么好搞。
iiboy 2004-08-25
  • 打赏
  • 举报
回复
强!!!


学习...
goodname008 2004-08-25
  • 打赏
  • 举报
回复
ControlBox设置成False的话连最大化和最小化按钮也没有了。
如果是只想屏蔽掉“X”的话可以通过删除控制菜单中的“关闭”项来达到目的。

Option Explicit
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32.dll" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function SetWindowPos Lib "user32.dll" (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 MF_BYPOSITION = &H400&
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1

Private Sub Command1_Click()
Dim hSystemMenu As Long
hSystemMenu = GetSystemMenu(Me.hwnd, False)
DeleteMenu hSystemMenu, 6, MF_BYPOSITION
SetWindowPos Me.hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_FRAMECHANGED
End Sub
coolzlay 2004-08-25
  • 打赏
  • 举报
回复
啊 是啊是啊 刚才语气是刻薄了点 错了错了 呵呵
laviewpbt 2004-08-25
  • 打赏
  • 举报
回复
不要搞人身攻击。
of123 2004-08-25
  • 打赏
  • 举报
回复
coolzlay(下面的话是我写的拉):

也不必那么刻薄。也许他的意思是还要保留左上角的 Icon 及其菜单,或者最大化、最小化按钮。
coolzlay 2004-08-25
  • 打赏
  • 举报
回复
瞎说 ! 自己玩不精 不要乱讲
窗体有个属性(Boolean)叫ControlBox 设置成False就可以了;
摆脱 laviewpbt(pbt) 你那3个开裆裤是怎么穿的 我晕
laviewpbt 2004-08-25
  • 打赏
  • 举报
回复
要去掉,是不太可能的,除非设置borderstyle=0,然后自己画一些按钮。
要禁用到还不难

7,762

社区成员

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

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