上一节内容已经搭好了主框架,本章就在这个框架下添砖加瓦了。这一节主要讲SOUI的消息映射,在SOUI里使用了WTL的消息映射方式,当主窗口收到消息后会根据情况转发消息给SOUI的控件,在控件里我们使用本

//消息映射列表SOUI_MSG_MAP_BEGIN()SOUI_MSG_MAP_END()

来处理消息。在这之前添加关心的消息即可,所有可用消息查看msgcrack.h即可查看。对于一大多数消息直接 MSG_WM_XXXX(XXXX代表消息名比如MSG_WM_SIZE即可处理WM_SIZE消息)。而且这个消息信息已经被crack了,可以直接使用。

// void OnSize(UINT nType, CSize size)
#define MSG_WM_SIZE(func) \if (uMsg == WM_SIZE) \{ \SetMsgHandled(TRUE); \func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \lResult = 0; \if(IsMsgHandled()) \return TRUE; \}

如上MSG_WM_SIZE的定义,上面注释的函数即是你需要用来处理这个消息的函数原型。这样就可以方便的处理各种消息。当然还提供了消息区间等其它方便处理的宏。

这里我们要自绘控件当然少不了处理绘制消息WM_PAINT。但是因为WM_PAINT默认情况下传入的是DC,但是SOUI是DUI,它定义了自己的绘制对像,所以它重定义了一个MSG_WM_PAINT_EX宏来处理绘制消息。代码如下:

#pragma once
#include <core\SWnd.h>SNSBEGINclass SCharts :public SWindow
{DEF_SOBJECT(SWindow, L"scharts")public:protected:void OnPaint(IRenderTarget* pRT);//属性列表SOUI_ATTRS_BEGIN()SOUI_ATTRS_END()//消息映射列表SOUI_MSG_MAP_BEGIN()MSG_WM_PAINT_EX(OnPaint)SOUI_MSG_MAP_END()
};SNSEND

这样我们实现OnPaint即可实现自定义绘制。

下面绘制一个拆线图:

最后效果如下:

SCharts.h

#pragma once
#include <core\SWnd.h>
#include <vector>SNSBEGINclass SCharts :public SWindow
{DEF_SOBJECT(SWindow, L"scharts")public:protected:void OnPaint(IRenderTarget* pRT);void CalcPoint(std::vector<POINT>& ptList);//属性列表SOUI_ATTRS_BEGIN()SOUI_ATTRS_END()//消息映射列表SOUI_MSG_MAP_BEGIN()MSG_WM_PAINT_EX(OnPaint)SOUI_MSG_MAP_END()
};SNSEND

SCharts.cpp

#include "stdafx.h"
#include "SCharts.h"
#include <random>void SCharts::OnPaint(IRenderTarget* pRT)
{SPainter painter;BeforePaint(pRT, painter);std::vector<POINT> ptList;std::default_random_engine random(time(NULL));CRect rcClient;GetClientRect(&rcClient);std::uniform_int_distribution<int> dis1(0, rcClient.Height());for (int i = 0; i < 500;i++) {ptList.push_back({ i * 10,dis1(random)});}CalcPoint(ptList);pRT->DrawLines(ptList.data(), ptList.size());AfterPaint(pRT, painter);
}void SCharts::CalcPoint(std::vector<POINT>& ptList)
{CRect rcClient;GetClientRect(&rcClient);for (auto& pt : ptList){pt.x +=rcClient.left ;pt.y = rcClient.bottom - pt.y;}
}

XML仅仅是简单的去掉了前面的背景色。

上面的绘制代码主要调用DrawLines来绘制多线条。

PS:BeforePaint和AfterPaint用于保存和恢复IRenderTarget的绘制对象。因为SOUI的调用是一层一层绘制的,如果你不恢复绘制对象将会影响后面的绘制。

