硬汉嵌入式论坛

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

[emWin] 窗口拖动问题

[复制链接]

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
发表于 2016-5-27 17:51:11 | 显示全部楼层 |阅读模式
在创建FRAME窗口时,设置了FRAMEWIN_CF_MOVEABLE标志,可以进行鼠标拖动操作。
但效果如下图:
QQ图片20160527174659.png

后面的重影要怎么消除呢?
只能是检测到拉动一个(X,Y)距离位移后,紧接着就清除窗口原有区域,再重新画窗口?
回复

使用道具 举报

11

主题

130

回帖

168

积分

初级会员

积分
168
发表于 2016-5-28 00:02:43 | 显示全部楼层
猜测是桌面窗口的回调函数里没设置相关的操作。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-5-28 01:01:43 | 显示全部楼层
桌面窗口没有做重绘,重绘就好了。
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2016-5-28 12:26:00 | 显示全部楼层

回 eric2013 的帖子

eric2013:桌面窗口没有做重绘,重绘就好了。 (2016-05-28 01:01) 
简单的写了以下的一个重绘函数。
WM_SetCallback(WM_HBKWIN,re_paint);
static void re_paint(WM_MESSAGE *pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
   
//    GUI_SetBkColor(GUI_RED);
    GUI_Clear();
}
但这个是会把整个背景窗口都给清了。
是不是还得跟踪前景窗口的移动来做窗口区域的清理工作呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-5-29 18:55:28 | 显示全部楼层

回 jplzl10000 的帖子

jplzl10000:简单的写了以下的一个重绘函数。
WM_SetCallback(WM_HBKWIN,re_paint);
static void re_paint(WM_MESSAGE *pMsg)
{
....... (2016-05-28 12:26) 
emWin会自动重绘。
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2016-5-30 09:24:56 | 显示全部楼层

回 eric2013 的帖子

eric2013:emWin会自动重绘。 (2016-05-29 18:55) 
自动重绘?
是要调用相应的函数么?
有没有相关的例程呀。官方的WM_Redraw.c的例程里面是用的手动删除区域的方式
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2016-5-30 09:42:59 | 显示全部楼层

回 eric2013 的帖子

eric2013:emWin会自动重绘。 (2016-05-29 18:55)
看了那个教程中的33.3-33.5三个重绘的例程,里面的重绘函数只是简单的设置了背景颜色。
如果背景窗口中有其他文字或图像时,就把原来的显示给遮盖了。
而且,此种方式重绘背景窗口时,拖动的前景窗口显示上还有问题。
会短暂的清除一部份窗口,即,把前景窗口向左上移动时,前景窗口的右下角会被清除,前景窗口看上去就是被截掉了右下角,然后,停止拖动时,就重新绘制出整个窗口了。
相反,如果向右下角拖动时,前景窗口的左上角就会被清除。
显然,这种拖动效果也不理想
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2016-5-30 10:28:34 | 显示全部楼层

回 eric2013 的帖子

eric2013:emWin会自动重绘。 (2016-05-29 18:55) 
写了一个如下的回调函数:
static void re_paint(WM_MESSAGE *pMsg)
{
  switch(pMsg->MsgId)
  {
        case WM_PAINT:
        GUI_SetBkColor(0x00A000);
        GUI_SetColor(GUI_WHITE);
        GUI_Clear();
        GUI_SetFont(&GUI_Font24_ASCII);
        GUI_DispStringHCenterAt("MULTIEDIT - Sample", 160, 5);
    break;
   
      default:
        WM_DefaultProc(pMsg);
  }
}
设置了背景窗口的回调:
WM_SetCallback(WM_HBKWIN,re_paint);
可以实现拖动功能了。
但从回调函数来看,也只是每次都手动重绘了一下背景窗口。
如果背景较为复杂的话,那不是很麻烦
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-5-30 10:31:55 | 显示全部楼层
不麻烦,刷的很快的。这个属于裁剪机制。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-17 08:05 , Processed in 0.042874 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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