`
wo_deqing
  • 浏览: 64228 次
文章分类
社区版块
存档分类
最新评论

绘图(VC_Win32)

 
阅读更多

绘图(VC_Win32)

目录

GUI作图概述
描绘图形
位图
文本输出
设置画刷/画笔/字体
MFC 资源句柄的获得与释放

(本章节中例子都是用 VS2005 编译调试的)


GUI作图概述

作图步骤

  • 获得设备描述表资源句柄
  • 绘图操作
  • 释放设备描述表资源句柄

流程图如下:

获取/释放设备资源描述表

  • 获取设备资源描述表:   BeginPaint / GetDC
  • 释放设备资源描述表:  EndPaint / ReleaseDC

BeginPaint / GetDC两种方式的区别:

            BeginPaint            GetDC            
使用环境         只用于图形刷新时获取设备环境   使用较为广泛
操作区域         无效区              特定窗口的客户区或者整个窗口
释放设备环境所用函数   ReleaseDC ()          EndPaint ()

代码示例:

在 WM_PAINT 添加 BeginPaint 事件,在 WM_LBUTTONDOWN 添加 GetDC 事件.

BeginPaint 使用:

复制代码
//获得资源DC
hdc=BeginPaint(hwnd,&ps);
//获得窗口大小
GetClientRect(hwnd,&rect);
//绘制文本
DrawText(hdc,"hellow my first windows program",strlen("hellow my first windows program"),&rect,
    DT_SINGLELINE | DT_CENTER | DT_VCENTER);
//释放资源DC
EndPaint(hwnd,&ps);
复制代码

GetDC 使用:

//获得设备资源描述表
hdc = GetDC(hwnd);
//绘制带圆角矩形
RoundRect(hdc,10,10,110,60,10,10);
//释放设备资源描述表
ReleaseDC(hwnd,hdc);

程序源码

运行结果:

单击鼠标右键和重绘窗口时

在单击鼠标右键后

绘图操作分类

  • 描绘图形
  • 位图
  • 文本输出

与设备描述表相关函数


描绘图形

常用绘图函数:

  • 画贝塞尔曲线:
  • 画点:  SetPixel
  • 画矩形:  Rectangle
  • 画带圆角的矩形:  RoundRect
      函数原型:  BOOL RoundRect( HDC hdc, int nLeftRect, int nTopRect,int nRightRect,int nBottomRect,int nWidth,int nHeight);
      参数说明:

            
  • 画椭圆:  Ellipse
  • 画椭圆的一部分(即画一个弦):  Chord
  • 画一个扇形区并用当前画刷填充:  Pie
  • 画椭圆弧线:   Arc
      函数原型:  BOOL Arc(HDC hdc,int nLeftRect, int nTopRect,int nRightRect,int nBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);
      参数说明:

            
  • 画椭圆弧线:   ArcTo
  • 画正圆弧线:  AngleArc
      函数原型:   BOOL AngleArc(HDC hdc,int X,int Y,DWORD dwRadius,FLOAT eStartAngle,FLOAT eSweepAngle);
      参数说明:

          
  • 画一系列相连的直线:
  • 画线条:
    • 设置画笔起始位置:  MoveToEx
    • 设置画笔终止位置:  LineTo

位图

步骤:

  • 建立位图资源
  • 载入/创建位图资源
  • 获取设备内存
  • 选入内存设备
  • 贴图

流程图如下所示:

代码示例:

.rc 内容(位图资源):

IDB_BITMAP1             BITMAP                  "8c8a09f1gw1ds3qh4vtcyj.bmp"

位图(8c8a09f1gw1ds3qh4vtcyj.bmp 尺寸信息:440*622):

在鼠标左键单击事件中添加贴图操作:

加载位图:

hBmp = LoadBitmap(hinstance,MAKEINTRESOURCE(IDB_BITMAP1));

创建兼容 DC 并将位图选入兼容 DC 中:

hcmdc = CreateCompatibleDC(hdc);
SelectObject(hcmdc,hBmp);

获得窗口大小(被显示的区域),获得位图信息(要显示的区域)

//获取窗口大小
GetClientRect(hwnd,&rect);
//获取位图信息(在 StretchBlt 时候有用到,而 BitBlt 没有)
GetObject(hBmp, sizeof(BITMAP), &bmp);

显示位图:

//显示方式一,  按原图比例显示
BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,hcmdc,0,0,SRCCOPY);

//显示方式二,  拉伸式显示
StretchBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,hcmdc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

程序源码

运行结果:

  • 在未点击鼠标右键时候:

  • 点击鼠标左键(用 BitBlt 方法):

  • 点击鼠标左键(用StretchBlt 方法):


文本输出

文本输出操作

  • 文字输出:  TextOut
  • 显示字符串:  DrawText

有关文本操作:

  • 获取文字信息:  GetTextMetrics
  • 格式化文字:  GetTextExtentPoint32
  • 设置字体颜色和背景颜色:
    • 字体:  SetTextColor
    • 背景:  SetBkColor

设置画刷/画笔/字体

相关结构体:

字体结构体

TEXTMETRIC

作用:  记录基本的字体信息

结构体定义(MSDN 链接):

View Code

图示:

步骤:

  • 创建资源句柄
  • 创建自定义资源/调用系统资源
  • 将资源选入系统

如下图所示:

代码示例:

在窗口重画的时候添加创建新画笔操作:

创建新画笔,并将画笔选入设备描述表中

pen = CreatePen(PS_DOT,3,RGB(255,100,100));
SelectObject(hdc,pen);

为了区别创建画笔前和创建画笔后的作图的区别

在创建画笔前绘制一条直线:

//rect 为记录窗口大小的 RECT 结构体
MoveToEx(hdc,(rect.left+rect.right)/2-130,(rect.top+rect.bottom)/2-50,NULL);
LineTo(hdc,(rect.left+rect.right)/2+130,(rect.top+rect.bottom)/2-50);

在创建画笔后绘制一条直线:

MoveToEx(hdc,(rect.left+rect.right)/2-130,(rect.top+rect.bottom)/2+50,NULL);
LineTo(hdc,(rect.left+rect.right)/2+130,(rect.top+rect.bottom)/2+50);

程序源码

运行结果:


程序源码

View Code

MFC 资源句柄的获得与释放

绘图是选用GDI资源的说明

在程序中,当构造函数构造一个GDI对象后,该对象并不会立刻生效,必须选入设备描述表,它才会在以后的操作中生效,利用SelectObject函数可以实现把GDI对象选入设备描述表中,并且返回指向先前GDI设备对象的指针,一般情况下,在完成绘图操作后,都要利用SelectObject函数吧先前的GDI对象选入设备表,以便使恢复到先前状态

GDI绘图对象(CPen,CFont.CBitmap,CBrush)都派生于CGdiObject类对象,都有一个m_hObject记录与对应资源联系的关系,当其对象与对应的资源调用CreateXXXX建立联系后若想把对象关联上新的资源时候,必须先对旧的资源释放才能和新的资源建立上联系,可以用CGdiObject对象的DeleteObject函数去切断与旧资源的联系,并释放旧的资源

相关函数

获得资源设备表

函数原型

CDC* GetDC();

返回值:  如果调用成功,则返回CWnd客户区的设备环境;否则,返回NULL。这个指针可能是临时的,不能被保存以供将来使用

说明:   这个函数获得一个指针,指向一个客户区的公用的、属于类的或者私有的设备环境,依赖于为CWnd指定的类风格。对于公用的设备环境,GetDC每次获得设备环境时都给它赋予缺省值。对于属于类的或者私有的设备环境,GetDC保持原来的属性不变。在随后的图形设备接口(GDI)函数中可以使用设备环境以在客户区中绘图

释放资源设备表

函数原型

int ReleaseDC( CDC* pDC );

参数说明:   pDC 标识了要释放的设备环境
返回值:   如果成功,则返回非零值;否则返回0
说明:     释放设备环境,以供其它应用程序使用。ReleaseDC成员函数的效果依赖于设备环境的

CPainDC与CCleintDC的区别

  • CPaintDC
    • CPaintDC继承于CDC
    • 在构造函数中调用BeginPaint
    • 在析构函数调用EndPaint函数
    • 用于相应WM_PAINT消息的函数中
  • CClientDC
    • CClientDC继承于CDC
    • 在析构函数中调用GetDC
    • 在析构函数中调用ReleaseDC
    • 用于非WM_PAINT消息的GDI绘图函数中

获得设备资源描述表实现步骤

分享到:
评论

相关推荐

    几百个常用的 API 函数的简介.rar_MFC_VC api_VC API_Win32API_win32

    可能包含了对Win32 API中常用函数的详细解释和示例,如CreateWindow用于创建窗口,GetMessage和DispatchMessage用于消息循环,CreateProcess用于启动新进程,CreateThread用于创建线程,以及各种绘图函数如DrawText...

    使用VC6.0开发Win32 Application程序

    在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC6.0)这个经典且功能强大的IDE来开发Win32应用程序。Win32 Application是Windows操作系统平台上的本地应用程序,它利用Windows API(应用程序接口...

    VC_6中配置OpenGL开发环境

    - **设置链接器配置**:打开VC_6,创建一个新的Win32 Console Application项目。进入“Project”菜单,选择“Settings”,切换至“Link”选项卡。在“Object/library modules”框中,添加`Opengl32.lib glut32.lib ...

    Easy-Model-Clock.zip_VC6.0 曲线_clock win32 c++_easy _easy x_vc6.0

    在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC6.0)进行Win32编程,特别是在GDI(Graphics Device Interface)环境下实现一个模拟钟表的项目。这个项目不仅展示了基本的窗口创建和消息处理,还...

    是VC++生成PDF 工具libharu-2-0-8-dll-win32

    标题“VC++生成PDF工具libharu-2-0-8-dll-win32”揭示了一个专为在Windows 32位环境中利用VC++进行PDF文档生成的库——libharu。Libharu是一个开源的PDF库,允许开发者在C或C++应用程序中创建、修改和读取PDF文件。...

    VC++_win32_API_游戏开发(最新)

    在VC++游戏开发中,Win32 API是一个重要的工具,它为开发者提供了底层访问操作系统的能力,特别是对于构建桌面游戏而言。下面将详细讲解Win32 API在游戏开发中的关键概念和应用。 首先,Windows编程是游戏开发的...

    VC右下角弹出框代码(Win32示例)

    为了理解这个示例,你需要熟悉Win32编程的基本概念,如窗口过程、消息队列、GDI绘图等。同时,对C++类的使用和对象生命周期管理也需要有基础了解。 总之,“VC右下角弹出框代码(Win32示例)”是一个学习和实践...

    VC_EasyX_Help

    2. 点菜单 File -> New...,Projects 选项卡选择 Win32 Console Application,Project name 写项目名称(例如 easyx),Location 选择项目位置,点 OK; 3. Step 1 of 1 选择“An empty project.”,点 Finish,在下...

    Opengl.rar_opengl_opengl vc_opengl 画图_vc opengl_单文档 画图

    这通常涉及到创建一个新的Win32控制台或Windows应用程序项目,然后添加必要的库链接(如glu32.lib、opengl32.lib等)和包含文件(如gl/gl.h、gl/glu.h等)。 在VC的SDI应用中,你需要创建一个自定义的视图类,该类...

    VC2005 Win32 API 贪吃蛇

    【VC2005 Win32 API 贪吃蛇】是一个使用Microsoft Visual C++ 2005开发的基于Windows操作系统的简单游戏程序。它利用了Win32 API(应用程序接口)来实现游戏的基本功能,如窗口创建、事件处理、图形绘制等。下面将...

    ImageEditor_knowledgefxg_aheadsh2_VS2010_Vc_

    使用Visual Studio 2010作为开发环境,意味着代码基于C++,可能结合了MFC(Microsoft Foundation Classes)或者Win32 API进行开发。Vc指的是Visual C++,是Visual Studio的一部分,用于C++编程。 这个项目不仅是一...

    读取串口数据并画实时曲线.zip_VC 串口_VC 曲线绘制_vc 实时曲线_串口通信_读取串口数据

    总结起来,本项目涉及的知识点包括:串口通信技术的实现,VC6.0中图形界面的创建与绘图,事件驱动编程,实时数据处理和多线程应用。通过这个项目,开发者不仅可以提升串口通信和图形界面编程的技能,还能对事件驱动...

    VC+Win32百叶窗

    《VC+Win32百叶窗:初学者的编程之旅》 在计算机编程的世界里,VC++和Win32 API是构建Windows桌面应用程序的重要工具。本文将深入探讨这两个概念,并结合"百叶窗"效果的实现,为入门级开发者提供一个生动的实践案例...

    Win32 拼图游戏

    【Win32拼图游戏】是一款基于Windows操作系统开发的简单娱乐软件,利用Microsoft Visual Studio 2008作为集成开发环境(IDE),采用C语言进行编程,并借助Windows API中的Graphics Device Interface (GDI)库来实现...

    OpenGLBase_majorcpo_Vc_

    1. **OpenGL环境配置**:在VC++中使用OpenGL,首先需要创建一个Win32应用程序项目,然后添加OpenGL库和GDI库(用于窗口管理)。通常,这涉及到链接`opengl32.lib`、`glu32.lib`和`gdi32.lib`库,并包含相应的头文件...

    使用win32编写的二维绘图软件

    《使用Win32 API进行二维绘图:一个MFC/VC++实践教程》 在计算机图形学领域,二维绘图是基础且至关重要的技术之一。本文将深入探讨一个基于Win32 API编写的二维绘图软件,该软件实现了基本的绘图功能,包括画直线、...

    MP3_Vc_

    安装完成后,创建一个新的Win32 Console Application项目,并选择“Empty Project”模板,以便从零开始构建你的播放器。 2. **多媒体库的选择**: VC++本身并不包含音频处理功能,因此你需要引入第三方库来处理MP3...

    屏幕保护程序的开发_followa9h_Vc_

    屏幕保护程序的核心在于理解和应用Windows的GDI(Graphics Device Interface)和Win32 API。GDI是一组函数,用于绘制图形、文本、图像等,而在屏幕保护程序中,开发者通常会利用这些函数来创建动态效果。例如,描述...

    oglwrapperclass_demo.rar_openGL dem_opengl_opengl vc_opengl多视图_v

    在Visual C++ (VC++)中,你可以使用MFC(Microsoft Foundation Classes)或Win32 API来创建OpenGL上下文并管理窗口。MFC提供了CWnd类,可以用来方便地创建窗口,并通过扩展CWnd来实现OpenGL绘图。 3. **多视图**:...

    OpenGL_VC_cpp1_10

    这通常涉及到GLUT库或者Win32 API的使用,用来处理窗口事件和初始化OpenGL环境。 2. **基本的OpenGL绘图函数**:包括`glBegin()`, `glEnd()`, `glVertex()`等,用于定义几何形状,如线条、三角形等。 3. **颜色和...

Global site tag (gtag.js) - Google Analytics