注册 登录
编程论坛 VFP论坛

.ControlBox指定是否在表单左上角显示程序图标,以及是否在表单右上角显示最小化、最大化、还原和关闭按钮

cssnet 发布于 2023-03-27 12:27, 1098 次点击
.ControlBox属性:指定是否在表单左上角显示程序图标,以及是否在表单右上角显示最小化、最大化、还原和关闭按钮

那啥……能否指定:
当用户在表单左上角的程序图标上单击时,不弹出控制菜单【还原/移动/大小/最小化/最大化//关闭】?
毕竟那个控制菜单是Windows 3.2年代的产物,2020年代的人似乎并不需要它,可特别烦人的是:
在某些情况下,它碍我事了。
顶它不顺,却又干它不掉……狠不爽的说。

求教:
不知有无API,能否SendMessage个参数过去,将控制菜单关掉?
然后世界从此就清净啦。
7 回复
#2
吹水佬2023-03-27 13:38
可以改变成自己的菜单 或 删除掉
#3
cssnet2023-03-27 14:46
自己查了一下,可能用这个API:
SetWindowLong(thisForm.hWnd, (-16), windowStyles)
不过很可惜,查了一遍windowStyles属性值,没找到想要的“控制菜单”相关值:
https://learn.
#4
吹水佬2023-03-27 15:25
窗口样式是 WS_SYSMENU equ 80000h
VFP的ControlBox应该是设置WS_SYSMENU样式的效果,去掉WS_SYSMENU样式相当于ControlBox=.f.,这不是你想要的。
如果想保留标题图标和右上角按钮,可以拦截消息。

#5
cssnet2023-03-27 15:31
以下是引用吹水佬在2023-3-27 15:25:50的发言:

窗口样式是 WS_SYSMENU equ 80000h
VFP的ControlBox应该是设置WS_SYSMENU样式的效果,去掉WS_SYSMENU样式相当于ControlBox=.f.,这不是你想要的。
如果想保留标题图标和右上角按钮,可以拦截消息。


确实,我想保留标题图标和右上角的几个按钮,只是想屏蔽左上角控制菜单。
#6
吹水佬2023-03-27 15:32
去掉WS_SYSMENU样式就是这样子,与ControlBox=.f.一样
只有本站会员才能查看附件,请 登录

程序代码:
DECLARE long GetWindowLong IN user32 long,long
DECLARE long SetWindowLong IN user32 long,long,long
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT cmd as commandbutton
    PROCEDURE init
        SetWindowLong(this.HWnd, -16, BITAND(GetWindowLong(this.HWnd,-16), BITNOT(0x80000)))
    ENDPROC
    PROCEDURE cmd.click
        thisform.release
    ENDPROC
ENDDEFINE
#7
吹水佬2023-03-27 16:31
试了一下,删除菜单也会将右上角的按钮删除掉。
只好拦截点击图标消息和右击标题消息。顶层表单右击标题会弹出菜单,不是顶层表单好像没有。
程序代码:
DECLARE long SendMessage IN User32 long,long,long,long
of = CREATEOBJECT("form1")
of.show
READ EVENTS
RETURN

DEFINE CLASS form1 as Form
    ShowWindow = 2
    AutoCenter = 1
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
    PROCEDURE Init
        BINDEVENT(this.hWnd, 0x00A4, this, "myMenuMsg")    && WM_NCRBUTTONDOWN    equ 00A4h
        BINDEVENT(this.hWnd, 0x0112, this, "myMenuMsg")    && WM_SYSCOMMAND       equ 0112h
    ENDPROC

    PROCEDURE myMenuMsg(hWnd, Msg, wParam, lParam)
        IF (Msg==0x00A4) OR (Msg==0x0112 AND wParam==0xF093)
            RETURN
        ENDIF
        SendMessage(hWnd, Msg, wParam, lParam)
    ENDPROC
ENDDEFINE


#8
cssnet2023-03-27 16:48
以下是引用吹水佬在2023-3-27 16:31:29的发言:

试了一下,删除菜单也会将右上角的按钮删除掉。
只好拦截点击图标消息和右击标题消息。顶层表单右击标题会弹出菜单,不是顶层表单好像没有。
DECLARE long SendMessage IN User32 long,long,long,long
of = CREATEOBJECT("form1")
of.show
READ EVENTS
RETURN

DEFINE CLASS form1 as Form
    ShowWindow = 2
    AutoCenter = 1
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
    PROCEDURE Init
        BINDEVENT(this.hWnd, 0x00A4, this, "myMenuMsg")    && WM_NCRBUTTONDOWN    equ 00A4h
        BINDEVENT(this.hWnd, 0x0112, this, "myMenuMsg")    && WM_SYSCOMMAND       equ 0112h
    ENDPROC

    PROCEDURE myMenuMsg(hWnd, Msg, wParam, lParam)
        IF (Msg==0x00A4) OR (Msg==0x0112 AND wParam==0xF093)
            RETURN
        ENDIF
        SendMessage(hWnd, Msg, wParam, lParam)
    ENDPROC
ENDDEFINE


噢,原来是这样!又学了一招!
非常感谢吹版!
1