WideStudio/MWT Logo
WideStudio/MWT
Programming Guide
WideStudio/MWT Index
Table of contents


标签事件过程范例



通过鼠标选择标签

以下是最基本的鼠标操作的事件过程范例。 每次单击鼠标时,在标签上就显示点击数。

(*----------------------------------------------------------*)
(*Function for the event procedure                          *)
(*----------------------------------------------------------*)
open Swig
open Mwt
open Mwtlib
(* 在标签实例中设置 WSEV_MOUSE_PRESS(MOUSE-PRESS)触发器 *)
let cbop obj =
  (* (0)如果点击的是鼠标按键1以外的按键,立即返回 *)
   let status = _WSGIappMouse '() -> getMouseStatus() in
     if ( (get_int status) land (get_int _WS_MOUSE_BTN1) ) <> 0 then
       (* (A)获取 userValue 属性值 *)
       let value = obj -> getProperty ( "userValue" ) in begin
         (* (B)累加该属性值 *)
         let value2 = (get_int value) +1 in
         (* (C)显示数值结果 *)
         obj -> setProperty ( "labelString", (make_int value2));
         (* (D)保存修改后的 userValue 属性值 *)
         obj -> setProperty ( "userValue", (make_int value2));
       end;
  ()
let _ = Callback.register "cbop" cbop

首先,在这个事件过程,对WSCvbtn,WSCvlabel 等拥有labelString 属性的项目进行MOUSE-PRESS 触发器设定。 每次鼠标键单击该项目时,该事件过程函数将被启动。事件过程被启动后,以(0)进行鼠标键的判断。如果鼠标键 为1以外,则按钮回车。请参照鼠标键判断的处理方法。

然后,(A)处取得userValue 的属性数字。userValue 属性初始值为0,用户可自由指定初期值并进行保持。 在这里,让项目记忆该数字是为了当多项项目被处理时,不发生各自的标签数字混乱。反过来,使用静态变量等 制作的话,全部的标签可利用同一个计数器进行显示。

然后,(B)处追加点击数,并在(C)进行显示。在(D)中将显示的数字作为userValue的 属性数进行保存,预备 下一个事项过程的启动。

如果触发器适用MOUSE-IN的话,应该可以显示鼠标出入回数。



通过鼠标选择标签

以下,我们试着制作可以选择的标签。当标签被选择时,颜色将发生变化。 这次,使用set/getUserData(函数)代替userValue 属性来保持选择状态。

(* 设置 WSEV_MOUSE_PRESS(MOUSE-PRESS) 触发器 *)
let cbop obj =
  (* (A)通过 getVariantData() 取值 *)
  let value = obj -> getVariantData ( "STATUS" ) in begin
    (* (B) value 值如果是0返回被选择状态,如果是1则返回原来的显示状态 *)
    if get_int (value -> getInt()) = 0 then begin
      (* (C)将原来的颜色值保存在 userString 中 *)
      let color = obj -> getProperty ( "backColor" ) in
      obj -> setProperty ( "userString", (color -> "getCharPtr"()));
      (* (D)设置为被选择状态 *)
      obj -> setProperty("backColor","slateray4");
      (* (E)保存状态 *)
      obj -> setVariantData ("STATUS",1);
    end else begin
      (* (F)获取原来的颜色 *)
      let color = obj -> getProperty ( "userString" ) in
      (* (G)设置为原来的颜色 *)
      obj -> setProperty ( "backColor", (color -> "getCharPtr"()));
      (* (H)保存状态 *)
      obj -> setVariantData ( "STATUS", 0);
    end;
  end;
  ()
let _ = Callback.register "cbop" cbop

在这个事件过程,对WSCvbtn,WSCvlabel 等具用labelString属性的项目,设定MOUSE-PRESS 触发器。

事件过程被启动时,在(A)处取得以setVariantData()函数记忆的数字。set/setVariantData()函数的初始值为0, 用户可自由指定或保持其值。可使用喜欢的名称,用void*进行保持。

然后,在(B)处辨别该值,在(C)处将原来的颜色保存于属性 userString,以便下次显示原来颜色的使用。 (D)处,显示所选择的颜色。(E)处,再次重新保持选择状态。

将颜色恢复到原来状态时,首先在(F)处取得保持的原来颜色,然后在(G)处显示该颜色。 最后在(H)处再次保持选择状态。

制作加亮鼠标标签

以下制作通过鼠标的进入及离开,显示加亮标签的事项过程。 当鼠标进入项目上时,标签加亮;当鼠标离开项目时,标签显示恢复。

这里重要的步骤是,设定鼠标进入时发生的触发器和鼠标出来时发生的触发器。

当事件过程被初始化启动时,可通过设定新事件过程的方法,实现一个事件过程中设定多个事件过程的处理。

