2016年8月30日星期二

[Mstn PureMDL] mdlWindow_setFunction  捕捉打开窗口的变化

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   { mdlDialog_optionButtonSetEnabled(dimP->dialogItemP->rawItemP,i,mdlView_isActive(i));
    _OptionrawItemP = dimP->dialogItemP->rawItemP;
   }
   if(mdlView_isActive(tcb->lstvw))
   { _uLiuBinTestDlg.View = i;
   }
   else
   { for(i=0;i    { if(mdlView_isActive(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です。識別子ですね。





以上の処理を付ければ、要望を実現することができると思います。

メモです。







没有评论:

发表评论