关于工具框设计问题

符老师你好:

  请问一下:我想设计一个类似于“选取集”的工具,该工具包含3-4个子工具,类似于圆圈-1,还有一个类似于圆圈-2的显示扩展设置按钮,不知如何操作?

  例子目录中有类似的例子吗?如何没有,能否给一个简单的.r文件供参考一下,谢谢!

Parents
  • .r中可以支持如下类别的控件(MDL中叫item):

    Button Group Item
    Color Chooser Item
    Color Picker Item
    ComboBox Item
    Container Item
    ContainerPanelItem
    Icon and IconCommand
    Icon and IconFrame
    IconPopupItem
    Label Item
    LevelList Item
    ListBox Item
    MenuBar Item
    LineText Item
    OptionButton Item
    Option Pulldown Menu Item
    PushButton Item
    RadioButton Item
    SashItem
    ScaleItem
    ScrollBar Item
    SpinBox Item
    TabPageList Item
    Text Item
    TextPull-downMenu Item
    ToolBox Item
    ToggleButton Item
    ToggleIcon Item
    Tree Item

    您所说的1采用的就是第一种ButtonGroup控件。大致写法如下:

    DItem_ButtonGroupRsc BGROUPID_MethodIcons =
        {
        NOSYNONYM, NOHELP, MHELP,
        HOOKITEMID_MethodType, NOARG,
        DIALOGATTR_MOTIONTOITEMS, 5, 1, 0, 0, WHITE_INDEX,
        TXT_PSelectMethodLabel,
        "powerSelectInfo.prefs.currSelBy",
    {
    {Icon, ICONID_SelectSingle,     CMD_POWERSELECTOR_SINGLE,       LCMD, SELBY_individual, NOMASK, 0, 0, TXT_Flyover_PSelectIndividual},
    {Icon, ICONID_SelectBlock,      CMD_POWERSELECTOR_AREA_BLOCK,   LCMD, SELBY_rectangle,  NOMASK, 0, 0, TXT_Flyover_PSelectRectangle},
    {Icon, ICONID_SelectShape,      CMD_POWERSELECTOR_AREA_SHAPE,   LCMD, SELBY_shape,      NOMASK, 0, 0, TXT_Flyover_PSelectShape},
    {Icon, ICONID_SelectCircle,     CMD_POWERSELECTOR_AREA_CIRCLE,  LCMD, SELBY_circle,     NOMASK, 0, 0, TXT_Flyover_PSelectCircle},
    {Icon, ICONID_SelectLine,       CMD_POWERSELECTOR_LINE,         LCMD, SELBY_line,       NOMASK, 0, 0, TXT_Flyover_PSelectLine},
    }
        };

    2的效果实现起来比较复杂,完全是靠一个钩子函数在起作用。先设计了一个冲下的小Icon按钮,点击该按钮后钩子函数将扩展的一些item的状态由隐藏设置为显示,然后调用一下mdlDialog_toolSettingsAdjustWidthAndHeight就能让工具设置对话框的大小发生自适应改变。同时需要将那个冲下的小Icon隐藏,显示一个冲上的小Icon按钮。如果您的下拉items不是太多的话,不建议这么做,直接放上来就可以了。有这个下拉框其实对初学者反而不利,往往找不到想要的功能。



    Answer Verified By: mz z 

  • 符老师你好!

    还得问你几个问题:

    对于ICONID_SelectSingle标识符,有几种不同的格式:ICONFORMAT_MONO、ICONFORMAT_FIXEDCOLORS、 ICONFORMAT_WINDOWSBMP、ICONFORMAT_WINDOWSICO、ICONFORMAT_WINDOWS

    请问:1 对于ICONFORMAT_MONO格式,以前V8版本有iconedit.ma可以制作,CE版没有这个ma了,请问如何才能制作自己的单色Icon?

               2 对于其他格式,请简单讲解一下,如:

    IconRsc ICONCMDID_BrowseFile =
        {
        16, 16, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "Browse"    //Browse 是什么?如何才能得到!
        };

    IconRsc ICONID_RadioBtnOptions =
        {
        12,    12,    ICONFORMAT_FIXEDCOLORS,    BLUE_INDEX, "",
            {
            11,11,11, 9, 9, 9, 9, 9,11,11,11,11,        // 如何得到这些值?
            11, 9, 9, 9, 0, 0, 0, 9, 9, 9,11,11,
            11, 9, 0, 0, 1, 1, 1, 1, 4, 9,11,11,
             9, 9, 0, 6, 6, 6, 6, 6, 4, 9, 9, 7,
             9, 0, 1, 6, 0, 0, 0, 6, 4,11, 9, 7,
             9, 0, 1, 6, 0,11, 0, 6, 4,11, 9, 7,
             9, 0, 1, 6, 0, 0, 0, 6, 4,11, 9, 7,
             9, 9, 1, 6, 6, 6, 6, 6, 4, 9, 9, 7,
            11, 9, 4, 4, 4, 4, 4, 4, 4, 9, 7,11,
            11, 9, 9, 9,11,11,11, 9, 9, 9, 7,11,
            11,11, 7, 9, 9, 9, 9, 9, 7, 7,11,11,
            11,11,11, 7, 7, 7, 7, 7, 7,11,11,11,
            }
        };   