SOUI自定义控件(3)相关推荐

  1. SOUI自定义控件(1)

    本文内容旨在完成一个供了常规的折线图.柱状图.散点图.饼图.K线图,用于统计的盒形图,用于地理数据可视化的地图.热力图.线图,用于关系数据可视化的关系图.treemap.旭日图,多维数据可视化的平行坐 ...

  2. SOUI自定义控件(2)

    本系列文章基于VS2022+SOUI4,对于SOUI4相对于SOUI3来说主要是添加了导出C接口的能力,对应的代码上也比较多的采用了宏,当然原理上和SOUI3并没有太大差别. 一面来具体实现我们的图表 ...

  3. 开发Eclipse自定义控件

    摘自:http://www.ibm.com/developerworks/cn/opensource/os-eclipcntl/ 我们在开发自定义控件时主要考虑以下问题: 1. 自定义控件的绘制:通常 ...

  4. qt获取当前系统音量值_Qt编写自定义控件50-迷你仪表盘

    一.前言 这个控件取名叫迷你仪表盘,是以为该控件可以缩小到很小很小的区域显示,非常适合小面积区域展示仪表数据使用,还可以手动触摸调节进度,是我个人觉得最漂亮小巧的一个控件.初次看到类似的控件是在一个音 ...

  5. 【iOS】自定义控件入门:可拖动的环形进度

    有时候UIKit的标准控件并不能满足我们的需求,因此我们可以通过自定义控件得到满足我们需求的控件,例如这篇文章将教你如何自定义一个圆形的进度条,并且用户可以通过拖动进度条上的手柄来改变进度值.主要参考 ...

  6. Android自定义控件系列之基础篇

    一.概述 在android开发中很多UI控件往往需要进行定制以满足应用的需要或达到更加的效果,接下来就通过一个系列来介绍自定义控件,这里更多是通过一些案例逐步去学习,本系列有一些典型的应用,掌握好了大 ...

  7. C#自定义控件四简易时钟

    C#自定义控件四简易时钟 效果图: 简易时钟,顾名思义,简单容易,简单到什么程度呢?界面只有数字和指针,甚至连与当前时间都不能匹配!呵呵!就这么简单,学习嘛,从简单开始. 毫无疑问,这里肯定要用到Ti ...

  8. 对做C#自定义控件的一点心得

    近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装这个COM组件,中间遇到很多曲折,研究了一个星期,终于完成了 下面总结一下我做DSOFramer这个自定义控件的注意地方: 1.在创建 ...

  9. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经知道了,要开发自定义的控件一般继承三个基 类:Control,WebControl,还有一个就 ...

  10. Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

    Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

最新文章

  1. 嵌入式开发中使用DDD进行调试
  2. scala语法注意点小结
  3. SpringBoot 统一异常处理 ControllerAdvice
  4. 【android】【转】class android.media.MediaPlayer
  5. Type Casting
  6. jQuery 表单选择器
  7. java 调用scala 类_如何使用java类加载器调用带参数的scala函数?
  8. mysql mysql_set_charset_SQL注入攻击之 mysql_set_charset [转]
  9. RocketMQ的架构设计详解
  10. NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
  11. 自然语言交流系统 phxnet团队 创新实训 个人博客 (十一)
  12. Maven学习笔记1
  13. sharepoint如何解锁被用户锁定的文件?
  14. 游戏开发学习路线——游戏引擎原理
  15. 镁光闪存颗粒对照表_最全的内存颗粒编码规则说明,教你看穿内存条到底用的什么颗粒...
  16. wget 和scp对比_Linux中curl命令和wget命令的使用介绍与比较
  17. python修改图片,Python之修改图片像素值的方法
  18. 随机过程之一——关于条件数学期望
  19. ubuntu 下怎么查看内存条状况
  20. javac -d,-cp是什么意思

热门文章

  1. 85条高级AutoCAD工程师绘图技巧(1)
  2. 联想z5 android8,联想Z5
  3. android 坏点测试软件,烧屏坏点检测软件下载-烧屏坏点检测官方安卓版v1.0-魅卓网...
  4. linux yum源配置
  5. 2019年“深圳杯”数学建模挑战赛B题解题思路(一)
  6. 使用phpquery采集小说
  7. UE4 下载4.11.2的时候:当前遇到连接问题,正在重试
  8. Hexo添加可控制网易云音乐播放器
  9. Java汽车租赁系统[源码+数据库]
  10. Opencv实现身份证OCR识别