深入浅出CChart 每日一课——快乐高四第五十七课 新的起点,炫彩界面库之老树新芽

CChart对多种DirectUI库具有良好的适配性,炫彩界面库也不例外。前面已经有两篇关于炫彩界面库的课程,分别是第17课“深入浅出CChart 每日一课——第十七课 时尚加潮流,DirectUI之炫彩界面库_baita96的博客-CSDN博客”和A52课“深入浅出CChart 每日一课——快乐高四第五十二课 旧梦重温,天上人间之炫彩界面库_baita96的博客-CSDN博客_炫彩界面库”。

其中第17课讲述的是在炫彩主窗口绘图的方法,A52课讲述的是在炫彩界面元素上绘图的方法。第17课没有使用UI设计器,A52课使用了一个较老版本v2.1.1的UI设计器。这两课针对的炫彩版本都比较古老,其内容只能作为参考,在最新的版本中不一定能正常编译和运行。

截至目前为止,炫彩界面库和炫彩设计器(IDE)的最新版本为v3.3.5。

在炫彩界面库作者梦飞同学的邀请下,笨笨计划对炫彩界面库中CChart的使用发布一个系列教程。

本节课作为系列教程的第一课,计划对A52课的内容进行改进,使之能在最新版本的炫彩界面库中运行。

A57.1 界面布局文件

仿照A52课,我们利用最新版的UI设计器做一个完全一样的界面布局,工程名仍为Simple。如图所示。

 

在客户区首先添加一个布局元素控件,充满整个客户区。

然后再在这个控件里面添加两个布局元素控件。第一个控件高度方向充满父控件,宽度设置为100。第二个控件高度方向充满父控件,宽度设置为”:1”,即占用剩余空间。

在左边的layoutObject控件里放置一个按钮控件,内容属性修改为“信息按钮”,ID设置为ID_BUTTON_1。

在右边的layoutObject控件里放置一个基础元素控件,ID设置为ID_PICTURE_1,我们的图就准备画在这个控件上。

下面就是我们添加的所有控件之间的隶属关系。

与A52课的v2.1.1版界面设计器的结果相比,v3.3.5版设计器给出的设计结果主要有两点不同。

一是标题栏已有默认内容,不用自行处理。旧版设计器标题栏是空的,需要手动添加一个关闭按钮。

二是各元素的ID可以保存为字符串,不再是没有明显内涵的数字,这就方便多了。新版设计器的这个功能已经是免费的了。

 

最后是设计器给出的xml文件。 

<?xml version="1.0" encoding="UTF-8"?>
<!--炫彩界面库-窗口布局文件-->
<head><bindJsFile value="" />
</head>
<windowUI center="true" content="炫彩界面库 - 我的窗口名" rect="20,20,709,537" showT="true" windowStyle="2031"><layoutEleUI layout.height="fill" layout.width="fill" rect="82,30,693,499" showT="true" expandT="true"><layoutEleUI layout.height="fill" layout.width="150" rect="0,0,100,100" showT="true" expandT="true"><buttonUI content="信息按钮&#10;" id="@ID_BUTTON_1" rect="270,89,60,25" showT="true" expandT="true" /></layoutEleUI><layoutEleUI layout.height="fill" layout.width=":1" rect="240,87,100,100" showT="true" expandT="true"><elementUI id="@ID_PICTURE_1" layout.height="fill" layout.width="fill" rect="74,29,100,100" showT="true" expandT="true" /></layoutEleUI></layoutEleUI>
</windowUI>

这个文件用设计器实现很简单,用手撸的话,那就比较困难了。

A57.2 代码编写

A52课采用的是VS2010编写代码,其实炫彩界面库的兼容性非常好,还支持古老的VC6。

由于VC6的操作相对简单,本次炫彩界面库的系列教程就采用VC6进行介绍。对于高版本VS,也是完全没有问题的。

1、首先用VC6建立一个名为LessonA57的Win32 Application空工程,注意是空工程。

2、新建一个cpp文件加入工程,其内容是炫彩说明书中以cpp方式加载界面布局文件的模板,和A52课完全一样。如下:

