C++ PS中 .r文件编写界面加入的图片和图标时,需要切换图标显示状态

老师好,我用.r文件画了几个5个按钮,停靠在PS属性栏下方。

我想实现选中某按钮后会出现蓝色边框来区别选中后的状态,类似于下图的钢筋选择按钮,选中后有一个蓝色边框标识,请大佬指教如何实现

DialogBoxRsc DIALOGID_LEVELPalette =
{

#if defined (MSVERSION) && (MSVERSION >= 0x550)
DIALOGATTR_TOOLBOXCOMMON,
#else
DIALOGATTR_DEFAULT | DIALOGATTR_NORIGHTICONS | DIALOGATTR_AUTOOPEN,
#endif
XC, YC, NOHELP, LHELPCMD, HOOKID_DialogDemo, NOPARENTID, TXT_Frame,
{
#if defined (MSVERSION) && (MSVERSION >= 0x550)
{{0, 0, 0, 0}, ToolBox, ICONCMDFRAMEID_DialogDemo, ON, 0, "", ""},
#else
{{0, 0, 0, 0}, IconCmdFrame, ICONCMDFRAMEID_DialogDemo, ON, 0, "", ""},
#endif
}
};


#if defined (MSVERSION) && (MSVERSION >= 0x550)
DItem_ToolBoxRsc ICONCMDFRAMEID_DialogDemo =
{
NOHELP, LHELPCMD, NOHOOK, NOARG, 0, "",
{
{{ 0, 0, 0, 0}, IconCmd, ICONCMDID_DialogDemo1, ON, 0, "", "owner=\"LEVELTOOLS\""},
{{ 0, 0, 0, 0}, IconCmd, ICONCMDID_DialogDemo2, ON, 0, "", "owner=\"LEVELTOOLS\""},
{{ 0, 0, 0, 0}, IconCmd, ICONCMDID_DialogDemo3, ON, 0, "", "owner=\"LEVELTOOLS\""},
{{ 0, 0, 0, 0}, IconCmd, ICONCMDID_DialogDemo4, ON, 0, "", "owner=\"LEVELTOOLS\""},
{{ 0, 0, 0, 0}, IconCmd, ICONCMDID_DialogDemo5, ON, 0, "", "owner=\"LEVELTOOLS\""},
}
};
#else
DItem_IconCmdFrameRsc ICONCMDFRAMEID_DialogDemo =
{
2, 3, NOHELP, LHELPCMD, NOHOOK,"",
{
{IconCmd, ICONCMDID_DialogDemo1},
{IconCmd, ICONCMDID_DialogDemo2},
{IconCmd, ICONCMDID_DialogDemo3},
{IconCmd, ICONCMDID_DialogDemo4},
{IconCmd, ICONCMDID_DialogDemo5},
}
};
#endif

DItem_IconCmdRsc ICONCMDID_DialogDemo1 =
{
NOHELP, OHELPTASKIDCMD, 0, CMD_MAINREBAR_LEVEL, OTASKID , "1", ""
#if defined (MSVERSION) && (MSVERSION >= 0x550)
}
extendedAttributes
{{
{EXTATTR_FLYTEXT, TXT_Flyover_DialogDemo1},
{EXTATTR_BALLOON, TXT_Balloon_DialogDemo1},
}
#endif
};


IconCmdSmallRsc ICONCMDID_DialogDemo1 =
{
23, 23, FORMAT_MONOBITMAP, BLACK_INDEX, "",
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x02, 0x02,
0x04, 0x02, 0x00, 0x10, 0x02, 0x3c, 0x40, 0x01,
0xce, 0x00, 0x06, 0x06, 0x00, 0x08, 0x04, 0x01,
0xd0, 0x0b, 0x80, 0x30, 0x30, 0x00, 0x30, 0xc0,
0x00, 0x33, 0x00, 0x02, 0x24, 0x40, 0x08, 0x78,
0x40, 0x20, 0x90, 0x40, 0x01, 0xe0, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
}
};