(*----------------------------------------------------------*)
(*Function for the event procedure                          *)
(*----------------------------------------------------------*)
open Swig
open Mwt
open Mwtlib
(* 子过程1 //移入鼠标 *)
let subop1 obj =
  (* (A))userString 属性保存原来的颜色  *)
  let color = obj -> getProperty ( "backColor" ) in
  obj -> setProperty ( "userString", (color -> "getCharPtr"()) );
  (* (B)设置为被选择状态 *)
  obj -> setProperty ( "backColor", "slategray4");
  ()
let _ = Callback.register "subop1" subop1

(* 子过程2 //移出鼠标 *)
let subop2 obj =
  (* (C)获取原来的颜色 *)
  let color = obj -> getProperty ( "userString" ) in
  (* (D)设置为原来的颜色 *)
  obj -> setProperty ( "backColor", (color -> "getCharPtr"()) );
  ()
let _ = Callback.register "subop2" subop2

(* 设置 WSEV_INIT(INITIALIZE) 触发器 *)
let cbop obj =
  (* 在初始化触发器处理过程中,设置新的事件过程                        *)
  (* (E)设置新的事件过程  //子过程1                                    *)
  (* 过程名称="Highlight1"  函数名称=subop1  启动触发器=WSEV_MOUSE_IN  *)
  obj -> addProcedure("Highlight1","subop1",_WSEV_MOUSE_IN);

  (* (F)设置新的事件过程 //子过程2                                     *)
  (* 过程名称="Highlight2"  函数名称=subop2 启动触发器=WSEV_MOUSE_OUT  *)
  obj -> addProcedure("Highlight2","subop2",_WSEV_MOUSE_OUT);
  ()
let _ = Callback.register "cbop" cbop

通过子过程1,将鼠标界内的触发器启动,把标签的背景显示颜色做为加亮颜色。 子过程2,鼠标出界的触发器启动,把标签的背景显示颜色恢复为原来的颜色。 事件过程的实体,被初始化触发器设定在项目中,并通过(E),(F)设定子过程1,2。 以后,当鼠标点入时,设定在新程序中的子过程将被实行。

制作可用鼠标选择的组化标签

对于同样区域上可配置的标签,可做成用鼠标选择可能的组化标签事项过程。 在该选择状态里用鼠标选择标签,即可保持该区域中被选择的标签。

(* 设置 WSEV_MOUSE_PRESS(MOUSE-PRESS) 触发器 *)
let cbop obj =
  (* (A)将 userValue 属性值作为标识符ID *)
  let value = obj -> "getProperty" ( "userValue" ) in
  (* (B)设置为被选择状态(凹陷状态) *)
  obj -> setProperty ( "shadowType", _WS_SHADOW_IN );
  (* (C)获得父对象中上次被选择的对象 *)
  let parent = obj -> getParent () in
  let targetn = parent -> getVariantData ("SelectedItem") in
  let target = parent -> getChildInstance ((targetn -> "getCharPtr"())) in
  (* (D)设置被选择的对象为原来的状态(突起状态) *)
  if (get_bool (_WSGIappObjectList '() -> existInstance( target ))) then
    ignore(target -> setProperty ( "shadowType", _WS_SHADOW_OUT ));
  if (get_bool (_WSGIappObjectList '() -> existInstance( target ))) &&
     (get_string (target -> getInstanceName()) = get_string (obj -> getInstanceName()) ) then begin
    (* (E)判断是否双击选择对象     *)
    (* 双击选择时,清除被选择状态  *)
    parent -> setVariantData ( "GroupValue",0);
    parent -> setVariantData ( "SelectedItem","");
  end else begin
    (* (F)单击选择时,在父对象中注册为被选择的对象 *)
    parent -> setVariantData ( "GroupValue", 0);
    parent -> setVariantData ( "GroupValue", (value -> "getInt"()));
    parent -> setVariantData ( "SelectedItem", (obj -> "getInstanceName"()));
  end;

  ()
let _ = Callback.register "cbop" cbop

对组化标签,各自需具有可供识别的ID,并设置为 userValue 属性的值。

(A) 取得userValue 属性中设置的 ID 。

(B)为了表现可进入选择,显示选择状态。

(C)取得被选择的对象。这个范例中,首先选择组化标签共有的父对象。

(D)将被选择对象的显示状态恢复到未选择状态。

(E)被选择的对象(target)和已经被选择的对象(obj)相同的情况,即选择2次时,选择状态被解除。 父对象中所设定的值和项目将初期化。

(F)在父对象中设置被重新选择的对象。

Document Release 3.90 for WideStudio/MWT ver 3.90, Jul 2005


WideStudio/MWT documents index | Table of contents

Copyright(C) WideStudio/MWT Development Team, 1999-2005 Last modified: Jul 31, 2005