标题:.ControlBox指定是否在表单左上角显示程序图标,以及是否在表单右上角显示最 ...
只看楼主
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
结帖率:100%
 问题点数:0 回复次数:7 
.ControlBox指定是否在表单左上角显示程序图标,以及是否在表单右上角显示最小化、最大化、还原和关闭按钮
.ControlBox属性:指定是否在表单左上角显示程序图标,以及是否在表单右上角显示最小化、最大化、还原和关闭按钮

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

求教:
不知有无API,能否SendMessage个参数过去,将控制菜单关掉?
然后世界从此就清净啦。
搜索更多相关主题的帖子: 指定 表单 还原 显示 是否 
2023-03-27 12:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
可以改变成自己的菜单 或 删除掉
2023-03-27 13:38
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
自己查了一下,可能用这个API:
SetWindowLong(thisForm.hWnd, (-16), windowStyles)
不过很可惜,查了一遍windowStyles属性值,没找到想要的“控制菜单”相关值:
https://learn.
2023-03-27 14:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
窗口样式是 WS_SYSMENU equ 80000h
VFP的ControlBox应该是设置WS_SYSMENU样式的效果,去掉WS_SYSMENU样式相当于ControlBox=.f.,这不是你想要的。
如果想保留标题图标和右上角按钮,可以拦截消息。

2023-03-27 15:25
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用吹水佬在2023-3-27 15:25:50的发言:

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


确实,我想保留标题图标和右上角的几个按钮,只是想屏蔽左上角控制菜单。
2023-03-27 15:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
去掉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
2023-03-27 15:32
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
试了一下,删除菜单也会将右上角的按钮删除掉。
只好拦截点击图标消息和右击标题消息。顶层表单右击标题会弹出菜单,不是顶层表单好像没有。
程序代码:
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


2023-03-27 16:31
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用吹水佬在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


噢,原来是这样!又学了一招!
非常感谢吹版!
2023-03-27 16:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511691-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.247980 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved