硬汉嵌入式论坛

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

[emWin] 框架窗口函数FRAMEWIN_CreateEx的一些注意事项

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2016-10-12 01:16:24 | 显示全部楼层 |阅读模式
3.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
 楼主| 发表于 2016-10-12 01:31:23 | 显示全部楼层
注意最后两条解释。
1.  框架窗口的客户端窗口的用户回调函数不会接受到所有发给它的消息,一些系统消息是会发送给窗口回调函数(这里的意思应该是客户端窗口的回调函数除了用户设置的,还有有个系统自己会执行的)。

2. 用户回调所接收的句柄是框架窗口(客户端窗口的父窗口)的句柄,接收客户端窗口句柄的 WM_PAINT消息除外。
回复

使用道具 举报

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2018-6-21 10:34:48 | 显示全部楼层
FRAMEWIN_CreateEx创建的框架,回调函数是框架窗口的回调函数,在此回调函数中创建其他控件会创建到框架窗口上,通过 hClent = WM_GetClientWindow(hFram);获取客户端在创建也不行。
如果设置回调函数是框架客户端的回调函数,在此回调函数中创建控件,则控件显示有问题。
只能在FRAMEWIN_CreateEx下边获取客户端句柄后使用TEXT_CreateEx创建其他控件。
目前我测试的是这样的。不知道哪里有什么问题?
另外GUI_CreateDialogBox函数中的回调函数是框架的回调函数还是框架客户端的回调函数(我觉得是客户端的回调函数)?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
 楼主| 发表于 2018-6-21 11:07:23 | 显示全部楼层
lhb292 发表于 2018-6-21 10:34
FRAMEWIN_CreateEx创建的框架,回调函数是框架窗口的回调函数,在此回调函数中创建其他控件会创建到框架窗 ...

发下你的
FRAMEWIN_CreateEx部分测试代码,我在模拟器上面走一个看看。
回复

使用道具 举报

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2018-6-21 12:38:04 | 显示全部楼层
/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.30                          *
*        Compiled Jul  1 2015, 10:50:32                              *
*        (c) 2015 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: www.segger.com  Support: support@segger.com       *
*                                                                    *
**********************************************************************
*/

// USER START (Optionally insert additional includes)
// USER END

#include "DIALOG.h"

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_FRAMEWIN_MEGBOX       (GUI_MESSBOX_ID + 0x01)
#define ID_TEXT_MEGBOX           (GUI_MESSBOX_ID + 0x02)
//#define ID_BUTTON_MEGBOX_ESC     (GUI_MESSBOX_ID + 0x03)
//#define ID_BUTTON_MEGBOX_OK      (GUI_MESSBOX_ID + 0x04)

#define XSIZE_PHYS 320
#define YSIZE_PHYS 240
#define MEGBOX_XSIZE 160
#define MEGBOX_YSIZE 120

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

  switch (pMsg->MsgId) {
  /*case WM_INIT_DIALOG:
        hItem = pMsg->hWin;
    break;*/
  /////////////////////////////////////////
  case WM_KEY:
        switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
        {
                case GUI_KEY_ESCAPE:
                        {
                         GUI_EndDialog(pMsg->hWin, 1);
                         break;
                        }
        }
        break;// case WM_KEY:

  /////////////////////////////////////////
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id)
        {
                case GUI_ID_CANCEL: // Notifications sent by 'Button'
                {
                  switch(NCode)
                  {
                          case WM_NOTIFICATION_CLICKED:
                                  {
                                         GUI_EndDialog(pMsg->hWin, 1);
                                         break;
                                  }
                          case WM_NOTIFICATION_RELEASED:
                                  {
                                        break;
                                  }

                  }
                  break;// case GUI_ID_CANCEL:
                }
                case GUI_ID_OK: // Notifications sent by 'Button'
                {
                  switch(NCode)
                  {
                          case WM_NOTIFICATION_CLICKED:
                                  {
                                           GUI_EndDialog(pMsg->hWin, 0);
                                           break;
                                  }
                          case WM_NOTIFICATION_RELEASED:
                                  {
                                           break;
                                  }

                  }
                  break; //case GUI_ID_OK:
                }

    }
    break;//case WM_NOTIFY_PARENT:
   /////////////////////////////////////////
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}


/*********************************************************************
*
*       _MessageBox
*
* Function description
*   Creates and executes a modal message box
*/

int _MessageBox(const char * pText, const char * pCaption ,int Flags)
{
        int ret;
    FRAMEWIN_Handle hFram;
    WM_HWIN hClent;
    WM_HWIN hItem;

        hFram = FRAMEWIN_CreateEx((XSIZE_PHYS-MEGBOX_XSIZE)/2, (YSIZE_PHYS-MEGBOX_YSIZE)/2, MEGBOX_XSIZE, MEGBOX_YSIZE, WM_HBKWIN, WM_CF_SHOW, 0, ID_FRAMEWIN_MEGBOX,pCaption,_cbMessageBox);
    FRAMEWIN_SetTitleHeight(hFram, 20);
    FRAMEWIN_SetTextAlign(hFram, GUI_TA_LEFT | GUI_TA_VCENTER);
        FRAMEWIN_SetTextColor(hFram, GUI_MAKE_COLOR(0x00FFFFFF));
        FRAMEWIN_SetFont(hFram, &GUI_FontHZ16);
    //FRAMEWIN_SetText(hFram, "Framewin");

    hClent = WM_GetClientWindow(hFram);
        hItem = TEXT_CreateEx(1, 10,MEGBOX_XSIZE-10,40,hClent, WM_CF_SHOW,0, ID_TEXT_MEGBOX,pText);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
        TEXT_SetBkColor(hItem,GUI_WHITE);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00000000));
    TEXT_SetFont(hItem, &GUI_FontHZ16);
    //TEXT_SetText(hItem, "Text");

   if(Flags==0)
   {
      hItem = BUTTON_CreateEx(48, MEGBOX_YSIZE-55, 55, 22,hClent, 0,0, GUI_ID_CANCEL);
          BUTTON_SetTextColor(hItem,BUTTON_CI_UNPRESSED|BUTTON_CI_PRESSED,GUI_MAKE_COLOR(0x00FFFFFF));
          BUTTON_SetFont(hItem, &GUI_FontHZ16);
          BUTTON_SetText(hItem, "确定");
      WM_SetFocus(hItem);
   }

   if(Flags==1)
   {
          hItem = BUTTON_CreateEx(48, MEGBOX_YSIZE-55, 55, 22,hClent, WM_CF_SHOW,0, GUI_ID_CANCEL);
          BUTTON_SetTextColor(hItem,BUTTON_CI_UNPRESSED|BUTTON_CI_PRESSED,GUI_MAKE_COLOR(0x00FFFFFF));
          BUTTON_SetFont(hItem, &GUI_FontHZ16);
          BUTTON_SetText(hItem, "确定");
      WM_SetFocus(hItem);
   }
   
   if(Flags>=2)
   {   
          hItem = BUTTON_CreateEx(12, MEGBOX_YSIZE-55, 55, 22,hClent, WM_CF_SHOW,0, GUI_ID_OK);//12
      BUTTON_SetTextColor(hItem,BUTTON_CI_UNPRESSED|BUTTON_CI_PRESSED, GUI_MAKE_COLOR(0x00FFFFFF));
      BUTTON_SetFont(hItem, &GUI_FontHZ16);
      BUTTON_SetText(hItem, "取消");

          hItem = BUTTON_CreateEx(85, MEGBOX_YSIZE-55, 55, 22,hClent, WM_CF_SHOW,0, GUI_ID_CANCEL);//85
          BUTTON_SetTextColor(hItem,BUTTON_CI_UNPRESSED|BUTTON_CI_PRESSED,GUI_MAKE_COLOR(0x00FFFFFF));
      BUTTON_SetFont(hItem, &GUI_FontHZ16);
      BUTTON_SetText(hItem, "确定");
      WM_SetFocus(hItem);
   }

        WM_MakeModal(hClent);
    ret = GUI_ExecCreatedDialog(hFram);
   return ret;
}
//MENU_SetSel(_hMenu, -1);
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
 楼主| 发表于 2018-6-21 14:40:41 | 显示全部楼层
lhb292 发表于 2018-6-21 12:38
/*********************************************************************
*                            ...

可以在FrameWin的框架窗口回调函数里面做,你的消息用错了,你要在case WM_CREATE:消息里面。对话框是
*case WM_INIT_DIALOG:
回复

使用道具 举报

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2018-6-21 19:43:31 | 显示全部楼层
改在case WM_CREATE:中也不行,        case WM_CREATE:
        hItem = pMsg->hWin;
        hItem = TEXT_CreateEx(0, 0,MEGBOX_XSIZE-10,40,hItem, WM_CF_SHOW,0, ID_TEXT_MEGBOX,"234");
这样会创建到窗体的标题上。
        case WM_CREATE:
        hItem = WM_GetClientWindow(pMsg->hWin);
        hItem = TEXT_CreateEx(0, 0,MEGBOX_XSIZE-10,40,hItem, WM_CF_SHOW,0, ID_TEXT_MEGBOX,"234");
这样会创建到桌面的左上角。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
 楼主| 发表于 2018-6-21 20:32:02 | 显示全部楼层
hItem = pMsg->hWin;
hItem = TEXT_CreateEx(0, 0,MEGBOX_XSIZE-10,40,hItem, WM_CF_SHOW,0, ID_TEXT_MEGBOX,"234");

它就是这样的,你设置下控件的位置就好了。你可以使能你的FrameWIN
支持拖动,看看是不是跟着一起走,如果一起走,就是没问题的。
只是这种情况没有将文本控件创建到框架窗口的客户区窗口上,而是创建到框架窗口上了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
 楼主| 发表于 2018-6-21 20:47:13 | 显示全部楼层
而你需要将文本控件创建到框架窗口FrameWin的客户区窗口上,代码要是:

case WM_CREATE:
        hItem = WM_GetFirstChild(pMsg->hWin);
        hItem = TEXT_CreateEx(0, 0,MEGBOX_XSIZE-10,40,hItem, WM_CF_SHOW,0, ID_TEXT_MEGBOX,"234");

实际测试使用WM_GetClientWindow(pMsg->hWin);在这个位置,无法有效获取句柄。而使用函数WM_GetFirstChild就没问题了,这样就解决了你说的问题。

效果:

QQ截图20180621204641.png

回复

使用道具 举报

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2018-6-25 10:43:05 | 显示全部楼层
确实是正解,谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 22:34 , Processed in 0.360444 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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