EVC绘制位图--BeginPaint()与GetDC()的区别

Windows API GDI(1) BeginPaint和EndPaint函数 说明: BeginPaint:函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到PAINTSTRUCT结构中。 EndPaint:和BeginPaint成对出现,描画完成释放。 BeginPaint 函数的作用是告诉 Windows 系统,要开始向显示卡输出内容了,把这次显示的操作请求放到系统显示队列里。由于系统上的显示卡往往只有一个,那么这种资源是独占的,所以操作系统会让显示操作线性化,保证每个窗口的显示是独立进行的,而不是 A 窗口显示一部份,或者 B 窗口显示一部份,而是 A 窗口显示完成 阅读详情

//========================================================================
//TITLE:
//    EVC绘制位图--BeginPaint()与GetDC()的区别
//AUTHOR:
//    norains
//DATE:
//    Tuesday  29-August-2006
//========================================================================
1.BeginPaint()和GetDC()
        在EVC中绘制位图比较方便,有不少现成的函数可供调用,我们所要注意的只是BeginPaint()或GetDC()的使用即可.
        因为代码比较简单,所以不做更多解释.

        这是消息循环函数:
        LRESULT CALLBACK MainWndProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
        {
            ......
            
            switch(wMsg)
            {
                case WM_PAINT:
                        OnPaintMainWnd(hWnd,wMsg,wParam,lParam);
                        break;
                
                ......                
            
            }
            return DefWindowProc(hWnd,wMsg,wParam,lParam);
            
            ......
            
        }
        
        响应WM_PAINT消息的函数,在这里进行位图的绘制:
        LRESULT OnPaintMainWnd(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd,&ps);
            //Create a DC that matches the device
            HDC hdcMem = CreateCompatibleDC(hdc);
            //Load the bitmap
            HANDLE hBmp= LoadImage(g_hInst_MainWnd,MAKEINTRESOURCE(IDB_MAINWND),IMAGE_BITMAP,0,0,0);
            //Select the bitmap into to the compatible device context
            HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
            //Get the bitmap dimensions from the bitmap
            BITMAP bmp;
            GetObject(hBmp,sizeof(BITMAP),&bmp);
            //Get the window area
            RECT rc;
            GetClientRect(hWnd,&rc);
            //Copy the bitmap image from the memory DC to the screen DC
            BitBlt(hdc,rc.left,rc.top,bmp.bmWidth,bmp.bmHeight,hdcMem,0,0,SRCCOPY);
            //Restore original bitmap selection and destroy the memory DC
            SelectObject(hdcMem,hOldSel);    
            DeleteDC(hdcMem);
            EndPaint(hWnd,&ps);
            return 0;
        }

        我们都知道BeginPaint()和EndPaint()需要配套使用,并且这两个函数也只能用在WM_PAINT消息的相应函数当中.如果我们在WM_PAINT的响应函数中将以上两个绘制函数相应替换为GetDC()和ReleaseDC()会有什么结果呢?
        即:
        HDC hdc = BeginPaint(hWnd,&ps);    -->   HDC hdc = GetDC(hWnd);
        EndPaint(hWnd,&ps);                -->   ReleaseDC(hWnd,hdc);
        
        编译并运行程序,我们发现窗口一片空白,好像没有绘制位图.但其实不尽然,我们采用单步调试,可以发现其实位图已经绘制出来,只不过又被背景颜色抹掉了.由此可知,如果需要使用GetDC(),我们对消息循环函数必须要加上对WM_ERASEBKGND的处理:
        LRESULT CALLBACK MainWndProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
        {
            switch(wMsg)
            {
                case WM_PAINT:
                        OnPaintMainWnd(hWnd,wMsg,wParam,lParam);
                        break;
                case WM_ERASEBKGND    
                        return 0;            
            }
            return DefWindowProc(hWnd,wMsg,wParam,lParam);
        }
        只要系统不对WM_ERASEBKGND进行默认处理,我们用GetDC()替代BeginPaint()就可以正常使用.
        
        至此我们可以看出BeginPaint(),EndPaint()和GetDC(),ReleaseDC()的区别.前一对只能用在WM_PAINT响应函数中,并且绘制背景时不会被抹掉;后一对随处可用,但如果用在WM_PAINT响应函数中,那么接下来将会被WM_ERASEBKGND消息的响应函数的背景绘制给抹掉.
        
        
        
        
