热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

处理WM_PAINT和WM_DRAWITEM

通常,当处理一个WM_PAINT或WM_DRAWITEM窗口消息时,应当在窗口中绘制。当绘制窗口客户区的时候,由系统发送WM_PAINT窗口消息;
通常,当处理一个W M _ PA I N T或W M _ D R AW I T E M窗口消息时,应当在窗口中绘制。当
绘制窗口客户区的时候,由系统发送W M _ PA I N T窗口消息;当需绘制控件的某部分时,
W M _ D R AW I T E M消息被发送到用户绘制控件的物主窗口。
也可以在其他时间画,但必须注意,下一次处理W M _ PA I N T消息时,无论画什么都将被
绘图过程所覆盖。要想再在窗口绘图,只能作为鼠标命令的结果移动对象或线条,例如,在
视图中,用鼠标绘制一个套索框框选取一组目标。
注意 可以用C W n d : : L o c k WindowUpdate( )停止绘图过程绘制窗口。然而,这时该窗口

就不能被移动了。

  • 处理WM_PAINT
void CMyWnd::OnPaint()
{
	CPaintDC dc(this); //creates a device context
	
	//draw to dc
	
}

这里看到的C P a i n t D C类是C D C类的派生类。它不仅创建一个设备环境,而且在OnPaint( )
返回和C P a i n t D C析构自己时销毁该设备环境。

  • 只绘制被无效化的区域

为了防止过度的屏幕闪烁并加快刷新速度,从C P a i n t D C获得的设备环境不总是允许绘制
一个窗口的整个客户区,而只允许重画窗口中发生变化的部分(如一个文本文档的最后一行)。
C P a i n t D C通知设备环境剪切掉在无效区域以外的任何绘图,这可以通过把被无效化的区域添
加到设备环境的R e g i o n对象中实现;如果再调用,则R e g i o n对象定义一个剪切区域,在该区
域以外不能进行绘制。

通常,当一个窗口是新建的或者另一个画在它上面的窗口被关闭时,一个区域变得无
效;当应用程序进入空闲循环时,发送一个W M _ PA I N T消息到每一个具有无效区域的窗口。
通过无效化一个区域或强迫W M _ PA I N T消息被立即发送到一个窗口,可以加快这一过程。

InvalidateRect(rect);

Invalidate(); //invalidates entire client area
UpdateWindow(); //sends WM_PAINT message immediately

注意当编写表面上看起来好像什么也没画的绘图例程时,可能会碰到的一个更加棘手
的问题,任何东西看起来都像它应该的那样,但是没有任何东西在屏幕上出现。剪切
动作通常是问题所在,但只要通过忽略从C P a i n t D C得到的设备环境和使用C C l i e n t D C创
建自己的设备环境,就可以避免这一问题。

  • OnDraw()

当对一个视图(用C Vi e w类或它的派生类创建的窗口)进行绘制时,应当在C Vi e w的
OnDraw( )函数中处理W M _ PA I N T消息,而不是在它的OnPaint( )中。通过一个打印机设备环
境调用OnDraw( ),C Vi e w可以把视图打印到打印机上。当用户使用F i l e菜单中的标准P r i n t命
令时,就是这样实现的。
但是,许多应用程序不执行 OnDraw( ),因为它们不直接使用C Vi e w;一些使用
C F o r m Vi e w类创建的视图由通用控件组成,而通用控件不用OnDraw( )画它们自己,但还是可
以打印这种类型的视图,不过此时可进行屏幕捕捉而不能绘图。

  • 处理WM_DRAWITEM
一些通用控件窗口允许绘制控件。你可能想要保持控件的功能(如按钮),但需要该控件具
有不同的外观,如文件夹上的标志。为了绘制自己的通用控件,则用属于自己画图的风格来
创建那个控件。对于一个按钮控件,那是B S _ O W N E R D R AW风格。每当需要绘制控件的某一
部分时,该控件的父窗口就会接收到一个 W M _ D R AW I T E M消息。下面的结构包括
W M _ D R AW I T E M窗口消息:

typedef struct tagDRAWITEMSTRUCT
{
	UINT CtlType;
	UINT CtlID;
	UINT itemID;
	UINT itemAction;
	UINT itemState;
	HWND hwndItem;
	HDC hDC;
	RECT reltem;
	DWORD itemData;
}DRAWITEMSTRUCT;
结构中的h D C值是绘制控件的设备环境。要为它封装一个C D C类,可以用:
CDC *pDC=FromHandle(hDC);

注意为了真实封装,应该在从通用控件派生的类中处理WM_DRAWITEM消息。例如,
你可能喜欢创建一个从C B u t t o n派生的称为C M y B u t t o n的类,并由它用消息映射处理
WM_DRAWITEM消息。

你可能在鼠标命令之后绘图,例如,当用鼠标来绘制一条直线时。对于
在这些情况和其他在没有W M _ PA I N T和W M _ D R AW I T E M消息的情况下绘图时,还可以使用
另外两个C D C类的派生类,它们可以使工作轻松。
CClientDC( )类像CPaintDC( )一样创建一个设备环境,但它不试图剪裁任何东西。当
过程开始时,C C l i e n t D C类创建设备环境;而当过程结束时,释放它。
注意在使用设备环境带来方便的同时,也可能会带来隐患。其中之一就是必须记住在
使用之后必须释放它们,否则将承受应用程序慢慢使用完内存的痛苦。不用 C D C
*pDC=GetDC( ),而养成使用C C l i e n t D C的习惯,可能会得到更好的服务,因为不必考
虑释放设备环境。
C WindowDC( )类与CClientDC( )的目的相同,但是,它创建的设备环境允许对整个窗
口进行绘制,其中包括非客户区。


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
author-avatar
敬炜8965肀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有