#pragma comment(lib, "XCGUI.lib")
#include "xcgui.h"class CMyWindowDemo
{
public:HWINDOW m_hWindow;CMyWindowDemo(){Init();}void Init(){XC_LoadResource(L".\\resource.res");  //加载资源文件HXCGUI hXCGUI=XC_LoadLayout(L".\\layout.xml"); //加载布局文件if(XC_IsHWINDOW(hXCGUI)){m_hWindow=(HWINDOW)hXCGUI;//XC_GetObjectByID(m_hWindow, 100); //获取指定ID对象//XC_GetObjectByName(L"name") //获取指定name对象//XC_ShowLayoutFrame(TRUE); //显示布局边界XWnd_AdjustLayout(m_hWindow);XWnd_ShowWindow(m_hWindow,SW_SHOW);}else{//错误}
};int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{XInitXCGUI(FALSE);CMyWindowDemo  MyWindow;XRunXCGUI();XExitXCGUI();return 0;
}

注意到WinMain函数里面第一行,XInitXCGUI(FALSE);

这个函数的参数表示炫彩是否以Direct2D作为渲染引擎。这里我们暂时不考虑Direct2D ,故参数设置为FALSE。

3、将炫彩的三个库文件xcgui.h、XCGUI.lib、XCGUI.dll拷贝到LessonA57文件夹中。

4、编译。

第一次编译,发现一百多个错误。

 

什么,连个RECT结构都不认识?这个不是在windows.h中定义的吗?那肯定要加上这句话咯!

#include <windows.h>

 

注意,这句话要加在#include “xcgui.h”之前。

再编译,发现只有一个错误了!

 

这个嘛,我们直接把梦飞同学提供的xcgui.h文件中2287行的strcpy_s改成strcpy,编译就成功了!

5、把设计器设计的工程,连同文件夹一起拷贝到LessonA57里面。

在Init()函数里正确设置布局文件的路径。

        XC_LoadResource(L".\\Simple\\resource.res");  //加载资源文件HXCGUI hXCGUI=XC_LoadLayout(L".\\Simple\\main.xml"); //加载布局文件

现在再编译,运行程序如图。

 

程序基本成型,下面添加CChart的支持,其过程和A52课完全一样。

6、把CChart的库文件拷贝到LessonA57文件夹,在cpp的开始加上CChart的支持,以及数学库的支持。

#include "Chart.h"
#if defined(_UNICODE) || defined(UNICODE)
#	pragma comment(lib,"CChartu.lib")
#else
#	pragma comment(lib,"CChart.lib")
#endifusing namespace NsCChart;#include <math.h>

7、在HWINDOW m_hWindow;这一行下面添加一个CChart绘图变量。

CChart m_Chart;

8、在Init()函数里初始化绘图变量。

        double pi=4.0*atan(1.0);for(int i=0; i<720; ++i){m_Chart.AddPoint2D(i, 1.3*sin(i*2.0*pi/360));}m_Chart.SetTitle(_T("炫彩界面库"));

9、编写绘图函数并注册。

绘图函数如下,注意它是CMyWindowDemo类的成员函数。

    int OnPanelDraw(HDRAW hDraw,BOOL *pbHandled){RECT rect;HELE hPanel = (HELE)XC_GetObjectByIDName(m_hWindow, L"ID_PICTURE_1");XEle_GetClientRect(hPanel, &rect);HDC hDC = XDraw_GetHDC(hDraw);XEle_DrawEle(hPanel, hDraw);m_Chart.OnDraw(hDC, rect);*pbHandled=TRUE;return 0;}

在Init()中注册这个绘图函数。

            HELE hPanel = (HELE)XC_GetObjectByIDName(m_hWindow, L"ID_PICTURE_1");XEle_RegEventCPP(hPanel, XE_PAINT, &CMyWindowDemo::OnPanelDraw);

注意到这里与A52课不同的地方在于,我们把资源号保存在字符串里面,这里用XC_GetObjectByIDName取得资源句柄。

程序已经可以运行。

 10、编写消息响应函数并注册

所有消息响应函数如下:

    int OnEleLButtonDown(UINT nFlags,POINT *pPt,BOOL *pbHandled){HWND hWnd = XWnd_GetHWND(m_hWindow);if(m_Chart.OnLButtonDown(hWnd, *pPt, 0)){XWnd_Redraw(m_hWindow);}*pbHandled = FALSE;return 0;}int OnEleLButtonUp(UINT flags,POINT *pPt,BOOL *pbHandled){HWND hWnd = XWnd_GetHWND(m_hWindow);if(m_Chart.OnLButtonUp(hWnd, *pPt, 0)){XWnd_Redraw(m_hWindow);}*pbHandled = FALSE;return 0;}int OnEleLButtonDblClk(UINT nFlags,POINT *pPt, BOOL *pbHandled){HWND hWnd = XWnd_GetHWND(m_hWindow);if(m_Chart.OnLButtonDblClk(hWnd, *pPt, 0)){XWnd_Redraw(m_hWindow);}*pbHandled = FALSE;return 0;}int OnEleRButtonDown(UINT nFlags,POINT *pPt, BOOL *pbHandled){HELE hPanel = (HELE)XC_GetObjectByID(m_hWindow, 151);XEle_PointClientToWndClient(hPanel, pPt);HWND hWnd = XWnd_GetHWND(m_hWindow);ClientToScreen(hWnd, pPt);if(m_Chart.OnContextMenu(NULL, hWnd, *pPt)){XWnd_Redraw(m_hWindow);}*pbHandled = FALSE;return 0;}int OnEleMouseMove(UINT nFlags,POINT *pPt, BOOL *pbHandled){HWND hWnd = XWnd_GetHWND(m_hWindow);if(m_Chart.OnMouseMove(hWnd, *pPt, 0)){XWnd_Redraw(m_hWindow);}*pbHandled = FALSE;return 0;}int OnEleKeyDown(WPARAM wParam,LPARAM lParam,BOOL *pbHandled){HWND hWnd = XWnd_GetHWND(m_hWindow);UINT	key = (UINT)wParam;if(m_Chart.OnKeyDown(hWnd, key)){XWnd_Redraw(m_hWindow);}*pbHandled = FALSE;return 0;}

 

注意到由于版本升级,A52课中的接口XWnd_RedrawWnd改变为XWnd_Redraw。

同时,这里比A52课多编写了一个键盘消息响应函数OnEleKeyDown。

注册代码如下,放置在上一条注册代码之后。

            XEle_RegEventCPP(hPanel, XE_LBUTTONDOWN, &CMyWindowDemo::OnEleLButtonDown);XEle_RegEventCPP(hPanel, XE_LBUTTONUP, &CMyWindowDemo::OnEleLButtonUp);XEle_RegEventCPP(hPanel, XE_LBUTTONDBCLICK, &CMyWindowDemo::OnEleLButtonDblClk);XEle_RegEventCPP(hPanel, XE_RBUTTONDOWN, &CMyWindowDemo::OnEleRButtonDown);XEle_RegEventCPP(hPanel, XE_MOUSEMOVE, &CMyWindowDemo::OnEleMouseMove);XEle_RegEventCPP(hPanel, XE_KEYDOWN, &CMyWindowDemo::OnEleKeyDown);

好了,到此为止,已经完成了代码编写(界面左边那个按钮就不管了)。

11、DirectUI修正。

这时候实际上还有一个小问题。如果你试着拖动图例,你会发现图例位置似乎不能按你的想法移动。

造成这个问题的原因,在于炫彩是DirectUI库,只有一个主窗口句柄。而CChart是基于句柄的,在CChart的消息响应中,会把绘图元素的父窗口认成炫彩的全局主窗口,而实际上其父窗口只是其上级元素。这就造成了坐标错位。

CChart库已经对这个问题进行了处理,只需要加入如下代码即可修正这个问题。

            RECT rect;XEle_GetWndClientRect(hPanel, &rect);m_Chart.SetAdditionalCanvasOffset(rect.left, rect.top);m_Chart.SetDuiRepair(true);

注意到这段代码的位置有要求,必须把它放置在主窗口显示代码XWnd_ShowWindow(m_hWindow,SW_SHOW);这一行之后才能正确发挥作用。原因在于必须在窗口显示以后,XEle_GetWndClientRect才能获取到正确的坐标。

打完收工!

本课的内容和A52课基本一致,但这里仍然叙述得比较详细,主要是因为本节课的内容是这个炫彩界面库系列教程的基础,为了方便大家参考,不用再不停地切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621191.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

09-微信小程序 网络请求API(实现轮播广告和简易的聊天窗口)

09-微信小程序API网络请求(实现轮播广告和简易的聊天窗口) 文章目录 微信小程序API服务器域名配置注意网络相关APIrequestRequestTask 请求任务对象object.success 回调函数object.fail 回调函数案例代码&#xff08;实现轮播图&#xff09; WebSocket案例代码&#xff08;实现…

画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试

自己的画的炫彩“月饼”到了&#xff0c;本文就开始带大家来玩玩我们自己的月饼 ......by 矜辰所致前言 板子昨天就到了&#xff0c;下了班抽空把板子焊接了一下。 本文就来分享一下拿到 PCB 板子后开始的测试过程&#xff0c;也当做给初学者一个教学。 本 “月饼” 的原理…

iPad新5.0笔刷真的巨好用,技术不够笔刷来凑

工欲善其事必先利其器&#xff01;&#xff01;今天我们为你精选了 Procreate新款笔刷合集 01 Procreate 趣味复古蜡笔纹理笔刷15款 适用软件&#xff1a;Procreate5.0以上 适用系统&#xff1a;ipad系统 笔刷格式&#xff1a;brushset 素材大小&#xff1a;93MB 赠送15款…

平板触控笔要原装的吗?时下最火的平替苹果笔测评

在我们购买ipad的时候&#xff0c;我们是否会想要一支与ipad相配套的电容笔&#xff1f;其实&#xff0c;如果仅仅是为了学习或者记录&#xff0c;也没必要花那么多钱去购买一支苹果原装电容笔。平替电容笔不仅质量好&#xff0c;价格也相对实惠&#xff0c;是一种很不错的学习…

10个超酷的H5特效设计+1个仿最新苹果UI设计(压轴)

欢迎关注b站&#xff1a;小淼前端 有更多的视频讲解源代码可领取哦~ 欢迎关注b站&#xff1a;小淼前端 有更多的视频讲解源代码可领取哦~ 目录 欢迎关注b站&#xff1a;小淼前端 有更多的视频讲解源代码可领取哦~ 欢迎关注b站&#xff1a;小淼前端 有更多的视频讲解源代…

python炫彩界面库实现漂亮的登录注册窗口

下面是运行截图 from xcgui import *XInitXCGUI("") #初始化UI库 XPy_Init() #初始化UI库Py支持hWindow 0 hLayoutContent0 hCurPanel0def SwitchTab(strTy):global hCurPanelif hCurPanel:XEle_Destroy(hCurPanel)if "登陆"strTy:hCurPanel XC_LoadLayo…

老外iPad新人之10款必备应用

1. iPad打了鸡血了, 80天卖了300万台, 就算每台500美元的话,就卖了15亿美元。 2. iPad应用超过11000款,Appstore上iPad应用下载超过1200万次。 3. 手持iPad的名流如云。 无数明星政客竞折腰, 以至于iPad黑客狂喜, FBI说真麻烦~~~ 4. 联通高层直接去了美国旧金山的库比蒂…

让强大的python披上绚丽的外衣-炫彩GUI可视化界面库的使用(1)

让强大的python披上绚丽的外衣-炫彩GUI可视化界面库的使用&#xff08;1&#xff09; 作为python的忠实粉丝&#xff0c;对python的各种强大毋庸置疑。在工作中常用pyhton开发一些简单小工具可谓是得心应手&#xff0c;可是要拿给他人使用的时候就郁闷了&#xff0c;自带的TK界…

炫彩界面库UI设计器分享, 集成开发环境,C++,易语言

炫彩在线帮助文档 炫彩UI截图 炫彩IDE UI设计器 截图 炫彩webUI 炫彩缓动 炫彩 易语言 火山PC例子截图 简介 炫彩界面库–软件界面开发框架,让用户快速开发桌面软件变的简单高效;功能丰富(一千多个API接口), 简单易用,轻量级,高度DIY自定义,一键换肤,满足不同软件UI需求,安…

好玩的Ipaddian

从微薄上看到一个应用ipaddian,效果图&#xff1a; 从WIN7上模拟Ipad

魔术般效果 苹果iPad热门软件你选谁

魔术之所以受欢迎并不是因为它有什么实际意义&#xff0c;而是纯粹的好看、好玩&#xff0c;苹果App Store上也有类似的小程序&#xff0c;把它们安装在iPad上&#xff0c;就能产生不可思议的效果&#xff0c;今天ZOL平板电脑频道为大家带来五款神奇的小软件&#xff0c;一起看…

STM32F407基础总结系列(一)

STM32F407基础总结系列&#xff08;一&#xff09; 一、前言二、STM32F407部分基础小知识&#xff08;待整理&#xff09;1 外设设置相关1.1 GPIO使用1.2 定时器PWM波1.3 外部晶振参数修改 2 语言及使用环境相关2.1 C/C2.2 F407的启动文件 3 测试验证相关3.1 PWM配置IO引脚3.2 …

C#制作挂机程序V2.0—刷鼠标单击类在线视频

文章目录 往期内容回顾一、程序界面二、功能说明1.程序已经集成了Microsoft Spy的功能2.通过拖动工具自动获取窗体的Title3.拖动工具自动获取鼠标准备单击点的坐标4.通过时间设置单击事件后等待时间&#xff08;刷视频必备&#xff09;5.浏览器应用程序不再局限于FireFox6.适应…

菜鸡的秋招升级打怪之旅

记录秋招。。。 旷视一面&#xff08;2022.08.12&#xff09; softmax&#xff0c;交叉熵loss实现 import numpy as np import torch import torch.nn.functional as Fdef softmax(logits):logits_exp torch.exp(logits)logits_softmax logits_exp / torch.sum(logits_exp, …

7000字爆肝!我把14个自学编程的压箱底网站全部分享给你们啦

前一段时间&#xff0c;一个初学编程的小伙子跟我说&#xff0c;他一般在某站上找视频自学&#xff0c;但是学了2个多月&#xff0c;刚开始学的知识已经忘得差不多了&#xff0c;现在再继续学下去又听不懂&#xff0c;该怎么办&#xff1f; 经过一夜深思&#xff0c;终于想出了…

给你5分钟白漂:这些都是我的常用在线工具和网站

小伙伴们大家好&#xff0c;本期再托一次家底&#xff0c;和大家分享十几个自己日常工作学习过程中的常用在线工具和网站&#xff0c;希望能有帮助。 也欢迎小伙伴们分享和安利出你们觉得有用的工具&#xff0c;不要停啊。 注&#xff1a;本文 Github开源项目&#xff1a;gith…

吃透OLED显示原理——玩转OLED模块各种使用方法

oled模块有4种工作模式&#xff0c;分别是6800、8080两种并行接口方式、 4线的穿行SPI接口方式、IIC接口方式。通过模块的BS1/BS2设置&#xff08;通过硬件来设置&#xff09;&#xff0c;BS1/BS2的设置与模块接口模式的关系如表所示&#xff1a; 这是其中一种工作方式的模块&…

推荐52个堪称神器的学习网站,每天坚持一小时,让你受益一生【上】

本篇文章分为上下篇&#xff0c;给大家整理了一些终身受益&#xff0c;堪称神器的学习网站&#xff0c;什么行业的学习网站都有&#xff0c;推荐给大家&#xff0c;里面都是满满的干货&#xff0c;我就不过多介绍了&#xff0c;大家自行探索。 社区类 1、GitHub 我就不吭气&…

C++贪吃蛇(控制台版)

C自学精简实践教程 目录(必读) 目录 主要考察 需求 输入文件 运行效果 实现思路 枚举类型 enum class 启动代码 输入文件data.txt 的内容 参考答案 学生实现的效果 主要考察 模块划分 文本文件读取 UI与业务分离 控制台交互 数据抽象 需求 用户输入字母表示方…