自绘控件 CSatic无法响应OnDrawItem-程序员宅基地

不选择在 PreSubclassWindow 中作“初始化”工作是因为用户可能在使用中改变属性,必须在一个经常进入的地方检查是否要重新“初始化”。把这项工作放到和绘制有关的消息响应函数里则父窗口一个 RedrawWindow() 就可以引起重新“初始化”。 一般步骤:1.派生控件子类2.添加 PreTranslateMessage3.进行常规操作记下消息类型4.在子类里处理消息 MFC的 CStatic 控件无法有效 SS_OWNERDRAW 属性,从而无法响应 OnDrawItem。按MSDN SDK中的static控件可以使能 SS_OWNERDRAW 并发送 WM_DRAWITEM 消息。经测试 CStatic 控件可利用的只有 WM_PAINT 消息。 设有 BS_OWNERDRAW 属性的 CButton 控件先响应 OnEraseBkgnd 再响应 DrawItem。因此调整窗口尺寸等“初始化”工作可以放再 OnEraseBkgnd 里完成。 CProgressCtrl 控件通过 SetPos 、StepIt 绘制,更改进度值不会触发 OnEraseBkgnd 消息但至少会有一次 OnEraseBkgnd,可以利用来作初始化。OnPaint 不完成绘制工作,截获该消息默认的绘制将停止。 CSliderCtrl 绘制行为类似 CProgressCtrl,截获 OnPaint 默认不绘制,但状态改变时会触发 OnPaint 消息。OnEraseBkgnd 可以用来作初始化。OnTimer 在点击轨道时触发,每500ms一次,用来模拟 PageDown/Up,在鼠标放开时timer被kill掉。如果鼠标恰好在当前位置按下则不触发 OnTimer,拖曳滑块不触发 OnTimer。 CMenu 不是 CWnd 的子类但有纯虚的 MeasureItem 和 DrawItem,绘制工作能且只能依赖它们。菜单风格包括 整体背景风格、菜单项风格、文字风格,尺寸参数包括 菜单项尺寸、菜单项图标尺寸、文字尺寸。以上种种还因菜单项状态不同改变。MEASUREITEMSTRUCT 和 DRAWITEMSTRUCT 中的 itemData 在 MF_OWNERDRAW 时都是取自 AppendMenu 、InsertMenu 、ModifyMenu 的最后一个参数,所以不得不有一个结构专门管理菜单项类型、文字、图像等信息。使用 SetMenuInfo、SetMenuItemInfo、GetMenuInfo、GetMenuItemInfo 可以方便的管理菜单信息,但要实现自绘必须有 MF_OWNERDRAW 属性,因此用一个自定义结构管理菜单项的若干重要信息仍是有意义的。自绘按钮在 MeasureItem 或 DrawItem 里设断点会引起windows菜单显示异常!折腾了很久以为是我的问题呢!GDI+ new 出的 Bitmap 对象竟然会使用相同的地址!?而且就算地址不同也有冲突?难道不能存储大量的 Bitmap 对象吗?? GdiAlloc 和 GdipCreateBitmapFrom*** 究竟怎么管理内存,new 出的对象不 delete 也不会有任何问题, 文档太少!CreateMenu 和 CreatePopupMenu 的绘图方式有差异,一定要确定到底是要哪种菜单。 支持子菜单需要动态创建、删除 CSkinMenu 实例,如果用Load方式载入按钮爬一遍即可;如果Insert方式加入的子菜单则由用户决定是否拓展,换言之应不作特殊处理。另外Detach、DestroyMenu、RemoveMenu 都应处理被扩展的子菜单。 CScrollBar 的消息反射OnVscroll、OnHscroll里设置pos是没有用的,大概反射消息只是用来通知不是用来操作。关于Scroll Bar的详细状态可以用GetScrollBarInfo获得。 CListBox的OwnerDraw属性只能在创建的时候指定,不能在PreSubclassWindow里用ModifyStyle改变。而且如果需要触发MeasureItem必须把OwnerDraw设成Variable,Fix时MeasureItem不被调用只能使用SetItemHeight设置高度。 CComboBox的edit部分由OnPaint控制,输入文字是发出OnEditChange,通过列表改变时发出OnSelchange。list部分由DrawItem控制,创立时必须有OwnerDraw风格。但CListBox似乎不能触发MeasureItem。

转载于:https://www.cnblogs.com/yuzhould/archive/2010/06/29/4455020.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34216107/article/details/93781138

智能推荐

