STemWin之Dialog

使用PC仿真进行实验。

使用GUIbuilder生成界面文件源码C文件。运行后显示如下

STemWin之Dialog_第1张图片

加入了几个比较简单的控件(资料中也叫小工具)。

源码过程分析:

生成文件的默认入口为CreateFramewin(void);函数,调用它运行设计好的界面(如果界面不显示或者黑屏参考上一篇文章)

WM_HWIN CreateFramewin(void) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

此函数引用了GUI_CreateDialogBox函数,函数定义如下,

STemWin之Dialog_第2张图片

依次查看形参

_aDialogCreate:此参数为各个空间的信息

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 240, 320, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 106, 12, 40, 20, 0, 0x0, 0 },
  { EDIT_CreateIndirect, "Edit", ID_EDIT_0, 7, 11, 80, 20, 0, 0x64, 0 },
  { TEXT_CreateIndirect, "Text", ID_TEXT_0, 12, 49, 180, 20, 0, 0x0, 0 },
  { PROGBAR_CreateIndirect, "Progbar", ID_PROGBAR_0, 11, 275, 202, 20, 0, 0x0, 0 },
  { SLIDER_CreateIndirect, "Slider", ID_SLIDER_0, 14, 236, 196, 20, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 160, 11, 40, 20, 0, 0x0, 0 },
  // USER START (Optionally insert additional widgets)
  // USER END
};

GUI_COUNTOF(_aDialogCreate):此参数为控件数量,#define GUI_COUNTOF(a)          (sizeof(a) / sizeof(a[0]))

_cbDialog:此参数为回调函数,处理每个控件的消息。(删掉了注释)

static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  int     NCode;
  int     Id;


  switch (pMsg->MsgId) {     //第一层
  case WM_INIT_DIALOG:

    hItem = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);  //返回对话框项目 (小工具)的窗口句柄。
    EDIT_SetText(hItem, "123");

    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);   //返回指定小工具窗口的 ID
    NCode = pMsg->Data.v;
    switch(Id) {            //第二层
    case ID_BUTTON_0: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:

        break;
      case WM_NOTIFICATION_RELEASED:

        break;
      }
      break;
    case ID_EDIT_0: // Notifications sent by 'Edit'
      switch(NCode) {      //第三层
      case WM_NOTIFICATION_CLICKED:

        break;
      case WM_NOTIFICATION_RELEASED:

        break;
      case WM_NOTIFICATION_VALUE_CHANGED:
 
        break;
      }
      break;
    case ID_SLIDER_0: // Notifications sent by 'Slider'
      switch(NCode) {      //第三层
      case WM_NOTIFICATION_CLICKED:
 
        break;
      case WM_NOTIFICATION_RELEASED:

        break;
      case WM_NOTIFICATION_VALUE_CHANGED:

        break;
      }
      break;
    case ID_BUTTON_1: // Notifications sent by 'Button'
      switch(NCode) {      //第三层
      case WM_NOTIFICATION_CLICKED:

        break;
      case WM_NOTIFICATION_RELEASED:

        break;
      }
      break;
    }
    break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

WM_HBKWIN:父窗口的句柄 ,WM_HBKWIN为桌面窗口。如果为0 表示没有父窗口

最后两个是创建的Dialog相对父窗口的位置。

窗口回调函数分析:

_cbDialog:作为创建对话框的形参,_cbDialog();函数有什么作用呢。

函数中有3层switch,最顶层的switch(设定它为第1层)有两个分支:WM_INIT_DIALOG和WM_NOTIFY_PARENT

第1层:

WM_INIT_DIALOG 消息会立即发送到对话框过程函数。

 WM_NOTIFY_PARENT 消息则通过对话框的子窗口发送到对话框,通知任何事件的父窗口以确保同步化。

第2层

在WM_NOTIFY_PARENT 消息下包含了第二层switch,这一层的中作用是对目标控件的选择。

可以看到这一层switch分支都是控件的ID

第3层

在每一种控件下都会有一层switch,每个控件的不同则分支也不同。比如button,ID为ID_BUTTON_0的按键两个其分支如下:

    case ID_BUTTON_0: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:       //按键被按下时的操作逻辑
        // USER START (Optionally insert code for reacting on notification message)

        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:      //按键被释放时的操作逻辑
        // USER START (Optionally insert code for reacting on notification message)

        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;

WM_NOTIFICATION_CLICKED和WM_NOTIFICATION_RELEASED,这两个消息是由button控件发送的,回调函数通过这个消息进行需要的处理。

其他控件的模式与之类似,具体内容可参考EmWin手册。

 

 

你可能感兴趣的:(STemWin)