STM32
直播中

吴凡

10年用户 942经验值
擅长:48674
私信 关注
[问答]

在stm32上使用ucgui+ucos编写程序,GUI_GetKey()无法得到按钮ID的原因?

各位大大,本人在STM32上使用ucgui+ucos编写程序,在使用按钮的时候,发现点击按钮,GUI_GetKey()无法得到按钮ID(偶尔一次可以得到)。程序代码如下:
void MainTask(void)
{
   GUI_Init();
   while(1)
{
  //WM_Exec1();
  APP_main();
   }
}
void APP_main(void)//用户主函数
{
  GUI_Clear();  while(1) {
  _Menu();
  OStimeDlyHMSM(0,0,0,20);//按时分秒延时函数
}
}
static void _Menu(void) {
BUTTON_Handle hM1, hM2;//hM3, hM4;
int sKey;
static u8 Kf1=0, Kf2=0;

   GUI_RECT rText = {340,8, 460,24};
GUI_SetBkColor(GUI_BLACK);
GUI_SetColor(GUI_LIGHTGRAY);
GUI_SetFont( amp;GUI_Font16_ASCII);
GUI_DispStringInRect( quot;CH1 quot;,  amp;rText, GUI_TA_VCENTER|GUI_TA_HCENTER);
hM1 = BUTTON_Create( 340, 26, 120, 25, 1, BUTTON_CF_SHOW );
BUTTON_SetText(hM1,  quot;通道选择 quot;);
BUTTON_SetFont(hM1,  amp;GUI_FontHZ_SimHei_19);
BUTTON_SetBkColor(hM1, 0, GUI_DARKGRAY);
BUTTON_SetTextColor(hM1, 0, GUI_WHITE);

hM2 = BUTTON_Create( 340, 76, 120, 25, 2, BUTTON_CF_SHOW );
BUTTON_SetText(hM2,  quot;探头 quot;);
BUTTON_SetFont(hM2,  amp;GUI_FontHZ_SimHei_19);
BUTTON_SetBkColor(hM2, 0, GUI_DARKGRAY);
BUTTON_SetTextColor(hM2, 0, GUI_WHITE);

  WM_Exec();//WM_Exec1();
  sKey = GUI_GetKey();获取按钮ID

if(sKey==1){//按钮处理
  if(Kf1==0) Kf1=1;
  else Kf1=0;  
}
else if(sKey==2) {
  if(Kf2==0) Kf2=1;
  else Kf2=0;  
}
rText.y0 = 52; rText.y1 = 75;
GUI_SetFont( amp;GUI_FontHZ_SimHei_19);
if(Kf1==0) GUI_DispStringInRect( quot;直流 quot;,  amp;rText, GUI_TA_VCENTER|GUI_TA_HCENTER);
else GUI_DispStringInRect( quot;交流 quot;,  amp;rText, GUI_TA_VCENTER|GUI_TA_HCENTER);

rText.y0 = 100; rText.y1 = 125;
GUI_SetFont( amp;GUI_Font16_ASCII);
if(Kf2==0) { GUI_GotoXY(360, 102); GUI_DispCEOL();
  GUI_DispStringInRect( quot;X1 quot;,  amp;rText, GUI_TA_VCENTER|GUI_TA_HCENTER); }
else GUI_DispStringInRect( quot;X10 quot;,  amp;rText, GUI_TA_VCENTER|GUI_TA_HCENTER);

BUTTON_Delete(hM1);
BUTTON_Delete(hM2);
}

回帖(1)

刘强

2024-5-18 17:28:25
从您提供的代码片段来看,问题可能出在以下几个方面:

1. 事件处理:确保您已经正确地为按钮设置了事件处理函数。在ucgui中,您需要使用 WM_SetCallback() 函数为按钮设置回调函数,以便在按钮被点击时执行相应的操作。

```c
WM_SetCallback(pButton, _ButtonCallback);
```

2. 回调函数:确保您的回调函数能够正确处理按钮点击事件,并返回相应的按钮ID。以下是一个简单的回调函数示例:

```c
void _ButtonCallback(WM_MESSAGE * pMsg) {
  switch (pMsg->MsgId) {
    case WM_PAINT:
      // 绘制按钮
      break;
    case WM_TOUCHED:
      // 按钮被点击时的操作
      // 这里可以获取按钮ID
      int buttonID = pMsg->Data.v;
      // 使用buttonID进行其他操作
      break;
    default:
      // 其他消息处理
      break;
  }
}
```

3. GUI_GetKey() 的使用:GUI_GetKey() 函数用于获取按键事件,而不是按钮点击事件。如果您想要获取按钮点击事件,应该使用 WM_TOUCHED 消息。请确保您正确地处理了 WM_TOUCHED 消息,而不是依赖 GUI_GetKey()。

4. 多任务调度:由于您使用了 uCOS 实时操作系统,确保您的任务调度是正确的。如果任务调度不正确,可能会导致事件处理不及时或丢失。

5. 延时问题:在您的代码中,您使用了 OSTimeDlyHMSM() 函数进行延时。请确保延时时间不会影响事件处理。如果延时过长,可能会导致事件处理不及时。

综上所述,您需要检查事件处理、回调函数、消息处理和任务调度等方面,以确保按钮点击事件能够被正确地捕获和处理。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分