Reply
  • 符老师你好!

    还得问你几个问题:

    对于ICONID_SelectSingle标识符,有几种不同的格式:ICONFORMAT_MONO、ICONFORMAT_FIXEDCOLORS、 ICONFORMAT_WINDOWSBMP、ICONFORMAT_WINDOWSICO、ICONFORMAT_WINDOWS

    请问:1 对于ICONFORMAT_MONO格式,以前V8版本有iconedit.ma可以制作,CE版没有这个ma了,请问如何才能制作自己的单色Icon?

               2 对于其他格式,请简单讲解一下,如:

    IconRsc ICONCMDID_BrowseFile =
        {
        16, 16, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "Browse"    //Browse 是什么?如何才能得到!
        };

    IconRsc ICONID_RadioBtnOptions =
        {
        12,    12,    ICONFORMAT_FIXEDCOLORS,    BLUE_INDEX, "",
            {
            11,11,11, 9, 9, 9, 9, 9,11,11,11,11,        // 如何得到这些值?
            11, 9, 9, 9, 0, 0, 0, 9, 9, 9,11,11,
            11, 9, 0, 0, 1, 1, 1, 1, 4, 9,11,11,
             9, 9, 0, 6, 6, 6, 6, 6, 4, 9, 9, 7,
             9, 0, 1, 6, 0, 0, 0, 6, 4,11, 9, 7,
             9, 0, 1, 6, 0,11, 0, 6, 4,11, 9, 7,
             9, 0, 1, 6, 0, 0, 0, 6, 4,11, 9, 7,
             9, 9, 1, 6, 6, 6, 6, 6, 4, 9, 9, 7,
            11, 9, 4, 4, 4, 4, 4, 4, 4, 9, 7,11,
            11, 9, 9, 9,11,11,11, 9, 9, 9, 7,11,
            11,11, 7, 9, 9, 9, 9, 9, 7, 7,11,11,
            11,11,11, 7, 7, 7, 7, 7, 7,11,11,11,
            }
        };   

Children
  • CE中确实没再保留IconEdit.ma,我是安装了一个低版本的MS在使用它。

    CE中推荐使用ICONFORMAT_WINDOWSBMP和ICONFORMAT_WINDOWSICO,可以用市面上流行的制作Icon的工具设计自己的小Icon。

    这些外部的ICO文件如何被我们所用?一种方式是嵌入DGNLIB中,就像我们定义Ribbon界面中的工具那样。

    对于程序中使用到的Icon,是以ICO文件名的方式在搜索的,搜索的途径有如下三种(三个配置变量):

    • MS_ICONLIBRARYLIST列出了ICO文件所在的DLL文件的路径;此种情况下适合于我们将ICO文件直接嵌入到DLL中
    • MS_ICONPATH列出了直接搜索ICO文件的路径,此种情况就需要我们把ICO文件放到这些路径下
    • MS_ICONRSCLIST列出了ICO文件所在的资源文件路径,需要我们将多个ICO文件打包成资源文件。用SDK的bin目录下的wiconpackager.exe可将多个ICO文件打包成一个rsc

    其实这种使用方式早在我2007年(当时的软件版本还是MSV8XM,即08.09.xx.xx)的BDN培训课程中就讲过了,疑惑的是直到如今SDK中也没有带有这样的一个例子。利用ICONFORMAT_WINDOWSBMP和ICONFORMAT_WINDOWSICO的Icon资源写法如下:



  • 【MS_ICONLIBRARYLIST列出了ICO文件所在的DLL文件的路径;此种情况下适合于我们将ICO文件直接嵌入到DLL中】

        ---- 我在项目的dll中直接嵌入了.ico图标,但是只有IDI_ICON1标识号、没有名字,我如何使用该Icon?

    【MS_ICONPATH列出了直接搜索ICO文件的路径,此种情况就需要我们把ICO文件放到这些路径下】

       --- 这些Icon文件的后缀名就是*.ico吗?

    【MS_ICONRSCLIST列出了ICO文件所在的资源文件路径,需要我们将多个ICO文件打包成资源文件。用SDK的bin目录下的wiconpackager.exe可将多个ICO文件打包成一个rsc】

        --- 我将打包后的rsc文件组合到我自己的ma文件中可以吗?

    谢谢符老师!

  • 我在项目的dll中直接嵌入了.ico图标,但是只有IDI_ICON1标识号、没有名字,我如何使用该Icon?

    IconID和ICO文件名的关联是通过定义IconRsc实现的。比如:

    IconRsc ICONID_SelectBlock =
        {
        16, 16, ICONFORMAT_WINDOWS, BLACK_INDEX, "Block", "SelectionBlock"
        };

    IconID是ICONID_SelectBlock,ICO文件名就是SelectionBlock.ico(即IconRsc资源定义中的最后一个字符串字段就是文件名)。由于这里指定格式是ICONFORMAT_WINDOWS,该格式能同时指出BMP或ICO,所以,存在SelectionBlock.bmp也是可以的。

    这些Icon文件的后缀名就是*.ico吗?

    决定于你IconRsc定义中指定的文件格式。如果是ICONFORMAT_WINDOWSICO,则一定会去找ICO格式的文件;如果是ICONFORMAT_WINDOWSBMP,则一定会去找BMP格式的文件;如果是ICONFORMAT_WINDOWS,则两种格式都可以。

    我将打包后的rsc文件组合到我自己的ma文件中可以吗?

    Good question。这个你先自行测试一下。我抽空也会测试的。



  • 符老师:

      你说的2、3方法已试验通过,现在就剩下第一种方法了,如何得到每一个(或项目所在的)dll文件的Icon?

    由于dll文件中只有IDI_ICON1标识ID号、没有名字,我试了多种方法无果。

  • 抱歉,我对DLL的测试也没有通过,不过将ICO添加到ma中是可以的。需要设置MS_ICONRSCLIST指向mdlapps\*.ma



    Answer Verified By: mz z