gui 数字键盘相关

UC/GUI移植 总结之回调函数
醉中天 2011-06-14 18:18

使用的消息ID 同名,用户定义的消息的编号以WM_USER 为开始。你应该像下面所展示的一样
定义你自己的消息:
#define MY_MESSAGE_AAA WM_USER+0
#define MY_MESSAGE_BBB WM_USER+1

在这里

这是说明书给出的回调机制

下面分析一下典型的数字面板输入机制:

现在主函数中加载 hNumPad = GUI_CreateDialogBox(_aDialogNumPad, 
                                GUI_COUNTOF(_aDialogNumPad), 
                                _cbDialogNumPad, WM_HBKWIN, 0, 0); /* Create the numpad dialog *///该函数产生了数字面板

//对应回调函数_cbDialogNumPad

static void _cbDialogNumPad(WM_MESSAGE * pMsg) {
  GUI_RECT r;
  int i, NCode, Id, Pressed = 0;
  WM_HWIN hDlg, hItem;
  hDlg = pMsg->hWin;            // 获得窗口的句柄
  switch (pMsg->MsgId) {     //根据窗口的消息类型执行相应的内容

  case WM_PAINT:            //窗口重绘    此处绘出了面板的边框
    WM_GetClientRect(&r);
    GUI_SetColor(GUI_RED);
    GUI_DrawRect(r.x0, r.y0, r.x1, r.y1);          /* Draw rectangle around it */
    /* Draw the bright sides */
    GUI_SetColor(0xffffff);
    GUI_DrawHLine(r.y0 + 1, r.x0 + 1, r.x1 - 2);   /* Draw top line */
    GUI_DrawVLine(r.x0 + 1, r.y0 + 1, r.y1 - 2);
    /* Draw the dark sides */
    GUI_SetColor(0x555555);
    GUI_DrawHLine(r.y1-1, r.x0 + 1, r.x1 - 1);
    GUI_DrawVLine(r.x1-1, r.y0 + 1, r.y1 - 2);
    break;
  case WM_INIT_DIALOG:                     //窗口的初始化  控件的各种属性   颜色 文本
    for (i = 0; i < GUI_COUNTOF(_aDialogNumPad) - 1; i++) {
      hItem = WM_GetDialogItem(hDlg, GUI_ID_USER + i);   //返回一个对话框中控件的句柄   根据此句柄  设置控件的属性句柄是根据控件的ID号得到的 
      BUTTON_SetFocussable(hItem, 0);                       /* Set all buttons non focussable */
      BUTTON_SetBkColor(hItem,0,GUI_BLUE);
      switch (i) {
      case 13:
        BUTTON_SetBitmapEx(hItem, 0, &_bmArrowLeft, 15, 10);  /* Set bitmap for arrow left button (unpressed) */
        BUTTON_SetBitmapEx(hItem, 1, &_bmArrowLeft, 15, 10);  /* Set bitmap for arrow left button (pressed) */
        break;
      case 14:
        BUTTON_SetBitmapEx(hItem, 0, &_bmArrowRight, 15, 10); /* Set bitmap for arrow right button (unpressed) */
        BUTTON_SetBitmapEx(hItem, 1, &_bmArrowRight, 15, 10); /* Set bitmap for arrow right button (pressed) */
        break;
      }
    }
    hItem = WM_GetDialogItem(hDlg, GUI_ID_USER + 12);
    break;
  case WM_NOTIFY_PARENT:                            //通知父窗口控件发生了改变
    Id    = WM_GetId(pMsg->hWinSrc);      /* Id of widget */  //  得到窗口控件的ID号 
    NCode = pMsg->Data.v;                 /* Notification code */// 控件的消息类型
    switch (NCode) {
    case WM_NOTIFICATION_CLICKED:
      Pressed = 1;
    case WM_NOTIFICATION_RELEASED:
      if ((Id >= GUI_ID_USER) && (Id <= (GUI_ID_USER + GUI_COUNTOF(_aDialogNumPad) - 1))) {
        int Key;
        if (Id < GUI_ID_USER + 11) {
          char acBuffer[10];
          BUTTON_GetText(pMsg->hWinSrc, acBuffer, sizeof(acBuffer)); /* Get the text of the button */
          Key = acBuffer[0];
        } else {
          Key = _aKey[Id - GUI_ID_USER - 11];                        /* Get the text from the array */
        }
        GUI_SendKeyMsg(Key, Pressed);                                /* Send a key message to the focussed window */    //很关键的地方点击按钮之后要发送键值
      }
      break;
    }
  default:
    WM_DefaultProc(pMsg);
  }
}

从上面的程序可以看出回调函数工作过程可以归结为如下过程:1.获取窗口的句柄    1.根据窗口的消息类型作出相应的判断:WN_PAINT:窗口的.        WM_INIT_DIALOG:初始化窗口控件  要根据控件的ID号得到控件句柄  从而根据句柄 设置控件的各种属性       ;;;;;WM_NOTIFY_PARENT:根据 WM_GetId(pMsg->hWinSrc);  得到变化控件的ID号,根据pMsg->Data.v,得到控件的消息类型      根据不同的控件发送GUI_SendKeyMsg(Key, Pressed);    键值。

文本的内容自会出现在另一个窗口的文本框中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值