IconCmdLargeRsc ICONCMDID_DialogDemo1 =
{
31, 31, FORMAT_MONOBITMAP, BLACK_INDEX, "",
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01,
0x01, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01,
0x1f, 0x88, 0x00, 0x00, 0x61, 0x80, 0x00, 0x01,
0x81, 0x80, 0x00, 0x02, 0x01, 0x00, 0x00, 0xf4,
0x02, 0xe0, 0x00, 0x08, 0x04, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00, 0x18, 0x60, 0x00, 0x01, 0x19,
0x88, 0x00, 0x04, 0x12, 0x08, 0x00, 0x10, 0x24,
0x08, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x90,
0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x01, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
}
};


DItem_IconCmdRsc ICONCMDID_DialogDemoPal1Sub1 =
{
NOHELP, OHELPTASKIDCMD, 0, NOCMD, OTASKID , "", ""
#if defined (MSVERSION) && (MSVERSION >= 0x550)
}
extendedAttributes
{{
{EXTATTR_FLYTEXT, TXT_Flyover_DialogDemoPal1Sub1},
{EXTATTR_BALLOON, TXT_Balloon_DialogDemoPal1Sub1},
}
#endif
};

IconCmdSmallRsc ICONCMDID_DialogDemoPal1Sub1 =
{
23, 23, FORMAT_MONOBITMAP, BLACK_INDEX,
"Pal 1 Sub 1 SM",
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0x10, 0x00, 0x80, 0x20, 0x01, 0x00,
0x40, 0x02, 0x00, 0x80, 0x04, 0x01, 0x00, 0x08,
0x02, 0x00, 0x10, 0x04, 0x00, 0x20, 0x08, 0x00,
0x40, 0x10, 0x00, 0x80, 0x20, 0x01, 0x00, 0x40,
0x02, 0x00, 0x80, 0x04, 0x01, 0x00, 0x08, 0x02,
0x00, 0x10, 0x04, 0x00, 0x20, 0x08, 0x00, 0x40,
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00,
}
};

IconCmdLargeRsc ICONCMDID_DialogDemoPal1Sub1 =
{
31, 31, FORMAT_MONOBITMAP, BLACK_INDEX,
"Pal 1 Sub 1 LG",
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x3c, 0x00,
0x5c, 0x00, 0xb8, 0x00, 0xb8, 0x01, 0x70, 0x02,
0x70, 0x04, 0xe0, 0x08, 0xe0, 0x11, 0xc0, 0x01,
0xc0, 0x03, 0x80, 0x03, 0x80, 0x07, 0x00, 0x07,
0x00, 0x0e, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x1c,
0x00, 0x38, 0x00, 0x38, 0x00, 0x70, 0x00, 0x70,
0x00, 0xe0, 0x00, 0xe0, 0x01, 0xc0, 0x01, 0xc0,
0x03, 0x80, 0x03, 0x80, 0x07, 0x00, 0x07, 0x00,
0x0e, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x1c, 0x00,
0x38, 0x00, 0x38, 0x00, 0x70, 0x00, 0x70, 0x00,
0xe0, 0x00, 0xe0, 0x01, 0xc0, 0x01, 0xc0, 0x03,
0x80, 0x03, 0x80, 0x07, 0x00, 0x07, 0x00, 0x0e,
0x00, 0x0e, 0x00, 0x1c, 0x01, 0xff, 0xc1, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
}
};

