wxWidgets第十一课 自定义控件渲染

说明

实现自定义的窗口绘制

例子

#include "wx/event.h"

#include "wx/dcclient.h"

void OnPaint(wxPaintEvent& event);

EVT_PAINT(CFlightInstrumentPanel::OnPaint)

void CFlightInstrumentPanel::OnPaint( wxPaintEvent& event )

{

wxClientDC dc(this);

dc.SetBackground(*wxWHITE_BRUSH);//清除背景颜色

dc.Clear();

wxPen pen(*wxRED,1);

dc.SetPen(pen);

dc.DrawRectangle(0, 0, 200, 300);

dc.SetPen(wxNullPen);

}

EVT_NC_PAINT说明

NC就是non client意思,非客户区主要包括标题栏,状态栏,工具栏和边框等区域,目前wxwidgets只是提供了EVT_NC_PAINT 唯一的一个非客户区的事件,在MFC中,还有提供WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMOUSEMOVE等事件操作,如果需要关联这些事件,就必须要过滤该事件,或者在源码中实现该类事件,目前可以通过覆盖父类的MSWWindowProc函数实现。

目前需要拖动边框的时候,客户区域不变,只是边框变大,等到边框拖动到合适的地方,鼠标弹起,客户区域重绘,这个时候在WM_NCLBUTTONUP消息中重绘界面是否会避免闪烁!!

注意1:对于无法精确渲染图形,使用图像代替

说明

例如渲染文本(翻转。),实际上最后的符号应该置顶,而不是最下面,但是制表符并没有位于顶端的圆点,这才是关键的问题。使用DrawLabel或者DrawText都很难解决该问题,如果引入图片的话,就可以轻松的解决,该方法尤其是应用在不规则的图形渲染,减轻了不少的工作量

注意2:控件靠近窗口边框闪烁问题

当控件放置在窗口边框的附近,拖动窗口的边框进行拉伸,非常明显的看到控件的上半部接近边框的地方,会发生闪烁,并且会看到图像的错位,偶尔还会出现不和谐的色块,这些现象仅仅出现在控件靠近边框的位置上。当边框拉伸的时候,会重绘边框,然后重新渲染控件,边框是有一个宽度范围,而不是一直线,因此靠近边框的控件部分会首先被遮挡,重绘,然后控件重新刷新一遍,就看到闪烁的问题。解决的方法就是讲控件的位置稍微偏离边框

时间: 2024-10-11 18:18:44

wxWidgets第十一课 自定义控件渲染的相关文章

【C++探索之旅】第一部分第十一课:小游戏,猜单词

内容简介 1.第一部分第十一课:小游戏,猜单词 2.第一部分第十二课预告:指针一出,谁与争锋 小练习 上一课<[C++探索之旅]第一部分第十课:文件读写,海阔凭鱼跃>中我们学习了读写文件的知识. 第一部分的课程也快接近尾声了,下一课我们会学习很重要的指针的知识.之后,我们就进入第二部分:面向对象编程了.哈哈哈,激动不? 目前为止,我们也学了不少内容:编译基本原理,IDE,变量,函数,条件语句,循环语句,引用,数组,文件读写,等等.你应该为自己感到自豪. 俗语说得好:实践是最好的老师.我们学了那

BeagleBone Black板第十一课: PWM子系统简介

BBB板第十一课: PWM子系统简介 查看多达4000多页的AM335X 英文手册,找到其中的15章节PWMSS,我英文学不好,翻译其中的意思真难,建议高手帮翻译一下那4000多页的手册贡献给大家. 在这里简单说下几个专业名词: PWMMSS全称Pulse-Width Modulation Subsystem 脉冲宽度调制子系统,由eHRPWM.eCAP和eQEP三个模块组成,简单的说就是三种工作模式. 下面的图为PWM子系统图(来自4000多页的手册) 1.eHRPWM全称Enhanced H

Kali Linux Web 渗透测试视频教程—第十一课-扫描、sql注入、上传绕过

Kali Linux Web 渗透测试视频教程—第十一课-扫描.sql注入.上传绕过 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/10/25/kali-linux-web-%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%E7%AC%AC%E5%8D%81%E4%B8%80%E8%AF%BE-%E6%89%AB%E6%8F%8Fsql%E6%B3%A8%

linux就该这么学第十一课

linux就该这么学第十一课 网络配置的四种方式: 1.vim /etc/sysconfig/network-scripts/ifcfg-eno 2.nmtui 图形化配置 3.nm-connection-editor图形化配置 4.右上角的图形化网络图标设置 RHEL7:nmtui RHEL5/6:setup 网络会话 查看网络 nmcli connection show 创建网络会话 nmcli connection add con-name company ifname eno167777

Python第二十一课(反射/元类)

Python第二十一课(反射/元类)    >>>思维导图>>>中二青年 反射reflect 什么是反射, 其实是反省,自省的意思 反射指的是一个对象应该具备,可以检测,修改,增加自身属性的能力 反射就是通过字符串操作属性 涉及的四个函数,这四个函数就是普通的内置函数 没有双下划綫,与print等等没有区别 hasattr getattr setattr delattr p = Person("jack",18,"man") #

wxWidgets第十三课 wxMemoryDC 使用缓存DC渲染

说明 使用wxMemoryDC渲染,可以减低闪烁,当渲染完成后,将内容,粘贴到目标DC上,其中需要借助wxBitmap作为画布.其效果相当于使用wxBufferedPaintDC,但是wxBufferedPaintDC仅限于在OnPaint函数中使用 代码 wxRect rect = GetClientRect(); int width = rect.GetWidth(); int height = rect.GetHeight(); wxMemoryDC memDC; wxBitmap bit

wxWidgets第十七课 采用AGG渲染库

说明 已有的wxDC以及所有的派生类相关的设备环境均没有实现抗锯齿的功能,毕竟wxDC也只是对CDC的封装,只有GDI+才支持抗锯齿. 在如下的代码中定义rasterizer等为静态变量的核心原因是其在进行渲染计算的时候会分配大量的内存,容易造成内存碎片,当然agg::pixfmt_bgra32 和agg::renderer_scanline_aa_solid 等并没有进行什么内存分配,但是统一起见,所以构造为静态变量,实际上,还有申请的渲染缓存指向的区域也应该设置为静态变量,然后通过指定宽和高

深入浅出CChart 每日一课——快乐高四第十一课 不离不弃,利用CChartWnd实现多区域绘图

笨笨在前面的课程里面提到,在一个窗口上不能粘多个CChartWnd,否则图像不正常,故而在高四6到8课,均使用CChart类,实现了在普通窗口.对话框窗口.DuiLib窗口上的多区域绘图. 使用CChart类必须手动处理消息,而采用CChartWnd类省去了处理消息的步骤,编程更为简便. 近几天笨笨进行了一些改进,采用CChartWnd类也可以在一个窗口上多区域绘图了. 1 首先按照前面的步骤建立一个基于Win32 Application的程序,名为LessonA11. 2 在WndProc函数

加州理工学院公开课:机器学习与数据挖掘_过拟化(第十一课)

课程简介 本节课主要介绍了关于机器学习中的过拟化问题.作者指出,区别一个专业级玩家和业余爱好者的方法之一就是他们如何处理过拟化问题.通过该课程,我们可以知道样本数据的拟合并不是越高越好,因为噪声的存在将使得过拟化问题的出现.最后简介了处理过拟合的两种方法. 课程大纲 1.什么是过拟化?(what is overfitting?) 2.过拟化中的噪声.(The role of noise) 3.确定性噪声.(Deterministic noise) 4.如何处理过拟化问题.(Dealing wit