硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2181|回复: 5
收起左侧

[emWin] 关于framewin的主窗口和客户端窗口的回调函数

[复制链接]

77

主题

223

回帖

454

积分

高级会员

积分
454
发表于 2020-5-9 13:52:56 | 显示全部楼层 |阅读模式
先创建了一个framewin,如图1,部分代码如下
  1. WM_HWIN hitem;
复制代码
测试了客户端窗口的回调函数可以正常使用,标题栏上添加了一个  button来隐藏窗口,但是在设置了主窗口的回调函数(代码倒数第二行),回调函数没有起作用,而且界面变了,如图2,啥情况
1.jpg

图2

图2
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-5-9 13:56:21 | 显示全部楼层
代码是不是没有贴全。
回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2020-5-9 14:15:31 | 显示全部楼层
eric2013 发表于 2020-5-9 13:56
代码是不是没有贴全。

主窗口有收到消息,可以隐藏了,就是界面变了。
这个窗口的代码
  1. #include "bsp_common.h"

  2. #define ID_FRAMEWIN_0                 (GUI_ID_USER + 0x00)
  3. #define ID_BUTTON_CLOSE             (GUI_ID_USER + 0x01)

  4. #define ID_CHECKBOX_PASS_ONOFF      (GUI_ID_USER + 0x02)
  5. #define ID_TEXT_NUM                 (GUI_ID_USER + 0x03)
  6. #define ID_BUTTON_PLUS              (GUI_ID_USER + 0x04)
  7. #define ID_BUTTON_DEC               (GUI_ID_USER + 0x05)

  8. #define ID_TEXT_NAME                (GUI_ID_USER + 0x06)
  9. #define ID_EDIT_NAME                (GUI_ID_USER + 0x07)

  10. #define ID_TEXT_TYPE                (GUI_ID_USER + 0x08)
  11. #define ID_TEXT_TYPE_K              (GUI_ID_USER + 0x09)
  12. #define ID_TEXT_TYPE_J              (GUI_ID_USER + 0x0A)
  13. #define ID_TEXT_TYPE_E              (GUI_ID_USER + 0x0B)
  14. #define ID_TEXT_TYPE_T              (GUI_ID_USER + 0x0C)
  15. #define ID_TEXT_TYPE_N              (GUI_ID_USER + 0x0D)
  16. #define ID_TEXT_TYPE_S              (GUI_ID_USER + 0x0E)
  17. #define ID_TEXT_TYPE_R              (GUI_ID_USER + 0x0F)
  18. #define ID_TEXT_TYPE_B              (GUI_ID_USER + 0x10)

  19. #define ID_CHECKBOX_WARNING_ONOFF   (GUI_ID_USER + 0x11)
  20. #define ID_TEXT_WARNING             (GUI_ID_USER + 0x12)
  21. #define ID_TEXT_UPPER_LIMIT         (GUI_ID_USER + 0x13)
  22. #define ID_EDIT_UPPER_LIMIT         (GUI_ID_USER + 0x14)
  23. #define ID_TEXT_LOWER_LIMIT         (GUI_ID_USER + 0x15)
  24. #define ID_EDIT_LOWER_LIMIT         (GUI_ID_USER + 0x16)
  25.                                     
  26. #define ID_CHECKBOX_MODEFY_ONOFF    (GUI_ID_USER + 0x17)           
  27. #define ID_TEXT_MODEFY              (GUI_ID_USER + 0x18)
  28. #define ID_TEXT_FORMULA             (GUI_ID_USER + 0x19)
  29. #define ID_TEXT_K                   (GUI_ID_USER + 0x1A)
  30. #define ID_EDIT_K                   (GUI_ID_USER + 0x1B)
  31. #define ID_TEXT_B                   (GUI_ID_USER + 0x1C)
  32. #define ID_EDIT_B                   (GUI_ID_USER + 0x1D)
  33. #define ID_TEXT_X                   (GUI_ID_USER + 0x1E)   

  34. WM_HWIN page_channel_properties;
  35. WM_HWIN page_channel_properties_client;

  36. WM_HWIN Chb_PassOnoff;
  37. WM_HWIN Chb_WarningOnoff;
  38. WM_HWIN        Chb_ModefyOnoff;

  39. WM_HWIN Txt_ChannelSettingNum;

  40. WM_HWIN Edit_ChannelSettingName;

  41. WM_HWIN Edit_ChannelWarningMax;
  42. WM_HWIN Edit_ChannelWarningMin;
  43. WM_HWIN Edit_ChannelModefy_K;
  44. WM_HWIN Edit_ChannelModefy_B;

  45. WM_HWIN txt_type[8];
  46. char type[8][2]={"K","J","E","T","N","S","R","B"};

  47. static void Channel_Properties_framwin_callback(WM_MESSAGE * pMsg)
  48. {
  49.     WM_HWIN hItem;
  50.     int     NCode;
  51.     int     Id;
  52.    
  53.     switch (pMsg->MsgId)
  54.     {
  55.         
  56.         case WM_PAINT:
  57.             
  58.         
  59.             break;
  60.         case WM_NOTIFY_PARENT:
  61.             Id        = WM_GetId(pMsg->hWinSrc);
  62.             NCode = pMsg->Data.v;
  63.         
  64.             switch(Id)
  65.             {
  66.                 case ID_BUTTON_CLOSE:
  67.                     switch(NCode)
  68.                     {
  69.                         case WM_NOTIFICATION_CLICKED:
  70.                              DEBUG("ID_BUTTON_CLOSE收到点击消息!\r\n");
  71.                             WM_HideWindow(page_channel_properties);
  72.                             WM_MakeModal(0);
  73.                             break;

  74.                         case WM_NOTIFICATION_RELEASED:

  75.                             break;
  76.                     }

  77.                     break;
  78.             }
  79.             break;
  80.         default:
  81.             WM_DefaultProc(pMsg);
  82.             break;
  83.     }
  84. }


  85. static void Channel_Properties_client_callback(WM_MESSAGE * pMsg)
  86. {
  87.     WM_HWIN hItem;
  88.     int     NCode;
  89.     int     Id;
  90.    
  91.     switch (pMsg->MsgId)
  92.     {
  93.         
  94.         case WM_PAINT:
  95.             
  96.         
  97.             break;
  98.         case WM_NOTIFY_PARENT:
  99.             Id        = WM_GetId(pMsg->hWinSrc);
  100.             NCode = pMsg->Data.v;
  101.         
  102.             switch(Id)
  103.             {
  104.                
  105.                     
  106.                  case ID_BUTTON_PLUS:
  107.                     switch(NCode)
  108.                     {
  109.                         case WM_NOTIFICATION_CLICKED:
  110.                             DEBUG("ID_BUTTON_PLUS收到点击消息!\r\n");
  111.                            
  112.                             break;

  113.                         case WM_NOTIFICATION_RELEASED:

  114.                             break;
  115.                     }

  116.                     break;
  117.                
  118.                 case ID_BUTTON_DEC:
  119.                     switch(NCode)
  120.                     {
  121.                         case WM_NOTIFICATION_CLICKED:
  122.                             DEBUG("ID_BUTTON_DEC收到点击消息!\r\n");
  123.                            
  124.                             break;

  125.                         case WM_NOTIFICATION_RELEASED:

  126.                             break;
  127.                     }

  128.                     break;
  129.             }
  130.             break;
  131.         default:
  132.             WM_DefaultProc(pMsg);
  133.             break;
  134.     }
  135. }

  136. static int CHECKBOX_DrawSkin(const WIDGET_ITEM_DRAW_INFO* pCheckBoxSkinItem)
  137. {
  138.     int Id;
  139.     Id = WM_GetId(pCheckBoxSkinItem->hWin);

  140.     switch (Id)
  141.     {
  142.         case ID_CHECKBOX_PASS_ONOFF:
  143.         case ID_CHECKBOX_WARNING_ONOFF:
  144.         case ID_CHECKBOX_MODEFY_ONOFF:
  145.             
  146.             switch (pCheckBoxSkinItem->Cmd)
  147.             {
  148.                 case WIDGET_ITEM_DRAW_BUTTON:
  149.                 {
  150.                     if (CHECKBOX_IsChecked(pCheckBoxSkinItem->hWin) == 0)   //没被选中的图形
  151.                     {
  152.                         GUI_SetColor(GUI_RED);   //椭圆外框
  153.                         GUI_FillCircle(25, 25, 25);
  154.                         GUI_SetTextMode(GUI_TEXTMODE_TRANS);
  155.                         GUI_SetColor(GUI_BLACK);
  156.                         GUI_SetFont(&GBK_24m24);
  157.                         GUI_DispStringAt("关", 12, 11);              //文字
  158.                     }
  159.                     else
  160.                     {
  161.                         GUI_SetColor(GUI_DARKGREEN);   //  选中的图形
  162. //                                                GUI_FillRect(20, 0, 55, 30);
  163.                         GUI_FillCircle(25, 25, 25);
  164.                         GUI_SetColor(GUI_BLACK);
  165.                         GUI_SetTextMode(GUI_TEXTMODE_TRANS);
  166.                         GUI_SetFont(&GBK_24m24);
  167.                         GUI_DispStringAt("开", 12, 11);
  168.                     }
  169.                 }
  170.                 break;
  171.             }

  172.             break;
  173.     }

  174. }

  175. void CreatWin_Channel_Properties(void)
  176. {
  177.     WM_HWIN hitem;
  178.    
  179. //    FRAMEWIN_Create();
  180.     page_channel_properties = FRAMEWIN_CreateEx(30,50,680,330,WM_GetDesktopWindow(),WM_CF_SHOW,0,ID_FRAMEWIN_0,"通道属性",Channel_Properties_client_callback);
  181.     FRAMEWIN_SetClientColor(page_channel_properties,GUI_WHITE);
  182.     FRAMEWIN_SetFont(page_channel_properties,&GBK_24m24);
  183.     FRAMEWIN_SetTitleHeight(page_channel_properties,40);
  184.     FRAMEWIN_SetTextAlign(page_channel_properties,GUI_TA_HCENTER|GUI_TA_VCENTER);

  185.     WM_SetCallback(page_channel_properties,Channel_Properties_framwin_callback);
  186.     page_channel_properties_client = WM_GetClientWindow(page_channel_properties);
  187.    
  188.     hitem = FRAMEWIN_AddButton(page_channel_properties,FRAMEWIN_BUTTON_RIGHT,10,ID_BUTTON_CLOSE);
  189.     BUTTON_SetFont(hitem,&GUI_Font32B_ASCII);
  190.     BUTTON_SetText(hitem,"X");
  191.    

  192.    
  193.     Chb_PassOnoff  =  CHECKBOX_CreateEx(10,10,50,50,page_channel_properties_client,WM_CF_SHOW,0,ID_CHECKBOX_PASS_ONOFF);
  194.     CHECKBOX_SetSkin(Chb_PassOnoff, CHECKBOX_DrawSkin);
  195.    
  196.     Txt_ChannelSettingNum = TEXT_CreateEx(80,15,30,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_NUM,"1");
  197.     TEXT_SetBkColor(Txt_ChannelSettingNum,GUI_GRAY);
  198.     TEXT_SetTextColor(Txt_ChannelSettingNum,GUI_BLUE);
  199.     TEXT_SetFont(Txt_ChannelSettingNum,&GUI_Font32B_ASCII);
  200.    
  201.    
  202.     hitem = BUTTON_CreateEx(145,15,50,40,page_channel_properties_client,WM_CF_SHOW,0,ID_BUTTON_PLUS);
  203.     BUTTON_SetFont(hitem,&GUI_Font32B_ASCII);
  204.     BUTTON_SetText(hitem,"+");
  205.    
  206.     hitem = BUTTON_CreateEx(205,15,50,40,page_channel_properties_client,WM_CF_SHOW,0,ID_BUTTON_DEC);
  207.     BUTTON_SetFont(hitem,&GUI_Font32B_ASCII);
  208.     BUTTON_SetText(hitem,"-");
  209.    
  210.     /*name*/
  211.     hitem = TEXT_CreateEx(10,70,60,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_NAME,"名称:");
  212.     TEXT_SetTextColor(hitem,GUI_BLACK);
  213.     TEXT_SetFont(hitem,&GBK_24m24);
  214.    
  215.     Edit_ChannelSettingName = EDIT_CreateEx(95,70,220,40,page_channel_properties_client,WM_CF_SHOW,0,ID_EDIT_NAME,18);
  216.     EDIT_SetBkColor(Edit_ChannelSettingName,EDIT_CI_ENABLED,GUI_GRAY);
  217.     EDIT_SetFont(Edit_ChannelSettingName,&GBK_24m24);
  218.     EDIT_SetTextColor(Edit_ChannelSettingName,EDIT_CI_ENABLED,GUI_WHITE);
  219.     EDIT_SetText(Edit_ChannelSettingName,"自定义温度名称1");
  220.     EDIT_SetTextAlign(Edit_ChannelSettingName,GUI_TA_HCENTER|GUI_TA_VCENTER);
  221.    
  222.     hitem = TEXT_CreateEx(10,125,140,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_TYPE,"热电偶类型:");
  223.     TEXT_SetTextColor(hitem,GUI_BLACK);
  224.     TEXT_SetFont(hitem,&GBK_24m24);
  225.     TEXT_SetBkColor(hitem,GUI_WHITE);
  226.    
  227.     for(uint8_t i=0;i<8;i++)
  228.     {
  229.         txt_type[i] = TEXT_CreateEx(150+i*65,125,50,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_TYPE_K+i,(const char*)(type+i) );
  230.         TEXT_SetBkColor(txt_type[i],GUI_GRAY);
  231.         TEXT_SetTextColor(txt_type[i],GUI_WHITE);
  232.         TEXT_SetFont(txt_type[i],&GUI_Font32B_ASCII);
  233.    
  234.     }
  235.    

  236.     Chb_WarningOnoff  =  CHECKBOX_CreateEx(10,175,50,50,page_channel_properties_client,WM_CF_SHOW,0,ID_CHECKBOX_WARNING_ONOFF);
  237.     CHECKBOX_SetSkin(Chb_WarningOnoff, CHECKBOX_DrawSkin);
  238.    
  239.     hitem = TEXT_CreateEx(70,180,50,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_WARNING,"报警");
  240.     TEXT_SetTextColor(hitem,GUI_BLACK);
  241.     TEXT_SetFont(hitem,&GBK_24m24);
  242.    
  243.     hitem = TEXT_CreateEx(175,180,80,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_UPPER_LIMIT,"上限:");
  244.     TEXT_SetTextColor(hitem,GUI_BLACK);
  245.     TEXT_SetFont(hitem,&GBK_24m24);
  246.    
  247.    
  248.     Edit_ChannelWarningMax = EDIT_CreateEx(265,180,120,40,page_channel_properties_client,WM_CF_SHOW,0,ID_EDIT_UPPER_LIMIT,8);
  249.     EDIT_SetBkColor(Edit_ChannelWarningMax,EDIT_CI_ENABLED,GUI_GRAY);
  250.     EDIT_SetFont(Edit_ChannelWarningMax,&GUI_Font32B_ASCII);
  251.     EDIT_SetTextColor(Edit_ChannelWarningMax,EDIT_CI_ENABLED,GUI_WHITE);
  252.     EDIT_SetText(Edit_ChannelWarningMax,"1000.0");
  253.     EDIT_SetTextAlign(Edit_ChannelWarningMax,GUI_TA_HCENTER|GUI_TA_VCENTER);
  254.    
  255.     hitem = TEXT_CreateEx(425,180,80,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_LOWER_LIMIT,"下限:");
  256.     TEXT_SetTextColor(hitem,GUI_BLACK);
  257.     TEXT_SetFont(hitem,&GBK_24m24);
  258.    
  259.    
  260.     Edit_ChannelWarningMin = EDIT_CreateEx(505,180,120,40,page_channel_properties_client,WM_CF_SHOW,0,ID_EDIT_LOWER_LIMIT,8);
  261.     EDIT_SetBkColor(Edit_ChannelWarningMin,EDIT_CI_ENABLED,GUI_GRAY);
  262.     EDIT_SetFont(Edit_ChannelWarningMin,&GUI_Font32B_ASCII);
  263.     EDIT_SetTextColor(Edit_ChannelWarningMin,EDIT_CI_ENABLED,GUI_WHITE);
  264.     EDIT_SetText(Edit_ChannelWarningMin,"1000.0");
  265.     EDIT_SetTextAlign(Edit_ChannelWarningMin,GUI_TA_HCENTER|GUI_TA_VCENTER);
  266.    
  267.    
  268.     /*修正*/
  269.     Chb_ModefyOnoff  =  CHECKBOX_CreateEx(0,230,50,50,page_channel_properties_client,WM_CF_SHOW,0,ID_CHECKBOX_MODEFY_ONOFF);
  270.     CHECKBOX_SetSkin(Chb_ModefyOnoff, CHECKBOX_DrawSkin);
  271.    
  272.     hitem = TEXT_CreateEx(60,235,50,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_MODEFY,"修正");
  273.     TEXT_SetTextColor(hitem,GUI_BLACK);
  274.     TEXT_SetFont(hitem,&GBK_24m24);
  275.     TEXT_SetBkColor(hitem,GUI_GRAY);
  276.    
  277.     hitem = TEXT_CreateEx(120,235,100,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_FORMULA,"Y=kx+b");
  278.     TEXT_SetTextColor(hitem,GUI_BLACK);
  279.     TEXT_SetFont(hitem,&GUI_Font32B_ASCII);
  280.     TEXT_SetBkColor(hitem,GUI_GRAY);
  281.    
  282.     hitem = TEXT_CreateEx(240,235,40,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_K,"k=");
  283.     TEXT_SetTextColor(hitem,GUI_BLACK);
  284.     TEXT_SetFont(hitem,&GUI_Font32B_ASCII);
  285.     TEXT_SetBkColor(hitem,GUI_GRAY);
  286.    
  287.     Edit_ChannelModefy_K = EDIT_CreateEx(280,235,95,40,page_channel_properties_client,WM_CF_SHOW,0,ID_EDIT_K,8);
  288.     EDIT_SetBkColor(Edit_ChannelModefy_K,EDIT_CI_ENABLED,GUI_GRAY);
  289.     EDIT_SetFont(Edit_ChannelModefy_K,&GUI_Font32B_ASCII);
  290.     EDIT_SetTextColor(Edit_ChannelModefy_K,EDIT_CI_ENABLED,GUI_WHITE);
  291.     EDIT_SetText(Edit_ChannelModefy_K,"1000.0");
  292.     EDIT_SetTextAlign(Edit_ChannelModefy_K,GUI_TA_HCENTER|GUI_TA_VCENTER);

  293.    
  294.     hitem = TEXT_CreateEx(385,235,40,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_B,"b=");
  295.     TEXT_SetTextColor(hitem,GUI_BLACK);
  296.     TEXT_SetFont(hitem,&GUI_Font32B_ASCII);
  297.     TEXT_SetBkColor(hitem,GUI_GRAY);
  298.    
  299.     Edit_ChannelModefy_B = EDIT_CreateEx(425,235,95,40,page_channel_properties_client,WM_CF_SHOW,0,ID_EDIT_K,8);
  300.     EDIT_SetBkColor(Edit_ChannelModefy_B,EDIT_CI_ENABLED,GUI_GRAY);
  301.     EDIT_SetFont(Edit_ChannelModefy_B,&GUI_Font32B_ASCII);
  302.     EDIT_SetTextColor(Edit_ChannelModefy_B,EDIT_CI_ENABLED,GUI_WHITE);
  303.     EDIT_SetText(Edit_ChannelModefy_B,"1000.0");
  304.     EDIT_SetTextAlign(Edit_ChannelModefy_B,GUI_TA_HCENTER|GUI_TA_VCENTER);
  305.    
  306.     hitem = TEXT_CreateEx(530,235,140,40,page_channel_properties_client,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,ID_TEXT_X,"(X为测量值)");
  307.     TEXT_SetTextColor(hitem,GUI_BLACK);
  308.     TEXT_SetFont(hitem,&GBK_24m24);
  309.     TEXT_SetBkColor(hitem,GUI_GRAY);
  310.    
  311.     WM_HideWindow(page_channel_properties);
  312.     WM_AttachWindow(page_channel_properties,Page_List);
  313. }






复制代码

回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2020-5-10 22:31:32 | 显示全部楼层
薪火相传 发表于 2020-5-9 14:15
主窗口有收到消息,可以隐藏了,就是界面变了。
这个窗口的代码

硬汉哥,是哪有问题吗
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2020-5-10 23:32:03 | 显示全部楼层
Channel_Properties_client_callback会不会有问题?client窗口是FrameWin的一部分,在_cbDialog好像可以处理所有例程
一般用FrameWin Dialog(用GUIBuilder生成资源),貌似没问题,你可以试一下
类似这样:GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
回复

使用道具 举报

77

主题

223

回帖

454

积分

高级会员

积分
454
 楼主| 发表于 2020-5-11 09:33:53 | 显示全部楼层
h_007 发表于 2020-5-10 23:32
Channel_Properties_client_callback会不会有问题?client窗口是FrameWin的一部分,在_cbDialog好像可以处 ...

解决了,调用旧的回调函数
_pcbOldFrame = WM_SetCallback(page_channel_properties,Channel_Properties_framwin_callback);

Channel_Properties_framwin_callback加上:
if (_pcbOldFrame)
  {
    (*_pcbOldFrame)(pMsg);
  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-18 20:01 , Processed in 0.284604 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表