关于Ubuntu18.04风扇狂转的解决办法_linux风扇掉了一个之后其他的狂转-程序员宅基地

文章浏览阅读6.2k次。1.关闭睿频echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo2.限制CPU最大频率到50%echo "50" | sudo tee /sys/devices/system/cpu/intel_pstate/max_perf_pct两个办法都可以,方法2更灵活,全程可以通过下面的命令实时查看:watch -n 0 "ca..._linux风扇掉了一个之后其他的狂转

【C语言】06-基本数据类型-程序员宅基地

文章浏览阅读51次。本文目录一、变量二、类型修饰符三、不同编译器环境下基本数据类型的存储长度说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略C语言有丰富的数据类型,因此它很适合用来编写数据库,如DB2、Oracle都是C语言写的。C语言的数据类型大致可以分为下...

接入第三方SDK初始化失败原因_lenovo sdk登录失败-程序员宅基地

文章浏览阅读2.4w次。接入第三方SDK初始化失败原因最近在接联通计费SDK,出现了一些问题,大家可以看下。(Java大神可以自动略过,只对SDK新人有效)各种权限以及配置文件全部做好了,但是老是提示SDK初始化失败,查询了官方文档,说是有以下三种原因,1. 如果在logcat输出中出现“----->called from error place”,说明初始化接口没有按照规定放在Applic_lenovo sdk登录失败

神舟笔记本(战神)摄像头或者相机不能使用的解决方法_神舟战神z8摄像头打不开-程序员宅基地

文章浏览阅读2.1w次,点赞22次,收藏2次。今天下午想开发一下自己摄像头,结果打不开,所以很烦躁,查了很多资料都不行,最后发现,可能大家摄像头或者相机应用不能打开的情况,与驱动和设备硬件没有关系,而是你没有打开摄像头注意这个F10 有个摄像头标注,按下fn+F10 就可以打开摄像头了。..._神舟战神z8摄像头打不开

Spring Boot 应用集成 Activiti 工作流引擎_springboot整合activiti工作流-程序员宅基地

文章浏览阅读698次。Spring Boot 应用集成 Activiti 工作流引擎_springboot整合activiti工作流

Linux/Openwrt路由安装配置UPNP服务提高迅雷下载速度_upnp安装-程序员宅基地

文章浏览阅读1w次。Linux/Openwrt路由安装配置UPNP服务提高迅雷下载速度发布时间:September 7, 2012 // 分类:OpenWrt // 1 Comment路由器下电脑为实现互联网端到端的连接需要配置DNAT(端口映射),UPNP就相当于自动化DNAT的实现,路由和客户端软件都需支持UPNP。Openwrt路由下安装UPNP服务:_upnp安装

随便推点

VSCODE C语言突然又不能跳转到定义了_vscode c语言无法跳转定义-程序员宅基地

文章浏览阅读962次。VSCODE 真是想说爱你不容易啊三天二头的不能跳到定义,跳转定义时,每次都要新打开一个文件 ,而且以前打开的,也不会理你,感觉是那么弱痴一样。没办法谁叫没更好用的编辑工具呢在网上找了半天,结果 是C/C++插件切换到了预发布版本,切换回来重启一下软件,就行了。..._vscode c语言无法跳转定义

G2plot 自定义tooltip的单条数据结构itemTpl_g2plot tooltip title fields-程序员宅基地

文章浏览阅读560次。fileds字段列出来需要用的字段_g2plot tooltip title fields

Java Web前端——HTML常用标签_java<html><font color='red'>-程序员宅基地

文章浏览阅读209次。html简介1.1 html概述html全称:Hyper Text Markup Language(超文本标记语言)超级文本标记语言是标准通用标记语言(SGML)下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符。可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。 浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执_java

一些反射常用的工具类-程序员宅基地

文章浏览阅读388次。拷贝属性:[code="java"]1.org.apache.commons.beanutils.PropertyUtils.setProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException..._反射线工具

Java - 遍历数组 (for each)_java遍历数组foreach-程序员宅基地

Java中的for each循环可以用于遍历数组。通过for each循环,可以简洁地访问数组中的每个元素。本文介绍了如何使用for each循环遍历数组,并给出了相应的代码示例和输出结果。

Mysql 删除某条数据使自增id重置_mysql 删除自增id mysql删除数据后id自动重置-程序员宅基地

文章浏览阅读454次。alter table table名auto_increment = 自增位置;_mysql 删除自增id mysql删除数据后id自动重置