Parents
  • 实现选择工具中的如下效果是否满足您的要求?



  • 您好  这样也可以满足要求,只要能区分是否点过就行,请大佬指导一下谢谢

  • 我发现选择工具并不能停靠在PS下方的属性栏中

    这个停靠功能不是通过控制控件来实现的,而是将多个控件放到一个叫做DItem_ToolBoxRsc的工具栏资源中实现的。这种工具栏可以任意停靠。

    如上图中的视图按钮使用的是哪种控件呢

    这个不太容易实现,内部完全是通过硬编码去做的。在ToolBox资源中使用了Generic控件类型。

    DItem_GenericRsc GENERICID_ViewToggles = 
    {
    NOHELP, MHELPTOPIC, HOOKITEMID_ViewToggles, 0
    }
    ...

    }};

    在钩子函数中主要调用了mdlDialog_rectDrawBeveledCD硬是在对话框上去画的矩形,用mdlWindow_textDrawTransparent在对话框上写的视图号。

    您的几个按钮之间是否有互斥关系?如果有的话,还是采用前面说的ButtonGroup比较合适,在一个group中只能有一个按钮被按下。如果您的几个按钮之间没有互斥关系的话,才需要像这个ViewToggles这样来做。



  • 老师上午好,我这几个按钮没有互斥的关系,5个按钮分别代表不同的图层。首次点击其中某个按钮代表隐藏对应图层,再次点击该按钮代表显示图层。正如您所说的,我使用了DItem_ToolBoxRsc已经完成了按钮的显示及隐藏功能,并且可以停靠(如提问中给出的代码),尽管能够实现显示及隐藏的功能,但在按钮图标上来看不能区分,所以希望第一次按下按钮,按钮能够改变颜色,再次按下按钮,按钮能够恢复颜色。

  • 如果模仿系统内部的这个Generic控件实现起来工作量太大。我的建议是,退而求其次,直接用现成的ToggleButton按钮。

    有对勾表示层显示,无对勾表示层隐藏。文字部分写上层的名称即可。

    或者,改用ToggleIcon控件也可以的。



  • 符老师,请问ToggleIcon控件有使用案例吗,不清楚他如何使用,在论坛里搜到的很少,ToggleIcon图片的加载方式是与IconCmd一致吗

  • 该控件并无特别之处。举例如下:
    1、在DialogBox或ToolBox中定义其item list specification如下:

    {{XC, YC, 0, 0}, ToggleIcon, TOGGLEID_Distance, ON, 0, "", ""},

    2、定义其item resource specification如下。其中引用了ICONID_Distance_15X15

    DItem_ToggleIconRsc TOGGLEID_Distance =
        {
        NOCMD, MCMD, NOSYNONYM, NOHELP, MCMD, NOHOOK, NOARG,
        NOMASK, NOINVERT, 0, ICONID_Distance_15x15, RTYPE_Icon,
        "",""
        }
    extendedAttributes
        {
    {
    {EXTATTR_FLYTEXT, TXT_Flyover_Distance},
    {EXTATTR_BALLOON, TXT_Balloon_Distance},
    }
        };

    3、继续定义ICONID_Distance_15X15的资源如下:

    IconRsc ICONID_Distance_15x15 =
        {
        15, 15, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "AccudrawDistance"
        };

    这里是通过Icon的名称AccudrawDistance来表示图标名的。您需要在您DGNLIB中插入这个名称的Ico文件进来,或者将您ICO文件打包成一个rsc文件放到系统的C:\Program Files\Bentley\MicroStation CONNECT Edition\MicroStation\Icons文件夹下。目前该文件夹下有ustnicons.rsc文件,该资源文件中包含了上千个MS中用到的图标资源。



Reply
  • 该控件并无特别之处。举例如下:
    1、在DialogBox或ToolBox中定义其item list specification如下:

    {{XC, YC, 0, 0}, ToggleIcon, TOGGLEID_Distance, ON, 0, "", ""},

    2、定义其item resource specification如下。其中引用了ICONID_Distance_15X15

    DItem_ToggleIconRsc TOGGLEID_Distance =
        {
        NOCMD, MCMD, NOSYNONYM, NOHELP, MCMD, NOHOOK, NOARG,
        NOMASK, NOINVERT, 0, ICONID_Distance_15x15, RTYPE_Icon,
        "",""
        }
    extendedAttributes
        {
    {
    {EXTATTR_FLYTEXT, TXT_Flyover_Distance},
    {EXTATTR_BALLOON, TXT_Balloon_Distance},
    }
        };

    3、继续定义ICONID_Distance_15X15的资源如下:

    IconRsc ICONID_Distance_15x15 =
        {
        15, 15, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "AccudrawDistance"
        };

    这里是通过Icon的名称AccudrawDistance来表示图标名的。您需要在您DGNLIB中插入这个名称的Ico文件进来,或者将您ICO文件打包成一个rsc文件放到系统的C:\Program Files\Bentley\MicroStation CONNECT Edition\MicroStation\Icons文件夹下。目前该文件夹下有ustnicons.rsc文件,该资源文件中包含了上千个MS中用到的图标资源。



Children