| MdlFunctionP | mdlWindow_setFunction |
| ( | |
| int | type , |
| MdlFunctionP | function |
| ); type : The type parameter sets which type of mdlWindow_... notification function is being set by the call to mdlWindow_setFunction. This parameter can be either WINDOW_MODIFYEVENTS (window is shown on the screen or hidden, size changes, or stacking order changes) or WINDOW_SCROLLEVENTS (window's contents are scrolled). WINDOW_MODIFYEVENTS : ウインドウが画面上に表示または非表示の変更、サイズ変更、など。 WINDOW_SCROLLEVENTS :ウィンドウの内容がスクロールされる 例文を見てみましょう。 要望:ウインドウで表示しているViewにより、DropLiast中に選択できるViewも変更できるようにする。
何と言いたいのは、以下の図を見てくださいね。
ActiveしているViewは1だけので、選択肢に1だけを活性してます。
もし、1,2,4のViewがActiveになっていて、選択肢に1,2,4を選択できるよになります。
========================================================================
Src Codeをざっくりと説明します。
①ダイアログをOpenして、Startするとき、いかのMDLの処理を追加してください。
Private void cmdSTART(void)
cmdNumber CMD_LIUBINTEST_START { mdlState_startPrimitive(NULL,NULL,1,1); mdlState_setFunction(STATE_COMMAND_CLEANUP, cleanup); mdlWindow_setFunction(WINDOW_MODIFYEVENTS, windowModifyFunc); EnableSet();
mdlInput_sendKeyin("LIUBINTEST SCAN", 0, INPUTQ_EOQ, NULL);
}
② windowModifyFuncを説明いたします。
Private void windowModifyFunc
( MSWindow *window, /* => window that event applies to */ int eventType, /* => type of event */ BSIRect *oldGlobalP /* => old global rectangle */ ) { int viewNo;
if (mdlWindow_isView(&viewNo,(MSWindow *)window)
&& (eventType == WINDOW_SHOWEVENT || eventType == WINDOW_ORDEREVENT || eventType == WINDOW_HIDEEVENT || eventType==WINDOW_MINIMIZEEVENT))
{ _viewNo = viewNo;
_eventType = eventType; mdlDialog_cmdNumberQueue(TRUE, CMD_LIUBINTEST_VIEW, NULL, TRUE); } return; }
eventType :Windowのイベントです。表示、順番変更、非表示、最小限などですね。
③ CMD_LIUBINTEST_VIEWのロジックです。
Private void cmdView(void) /*
=====================================================================================*/ cmdNumber CMD_LIUBINTEST_VIEW { DialogItem *diP; int ic, sic;
{ if (mdlView_isActive(_viewNo)) →Activeかどうか判断
{
// これはリストの表示制御です。
// _OptionrawItemP 引数は④で紹介します。
mdlDialog_optionButtonSetEnabled(_OptionrawItemP, _viewNo, TRUE);
} else if (_eventType == WINDOW_ORDEREVENT || _eventType == WINDOW_HIDEEVENT || _eventType == WINDOW_MINIMIZEEVENT) { mdlDialog_optionButtonSetEnabled(_OptionrawItemP, _viewNo, FALSE); if (_u40Sleeve2CSVDlg.View == _viewNo) { for (ic = 0, sic = -1; ic < _viewNo; ic++) { if(mdlView_isActive(ic)) sic = ic; }
if (sic != -1) _uLiuBinTestDlg.View = sic;
else { for (ic = _viewNo; ic < MAX_VIEWS; ic++) { if(mdlView_isActive(ic)) sic = ic; }
if (sic != -1) _uLiuBinTestDlg.View = sic;
else return; } }
if (diP = mdlDialog_itemGetByTypeAndId(mdlDialog_getToolSettings(), RTYPE_OptionButton, OPTIONBUTTONID_LIUBINTEST_VIEW, 0))
mdlDialog_itemSynch(mdlDialog_getToolSettings(), diP->itemIndex); } } }
④_OptionrawItemP 引数を紹介します。
この変数はOptionボタンの項目ですね。Hook関数に書いています。
Private void optionHook(DialogItemMessage *dimP) /*
================================================================================ */ { int i;
dimP->msgUnderstood = TRUE;
switch (dimP->messageType) { case DITEM_MESSAGE_CREATE: /* -------------------------------- */ break;
case DITEM_MESSAGE_INIT: /*
--------------------------------------------*/ _u40Sleeve2CSVDlg.View = -1; for(i=0;i _OptionrawItemP = dimP->dialogItemP->rawItemP; }
if(mdlView_isActive(tcb->lstvw))
{ _uLiuBinTestDlg.View = i; } else { for(i=0;i { _uLiuBinTestDlg.View = i; break; } } } break;
case DITEM_MESSAGE_SETSTATE:
break;
case DITEM_MESSAGE_STATECHANGED:
if( dimP->u.stateChanged.reallyChanged ) { mdlInput_sendKeyin("LIUBINTESTSCAN", 0, INPUTQ_EOQ, NULL); } break;
case DITEM_MESSAGE_RELOADDATA:
break;
case DITEM_MESSAGE_DESTROY:
break;
default:
dimP->msgUnderstood = FALSE; break; } }
⑤OPTIONBUTTONID_LIUBINTEST_VIEW
これはDlg中のOPTIONBUTTONIDです。IDです。識別子ですね。
以上の処理を付ければ、要望を実現することができると思います。
メモです。
| |
2016年8月30日星期二
[Mstn PureMDL] mdlWindow_setFunction 捕捉打开窗口的变化
订阅:
博文评论 (Atom)
没有评论:
发表评论