2.绘图闪烁问题        
    有时候我们大量绘制屏幕时,可能会出现屏幕闪烁问题,这时候可以采用双缓冲的做法.步骤首先是创建一个内存DC,然后往内存DC中绘图,最后把内存DC的内容复制到显示DC中,完成绘制.具体过程并不复杂,结合代码来说明一下.
    PS:这段代码也是相应WM_PAINT 消息的.
    
    PAINTSTRUCT ps;
    HDC hdc;
    //获取屏幕显示DC        
    hdc = BeginPaint (hWnd, &ps);
    
    //创建内存DC
    HDC hdcMem = CreateCompatibleDC(hdc);
    //创建一个bmp内存空间
    HBITMAP hBmp = CreateCompatibleBitmap(hdc,SCREEN_WIDTH,SCREEN_HEIGHT);
    //将bmp内存空间分配给内存DC
    HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
    
    //这是使用者需要绘制的画面,全部往内存DC绘制
    Rectangle(hdcMem,0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
    DrawMenuButton(hdcMem);
    
    //将内存DC的内容复制到屏幕显示DC中,完成显示
    BitBlt(hdc,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,hdcMem,0,0,SRCCOPY);
    //清除资源
    SelectObject(hdcMem,hOldSel);    
    DeleteDC(hdcMem);    
    EndPaint(hWnd,&ps);

ICESat-2数据下载的两种方法 ICESat-2数据下载 阅读详情

相关推荐

通俗易懂的图解二叉搜索树、AVL树和红黑树

搜索是一种很常见的需求,当数据较多时,如何找到目标对象时,即需要搜索查找。 那么如何快速找到目标呢,最朴素的思想就是暴力查找,一个一个对比。 显然,当数据量增大时,我们需要优化查找方法获取更快的查找速度,我们可以通过维护一个有序数组,从而实现二分查找,查找速度从O(n)降为O(longn)。 但是数组并不便于插入和删除,链表便成为了最好的选择。 既然是采用二分查找,那么不如直接按照查找的步骤维护一种数据结构,于是二叉搜索树出现了。 二叉搜索树的性质为: 若左子树不为空,则左子树上所有节点值都小于根结点值;

暗色光的博客 758

Windows API一日一练(16)BeginPaint和EndPaint函数

当人们使用软件时,大多数是想看到自己所需要的结果,比如玩RPG游戏,就是想看到自己所操作的主角做各种各样的事情。在2D的RPG游戏里,其实做的事情,就是不断地更新画面,也就是不断地显示BMP的图片。在普通的程序里,大多也是显示各种文本和图片的,但是有一种类型的应用程序是不怎么显示结果的,那就是服务程序。不管怎么样,只要我们想看到程序所执行后的结果,就需要在程序里显示出来。也就是需要调用B...

anjichan4261的博客 625

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 251

BeginPaint和GetDC的区别

这是个windows编程问题。  第一种情况显示出来的字很正常。  case WM_PAINT:             gdc = BeginPaint (hwnd, &ps);             TextOut (gdc, 0, 0, s, strlen (s));             EndPaint (hwnd, &ps);  break;  第二种情况显示的字不停

maomao85的专栏 1035

STM32读取BQ40Z50的数据

TI电池管理芯片BQ40Z50,通信协议是SMBUS,类似IIC,速率要求10-100KHz   用的STM32F103的硬件IIC读取电池的各种数值,源代码如下: ​ #include "iic.h" #include "stdio.h"  //***************************************************** // IIC2初始化函数:初始化ST...

百步登峰的博客 1万+

ROS 2 Slam Toolbox实战:从零跑通2D激光建图

SLAM(同步定位与地图构建)是移动机器人实现自主导航的基础技术,其核心在于通过传感器数据实时估计位姿并构建环境栅格地图。slam_toolbox作为ROS 2 Humble及后续LTS版本官方主推的2D SLAM后端,采用图优化+闭环检测架构,兼顾实时性、鲁棒性与工程可维护性。相比cartographer和hector_slam,它原生支持ROS 2、参数精简、诊断友好,特别适合硬件资源有限、缺乏IMU或深度相机的差速机器人平台。本文聚焦真实部署场景,覆盖RPLIDAR等常见2D激光雷达与TurtleBo

weixin_30596165的博客 357

跟我一起玩Win32开发(8):绘图(A)

从本篇开始,我就不吹牛皮,那就吹吹兔皮吧。说说与绘图有关的东东。 要进行绘制,首先要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们封装了一些与显示设备相关的交互操作,我们这里说的是图形的绘制,自然指的是显卡。当然,对于同一客观事物,世界上并不存在唯一的理解方案,技术上的东西最终拿来用的,不应该有硬性的去统一。我们之中的很多人,最大的失败在于,人家说

老周——“易之道” 1万+

Oracle-如何修复undo坏快

undo出现坏快,导致数据库宕机,无法启动

qqqyyy0422的博客 570

BeginPaint和GetDC

使用方法: BeginPaint              hdc = BeginPaint (hwnd, &ps);                 // 使用GDI函数                 EndPaint (hwnd, &ps); GetDC             hdc = GetDC (hwnd);               // 使用GDI函数    

worldbit的博客 1104

52、基于格的具有解密密钥暴露抗性的可撤销(分层)身份基加密方案

本文提出了首个基于格的具有解密密钥暴露抗性(DKER)的可撤销分层身份基加密(RHIBE)方案。通过引入分层密文、分层解密密钥和级别转换密钥等创新工具,克服了格结构与传统密钥重新随机化属性不匹配的难题。该方案不仅支持可扩展的密钥撤销机制,还具备密钥委托功能,为后量子密码学领域的发展提供了新的思路和方法。

efc12345678的博客 123

ABAP 平台下配置 OAuth 2.0 Authorization Code 授权类型的完整指引

本文是面向ABAP管理员和SAP开发者的OAuth 2.0授权码配置实战指南。文章详细介绍了在ABAP平台启用Authorization Code的完整流程,包括前置条件检查(如TLS配置和系统用户准备)、SOAUTH2事务码中各字段配置要点(授权类型启用、Redirect URI设置、授权码有效期等)、Scope分配规则以及验证方法。通过一个销售订单OData接口的实际案例,说明了如何将抽象规范转化为具体配置。最后提供了多种验证方式(事务码测试、端点测试和Postman测试)以及关键配置参数(如授权码有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

VC绘制位图--BeginPaint()与GetDC()的区别

//========================================================================//TITLE:// EVC绘制位图--BeginPaint()与GetDC()的区别//AUTHOR:// norains//DATE:// Tuesday 29-August-2006//==============================...

dato0123 99

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC绘制位图--BeginPaint()与GetDC()的区别和双缓冲

1.BeginPaint()和GetDC()        在EVC中绘制位图比较方便,有不少现成的函数可供调用,我们所要注意的只是BeginPaint()或GetDC()的使用即可.        因为代码比较简单,所以不做更多解释.        这是消息循环函数:        LRESULT CALLBACK MainWndProc(HWND hWnd,UINT wMsg,WPARAM w

liuxingbin的专栏 1418

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC绘制位图--BeginPaint 与GetDC 的区别

VC绘制位图--BeginPaint 与GetDC 的区别

ytfgff的博客 310

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

转VC绘制位图--BeginPaint()与GetDC()的区别

//========================================================================//TITLE://    EVC绘制位图--BeginPaint()与GetDC()的区别//AUTHOR://    norains//DATE://    Tuesday  29-August-2006//====================

benny5609的专栏 1302

BeginPaint和GetDC有什么区别?

这是个windows编程问题。  第一种情况显示出来的字很正常。  case WM_PAINT:             gdc = BeginPaint (hwnd, &ps);             TextOut (gdc, 0, 0, s, strlen (s));             EndPaint (hwnd, &ps);  break;  第二种情况显示的字不停

On the way 518

EVC MFC绘图容易出现的问题总结

      最近做了一个基于wince5.0平台的监控软件(包含大量的绘图操作),使用evc4.0 MFC开发实现。由于刚开始做,绘图方面的经验较少,碰到了不少问题,在此做一下总结,以此为鉴。在此之前首先感谢那些在各论坛提供此类问题解决方法的前辈们,本项目碰到的问题能得以顺利解决,多亏他们的回帖。      一、在绘图时使用::GetDC和::DeleteDC代替CWnd::GetDC和CWnd::DeleteDC

wzg_soullon的专栏 1861

窗口刷新问题(WM_PAINT、BeginPaint、EndPaint的说明)

在Windows API编程中,WM_PAINT是Windows窗口的一个重要消息,应用程序就是通过响应这个消息来完成窗口的绘制。   The WM_PAINT message is generated by the system and should not be sent by an application.The system sends this message when there a

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 3435
上一篇: BMP文件格式
下一篇: C语言编译全过程
NewJerryj
博客等级 码龄19年 196粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值