我们在使用MicroStation软件时会遇到类似选择工具和放置单元这样的对话框,就是在右下角有一个小的冲下的箭头,点击该箭头能展开更多的内容。展开后这个小箭头变成了冲上的了,再次点击该冲上的箭头又能将这些内容收起来。如下图所示:
那么如何通过编程实现这种效果呢?下面以我自己的一个对话框为例为您描述实现的详细过程。最后实现的效果请看如下视频:
基本原理就是给这个小箭头挂上钩函数,在钩函数中显示或隐藏相关的控件(MDL的.r中叫做item,也被翻译成条目)即可。
1、在头文件(.h)中定义相关控件和钩函数的ID如下:
#define DIALOGID_DemoExtend 6 #define COMBOBOXID_States 1 #define LISTBOXID_DialogDemo 1 #define ICONID_MyShowExtended 20010 #define ICONID_MyHideExtended 20011 #define HOOKITEMID_ExpandTool 6
2、在资源文件(.r)中定义如下资源:
DialogBoxRsc DIALOGID_DemoExtend = { DIALOGATTR_DEFAULT, 51*XC, 17*YC, NOHELP, LHELP, NOHOOK, NOPARENTID, "Demo Extend Tool", { {{ 5*XC, 0.5*YC, 20*XC, 0}, ComboBox, COMBOBOXID_States, ON, 0, "", ""}, {{47*XC, 0.5*YC, 0, 0}, IconCmdX, ICONID_MyShowExtended, ON, 0, "", ""}, {{47*XC, 0.5*YC, 0, 0}, IconCmdX, ICONID_MyHideExtended, ON|HIDDEN, 0, "", ""}, {{ 0, 4.5*YC, 49*XC, 0}, ListBox, LISTBOXID_DialogDemo, ON|HIDDEN, 0, "", ""}, }} extendedIntAttributes {{ {EXTINTATTR_DLOGATTRS, DIALOGATTRX_NOMINIMIZEBOX} } }; DItem_IconCmdXRsc ICONID_MyShowExtended = { NOHELP, MHELP, HOOKITEMID_ExpandTool, NOARG, 0, ICONID_MyShowExtended, "", "" }; DItem_IconCmdRsc ICONID_MyShowExtended = { NOHELP, MHELP, ICONCMDATTR_DONTSINGLESHOT, NOCMD, OTASKID, "", "" } extendedAttributes {{ {EXTATTR_FLYTEXT, "展开更多属性"}, {EXTATTR_BALLOON, "展开更多属性"}, }}; IconCmdSmallRsc ICONID_MyShowExtended = { 11, 11, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "ShowOptions" }; IconCmdLargeRsc ICONID_MyShowExtended = { 11, 11, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "ShowOptions" }; DItem_IconCmdXRsc ICONID_MyHideExtended = { NOHELP, MHELP, HOOKITEMID_ExpandTool, NOARG, 0, ICONID_MyHideExtended, "", "" }; DItem_IconCmdRsc ICONID_MyHideExtended = { NOHELP, MHELP, ICONCMDATTR_DONTSINGLESHOT, NOCMD, OTASKID, "", "" } extendedAttributes {{ {EXTATTR_FLYTEXT, "收起更多属性"}, {EXTATTR_BALLOON, "收起更多属性"} }}; IconCmdSmallRsc ICONID_MyHideExtended = { 11, 11, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "HideOptions" }; IconCmdLargeRsc ICONID_MyHideExtended = { 11, 11, ICONFORMAT_WINDOWS, BLACK_INDEX, "", "HideOptions" };
【说明】:
3、在源代码文件(.cpp)的MdlMain函数中关联钩函数ID和具体的钩函数:
DialogHookInfo uHooks[] = { ...... { HOOKITEMID_ExpandTool, (PFDialogHook)extendTool_IconCmdXHook}, }; extern "C" DLLEXPORT void MdlMain(int, WCharCP[]) { mdlResource_openFile (&g_rscFileH, NULL, RSC_READONLY); mdlSystem_registerCommandNumbers (cmdNumbers); mdlParse_loadCommandTable(NULL); mdlDialog_hookPublish(sizeof(uHooks) / sizeof(DialogHookInfo), uHooks); ...... }
4、在源代码文件中编写核心函数extendTool_IconCmdXHook如下:
/*-------------------------------------------------------- | demoExtend +-------------------------------------------------------*/ void demoExtend(WCharCP unparsed) { MSDialog::Open(NULL, DIALOGID_DemoExtend); } bool bExtendState = false; void hideShowItems(MSDialogP pDb, bool bShowItems) { DialogItemP showDiP = pDb->GetItemByTypeAndId(RTYPE_IconCmdX, ICONID_MyShowExtended, 0); DialogItemP hideDiP = pDb->GetItemByTypeAndId(RTYPE_IconCmdX, ICONID_MyHideExtended, 0); DialogItemP myListDiP = pDb->GetItemByTypeAndId(RTYPE_ListBox, LISTBOXID_DialogDemo, 0); if (bShowItems) { showDiP->Hide(); hideDiP->Show(); myListDiP->Show(); } else { myListDiP->Hide(); hideDiP->Hide(); showDiP->Show(); } mdlDialog_adjustPopDownHeight(pDb); } void extendTool_IconCmdXHook(DialogItemMessageP dimP) { dimP->msgUnderstood = true; switch (dimP->messageType) { case DITEM_MESSAGE_ALLCREATED: { if (dimP->dialogItemP->id == ICONID_MyShowExtended) break; hideShowItems(dimP->db, bExtendState); break; } case DITEM_MESSAGE_QUEUECOMMAND: { bExtendState = !bExtendState; hideShowItems(dimP->db, bExtendState); dimP->u.queueCommand.hookHandled = true; break; } default: dimP->msgUnderstood = false; } }
【说明】: