OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6752|回复: 6

emWin对话框或窗体上画二维图

[复制链接]

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-8-1 18:02:11 | 显示全部楼层 |阅读模式
1金钱
    今天在学习emWin过程中本想制作一个画板程序,但是遇到的问题是2D图为什么无法再对话框或窗体上显示??无窗体或对话框区域可以正常绘制,请问是为什么?

最佳答案

查看完整内容[请看2#楼]

画图需要首先在其它事件(比如按下按钮事件或者自定义事件)当中无效化窗口(告诉EMWIN这个窗口需要重绘了),然后EMWIN会调用回调函数中WM_PAINT部分代码重绘,所以画图需要放在WM_PAINT当中。 给一个示例 [mw_shl_code=c,true]static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int NCode; int Id; // USER START (Optionally insert additional variables) U32 i = 0; // USER ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-8-1 18:02:12 | 显示全部楼层
本帖最后由 yyx112358 于 2016-8-3 16:34 编辑
shuaigew88 发表于 2016-8-2 11:09
我用WM_SelectWindow()指定了绘制的窗体后,还是无法再指定的窗体上显示啊?

画图需要首先在其它事件(比如按下按钮事件或者自定义事件)当中无效化窗口(告诉EMWIN这个窗口需要重绘了),然后EMWIN会调用回调函数中WM_PAINT部分代码重绘,所以画图需要放在WM_PAINT当中。
给一个示例
[mw_shl_code=c,true]static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  int     NCode;
  int     Id;
  // USER START (Optionally insert additional variables)
  U32        i = 0;
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'Monitor'
    //
    hItem = pMsg->hWin;
    WINDOW_SetBkColor(hItem, 0x00E6E6E6);
    //
    // Initialization of 'CLOSE'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
    BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
    //
    // Initialization of 'Fit'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
    BUTTON_SetFont(hItem, GUI_FONT_20B_ASCII);
    //
    // Initialization of '111 111'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetFont(hItem, GUI_FONT_D32);
    // USER START (Optionally insert additional code for further widget initialization)
    // USER END
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0: // Notifications sent by 'CLOSE'
      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)
                  WM_DeleteWindow( pMsg->hWin );
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    case ID_BUTTON_1: // Notifications sent by 'Fit'
      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;
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    }
    break;
  // USER START (Optionally insert additional message handling)
  case WM_PAINT:
  {
          GUI_COLOR        tmpcolor = GUI_GetColor();
          GUI_FONT        tmpfont = *GUI_GetFont();
          GUI_RECT        rect = { 0, 0, 240, 240 };
          char        str[32];
         
          GUI_SetClipRect( &rect );
          GUI_SetFont( &GUI_Font20_ASCII );
          for ( i = 0; i < 3; i++ )
          {
                  GUI_SetColor( MYPURPLE );
                  GUI_DrawCircle( ZIGBEE_Image.O.x*3, 240-ZIGBEE_Image.O.y*3, ZIGBEE_Image.R*3 );
                  GUI_DrawCircle( ZIGBEE_Image.O.x*3, 240-ZIGBEE_Image.O.y*3, ZIGBEE_Image.R*3 - 3 );
                  GUI_DrawCircle( ZIGBEE_Image.O.x*3, 240-ZIGBEE_Image.O.y*3, ZIGBEE_Image.R*3 - 2 );
                  GUI_DrawCircle( ZIGBEE_Image.O.x*3, 240-ZIGBEE_Image.O.y*3, ZIGBEE_Image.R*3-1 );
                  GUI_SetColor( 0xC59A2C );
                  
                  sprintf( str, "%3.1f", ZIGBEE_Image.R );
                  if ( ZIGBEE_Image.O.x*3 <60 )
                          GUI_DispStringHCenterAt( str, ZIGBEE_Image.O.x*3+10 , 240-ZIGBEE_Image.O.y*3 -10);
                else if ( ZIGBEE_Image.O.x*3 >180 )
                        GUI_DispStringHCenterAt( str, ZIGBEE_Image.O.x*3-10, 240-ZIGBEE_Image.O.y*3-10 );
                else
                        GUI_DispStringHCenterAt( str, ZIGBEE_Image.O.x*3 , 240-ZIGBEE_Image.O.y*3  );
          }
         
          GUI_SetColor( MYRED );
          GUI_FillCircle( ZIGBEE_Image.CrossPoint.x*3, 240-ZIGBEE_Image.CrossPoint.y*3, 5 );
          GUI_SetColor( tmpcolor );
          GUI_FillRect( 0, 240, 240, 100 );
  }
         
        break;
  case        WM_MONITOR_UPDATE:
  {
          GUI_RECT        rect = { 0, 0, 240, 240 };
          TEXT_Handle        hTEXT_Monitor;
          char        str[16];

          ZIGBEE_Image = *(Monitor_Data*)pMsg->Data.p;
          WM_InvalidateArea( &rect );
          hTEXT_Monitor = WM_GetDialogItem( pMsg->hWin, ID_TEXT_0 );
          sprintf( str, "%3.1f %3.1f", ZIGBEE_Image.CrossPoint.x, ZIGBEE_Image.CrossPoint.y );
          TEXT_SetText( hTEXT_Monitor, str );
          WM_InvalidateWindow( hTEXT_Monitor );
  }
          break;
  case        WM_DELETE:
          DESKTOP_Reset_APPRunning();
          break;
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}[/mw_shl_code]

PS:这是在Window窗口控件当中做的,Framewin对话框控件似乎不行
效果图
图片1.jpg
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2016-8-2 09:26:53 | 显示全部楼层
本帖最后由 emWin 于 2016-8-2 09:32 编辑

当然可以。你通过重定义窗口绘制实现的吗,还是WM_PAINT响应中实现?另,使用WM_SelectWindow()指定操作对象,也可以。
编辑说明:补充
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-8-2 09:38:08 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-8-2 10:52 编辑
emWin 发表于 2016-8-2 09:26
当然可以。你通过重定义窗口绘制实现的吗,还是WM_PAINT响应中实现?另,使用WM_SelectWindow()指定操作对 ...

我本想在ICONVIEW的WM_NOTIFY_PARENT消息中绘制,结果无法显示然而在WM_PAINT中绘制也无法显示。如果直接能在ICONVIEW的触摸事件中绘图那么程序就便于书写与管理。我现在在桌面窗口中是可以绘制的。
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-8-2 11:09:37 | 显示全部楼层
emWin 发表于 2016-8-2 09:26
当然可以。你通过重定义窗口绘制实现的吗,还是WM_PAINT响应中实现?另,使用WM_SelectWindow()指定操作对 ...

     我用WM_SelectWindow()指定了绘制的窗体后,还是无法再指定的窗体上显示啊?
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-8-3
在线时间
3 小时
发表于 2016-8-3 15:37:13 | 显示全部楼层
我用GUIBulider绘制界面,也是无法绘制图片
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-8-9 09:51:32 | 显示全部楼层
yyx112358 发表于 2016-8-1 18:02
画图需要首先在其它事件(比如按下按钮事件或者自定义事件)当中无效化窗口(告诉EMWIN这个窗口需要重绘 ...

谢谢回复,我试试。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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