如何让MFC对话框中的Menu菜单变灰或恢复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让MFC对话框中的Menu菜单变灰或恢复相关的知识,希望对你有一定的参考价值。

参考技术A CMenu::EnableMenuItem

UINT EnableMenuItem( UINT nIDEnableItem, UINT
nEnable );

返回值:
返回以前的状态(MF_DISABLED, MF_ENABLED,
或MF_GRAYED),如果无效,则返回-1。

参数:
nIDEnableItem 指定由nEnable决定的将要有效的菜单项。该参数既可以指定弹出菜单项,也可以指定标准菜单项。

nEnable 指定了将要进行的动作。它可以是MF_DISABLED, MF_ENABLED,或MF_GRAYED与
MF_BYCOMMAND或MF_BYPOSITION的组合。这些值通过位与操作进行组合。这些值有下列含义:
·
MF_BYCOMMAND
指定参数给出已存在的菜单项的命令ID号。此为缺省值。
·
MF_BYPOSITION
指定参数给出已存在菜单项的位置。第一项所在的位置是0。
·
MF_DISABLED
使菜单项无效,以便它不能被选择,但不变灰。
·
MF_ENABLED
使菜单项有效,以便它能够被选择,并可从变灰的状态中恢复出来。
·
MF_GRAYED
使菜单项无效,以便它不能被选择并同时变灰。

说明:
使菜单项有效、无效或变灰。CreateMenu,InsertMenu,ModifyMenu和LoadMenuIndirect成员函数同时也设置菜单项的状态(有效、无效、或变灰)。
使用MF_BYPOSITION的值需要应用恰当的CMenu对象。若菜单条的CMenu被使用,那么顶层菜单项(菜单条中的某项)将受影响。如果为了在弹出菜单或嵌套的弹出菜单中通过位置来设置项的状态,那么应用必须指定弹出菜单的CMenu。
当应用指定了MF_BYCOMMAND标志,那么Windows将检测所有的属于CMenu的弹出菜单项。因此,除非当前正在复制菜单项,那么使用菜单条的CMenu是非常有效的。

选择相邻元素时,QML ListView变灰或删除元素的文本

【中文标题】选择相邻元素时,QML ListView变灰或删除元素的文本【英文标题】:QML ListView greys out or removes text of element when adjacent element is selected 【发布时间】:2017-04-21 18:30:28 【问题描述】:

所以在测试我的程序时,我发现了最奇怪的事情。

所以,我有一个带有自定义 C++ 模型的 ListView 元素和一个相当简单的委托。每个委托都是一个 MyButton 类,它只是一个 Text 类 (z:2)、一个 Image 类 (z:1) 和一个 MouseArea 类。该 Image 类是背景,包含一个半透明图像,当 MouseArea 为 onPressed() 时,该图像变得不透明。

现在是奇怪的部分。

当 ListView 有 4 个元素时,它正常运行 - 除非用户选择条目 #3,然后选择条目 #2 或 #1。

当所选条目从 #3->#1 变为灰色时,条目 #2 中的文本将变为灰色,而不是正常的白色。 当所选条目从#3->#2 开始时,条目#2 中的文本完全消失。

经过数小时的测试和头撞桌子后,我发现了更多:

MyButton 或其任何子项的不透明度永远不会改变。 MyButton 文本元素的颜色永远不会改变 MyButton 的测试元素的内容永远不会改变 在将文本部分偏移到 MyButton 之外后,这种异常行为只会影响剩余在 MyButton 子图像边界内的文本。 MyButton 或其任何子项的 Z 水平永远不会改变,尽管它看起来好像 MyButton 的 Image 被放置在其 Text 之上。 另一个图像永远不会放在 MyButton 元素的顶部。如果是这种情况,当从 #3->#1 开始时,您会看到条目 #2 的图像变暗。 ListView 滚动后,一切恢复正常。

当ListView包含4个元素时,异常如下:

当#4->#1:#2 和#3 变灰时 当#4->#2:#2 消失时 当#4->#3:#3 消失时 当#3->#2:#2 消失时 当#3->#1:#2 变灰时

这与重新排序的 MyButton 类中的图像和文本一致,将图像放置在文本上方的 Z 级。然而,z 级别在 MyButton 定义中是强制的,并且在这些事件发生时永远不会创建 onZChanged 信号。

下面是相关代码:

//MyButton:
import QtQuick 2.0

Item 
    id: button
    property string source: ""
    property string source_toggled: source
    property string button_text_alias: ""
    signal pressed
    width: button_image.sourceSize.width
    height: button_image.sourceSize.height
    property bool toggled: false

    Image
        id: button_image
        z: 1
        source: toggled ? parent.source_toggled : parent.source

    
    MyText
        z: 2
        text_alias: button_text_alias
        anchors.centerIn: parent
    

    MouseArea 
        id: button_mouse
        anchors.fill: parent
        onPressed: button.pressed()
    



//ListView:
Component
    id: p_button
    MyButton
        source: picture_path + "bar.png"
        source_toggled: picture_path + "bar_selected.png"
        toggled: model.isCurrent
        onClicked: 
            profile_model.setCurrent(model.index)
        
        button_text_alias: model.display
    

ListView
    id: p_list
    width: 623
    height: count*74 -1
    spacing: 1
    interactive: false
    model: p_model
    delegate: p_button

我想不出任何可能导致这种行为的东西......有什么想法吗?

【问题讨论】:

【参考方案1】:

我能够通过将我的委托分解为:

Component
    id: p_button
    Item
        property bool toggled: model.isCurrent
        width: button_image.sourceSize.width
        height: button_image.sourceSize.height
        Image
            id: button_image
            visible: !toggled
            source: picture_path + "bar.png"
        
        Image
            visible: toggled
            source: picture_path + "bar_selected.png"
        
        MouseArea
            anchors.fill: parent
            onClicked: p_model.setCurrent(model.index)
        
        MyText
            text_alias: model.display
            anchors.centerIn: parent
        
    

因此,不是交换对象的源,而是有两个对象根据布尔值变得可见/不可见。这阻止了这个问题,尽管我仍然不知道原因。

【讨论】:

以上是关于如何让MFC对话框中的Menu菜单变灰或恢复的主要内容,如果未能解决你的问题,请参考以下文章

mfc创建的单文档菜单栏按钮是灰的

vs2008 mfc 如何在对话框中加入一个menu

基于MFC对话框程序中添加菜单栏 (CMenu)

MFC中怎么设置单击菜单弹出对话框?

mfc中怎样在一个基于对话框程序中添加菜单栏 急。。。!

MFC开发