UCGUI编程三:背景窗口重绘

UCGUI编程三:背景窗口重绘官方例程如下 include GUI h include WM H include FRAMEWIN H staticvoid cbBkWindow WM MESSAGE pMsg switch pMsg MsgId caseWM PAINT GUI ClearRect 0 50 319 239 def

官方例程如下:

#include "GUI.h" #include "WM.H" #include "FRAMEWIN.H" static void _cbBkWindow(WM_MESSAGE *pMsg) { switch(pMsg->MsgId) { case WM_PAINT: GUI_ClearRect(0, 50, 319, 239); default: WM_DefaultProc(pMsg); } } static void _cbWindow(WM_MESSAGE *pMsg) { GUI_RECT Rect; switch(pMsg->MsgId) { case WM_PAINT: WM_GetInsideRect(&Rect); GUI_SetBkColor(GUI_RED); GUI_SetColor(GUI_YELLOW); GUI_ClearRectEx(&Rect); GUI_DrawRectEx(&Rect); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font8x16); GUI_DispStringAt("Foreground window", 75, 40); break; default: WM_DefaultProc(pMsg); } } static void _MoveWindow(const char *pText) { WM_HWIN hWin; int i; hWin = WM_CreateWindow(10, 50, 150, 100, WM_CF_SHOW, _cbWindow, 0); GUI_Delay(100); for (i = 0; i < 40; i++) { WM_MoveWindow(hWin, 2, 2); GUI_Delay(100); WM_Invalidate(WM_HBKWIN); } if (pText) { GUI_DispStringAt(pText, 5, 50); GUI_Delay(100); } WM_DeleteWindow(hWin); WM_Invalidate(WM_HBKWIN); GUI_Exec(); } static void _DemoRedraw(void) { WM_CALLBACK *_cbOldBk; GUI_SetBkColor(GUI_BLACK); GUI_Clear(); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("WM_Redraw - Sample", 160, 5); GUI_SetFont(&GUI_Font8x16); while(1) { _MoveWindow("Background has not been redrawn"); GUI_ClearRect(0, 50, 319, 239); GUI_Delay(1000); _cbOldBk = WM_SetCallback(WM_HBKWIN, _cbBkWindow); _MoveWindow("Background has been redraw"); WM_SetCallback(WM_HBKWIN, _cbOldBk); } } /* * * MainTask * */ void MainTask(void) { GUI_Init(); //WM_SetDesktopColor(GUI_BLACK); //My Add //FRAMEWIN_Create("FrameWin", (WM_CALLBACK *)0, WM_CF_SHOW, 0, 50, 319, 189); //My Add _DemoRedraw(); }

这里写图片描述
           图2
在UCGUI手册中有如下一段话:
这里写图片描述
  因为背景窗口没有默认背景颜色,也没有设置回调函数,不会自动重绘,所以第71行调用_MoveWindow()函数移动矩形窗口时的移动痕迹没有清除,如图2。
  第76行代码设置了自定义的回调函数后,第二个样例的移动没有痕迹,如图2。从这里可以看出矩形窗口每移动一次,背景窗口的回调函数就收到一次WM_PAINT消息,背景窗口就重绘一次
  实验时发现第73、74行和第57、58行代码作用有重复了,注释掉第73、74行后,第一个样例移动完后也会删除,虽然是在_MoveWindow()返回后设置的背景窗口的回调函数。官方例程的意思是对于删除矩形窗口后背景窗口的重绘,第一次移动是通过73、74行直接清除一定矩形区域实现的,第二次移动是通过回调函数实现的。
  _MoveWindow()函数尾部的WM_Invalidate(WM_HBKWIN)和GUI_Exec()函数的在第一个样例中的主要作用是为了矩形窗口删除后进行背景窗口的重绘,通过76行设置的回调函数(将73、74行注释后)实现的;在第二个样例中又有个额外的作用就是人为触发一次回调函数,因为移动完后又将背景窗口的回调函数设置回了默认值(80行),这里如果不人为触发一次自定义的回调函数就会调用默认回调函数,这样就无法调用自定义回调函数重绘背景窗口,可以看出窗口管理器发出WM_PAINT消息后如果接着设置新的回调函数,则会调用新的回调函数,就如上述注释掉第73、74行后的行为一样。
  结果对比:
  1)注释掉73、74行
  第一次移动有痕迹,移动完后背景窗口“WM_Redraw – Sample”字符串以下区域重绘;第二次移动没有痕迹,移动完后背景窗口“WM_Redraw – Sample”字符串以下区域重绘。
  2)注释掉57、58行
  第一次移动有痕迹,移动完后背景窗口“WM_Redraw – Sample”字符串以下区域重绘;第二次移动没有痕迹,移动完后背景窗口“WM_Redraw – Sample”字符串以下区域不重绘。
  3)注释掉57、58、79行
  第一次移动有痕迹,移动完后背景窗口“WM_Redraw – Sample”字符串以下区域重绘;第二次移动没有痕迹,移动完后背景窗口“WM_Redraw – Sample”字符串以下区域重绘。




























版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229732.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午4:01
下一篇 2026年3月16日 下午4:01


相关推荐

  • dovecot MySQL配置_Dovecot配置笔记

    dovecot MySQL配置_Dovecot配置笔记Dovecot 配置笔记 2018 09 13Dovecot 是一个开源的 为 Linux Unix like 系统提供 IMAP POP3 服务的软件 主要是为了安全产生的 不管大小应用 Dovecot 都是一个非常优秀的选择 它非常快 配置简单 不需要专业的管理员 而且它也非常节省内存 以上是来自 http www dovecot org 官方的介绍 下面我们来纪录记录一下它的安装 这里我使用了 CentOS

    2026年3月18日
    2
  • python停用词表整理_python停用词表

    python停用词表整理_python停用词表广告关闭腾讯云11.11云上盛惠,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!stop_words:设置停用词表,这样的词我们就不会统计出来(多半是虚拟词,冠词等等),需要列表结构,所以代码中定义了一个函数来处理停用词表…前言前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如…

    2022年6月15日
    32
  • java怎么键盘录入字符串

    java怎么键盘录入字符串-java怎么键盘录入字符串如图所示:来看一下每句代码的意思:先写上:importjava.util.Scanner//导入java.util包下的Scanner类,导入后才能使用它接着:Scanner.sc=newScanner(System.in);//new是指创建了一个scanner类,在创建Scanner类的对象时要用System.in作为…

    2022年7月16日
    16
  • 即梦AI最新版,一键生成王炸PPT!看完彻底懵了……

    即梦AI最新版,一键生成王炸PPT!看完彻底懵了……

    2026年3月13日
    2
  • 2021win7激活码-激活码分享

    (2021win7激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    63
  • Coze智能体本地部署保姆级教程

    Coze智能体本地部署保姆级教程

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号