目录
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);
参数说明:
-
画一系列相连的直线:
-
画线条:
位图
步骤:
- 建立位图资源
- 载入/创建位图资源
- 获取设备内存
- 选入内存设备
- 贴图
流程图如下所示:

代码示例:
.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函数去切断与旧资源的联系,并释放旧的资源
相关函数
获得资源设备表
函数原型
返回值: 如果调用成功,则返回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绘图函数中
获得设备资源描述表实现步骤

相关推荐
可能包含了对Win32 API中常用函数的详细解释和示例,如CreateWindow用于创建窗口,GetMessage和DispatchMessage用于消息循环,CreateProcess用于启动新进程,CreateThread用于创建线程,以及各种绘图函数如DrawText...
在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC6.0)这个经典且功能强大的IDE来开发Win32应用程序。Win32 Application是Windows操作系统平台上的本地应用程序,它利用Windows API(应用程序接口...
- **设置链接器配置**:打开VC_6,创建一个新的Win32 Console Application项目。进入“Project”菜单,选择“Settings”,切换至“Link”选项卡。在“Object/library modules”框中,添加`Opengl32.lib glut32.lib ...
在本文中,我们将深入探讨如何使用Microsoft Visual C++ 6.0(简称VC6.0)进行Win32编程,特别是在GDI(Graphics Device Interface)环境下实现一个模拟钟表的项目。这个项目不仅展示了基本的窗口创建和消息处理,还...
标题“VC++生成PDF工具libharu-2-0-8-dll-win32”揭示了一个专为在Windows 32位环境中利用VC++进行PDF文档生成的库——libharu。Libharu是一个开源的PDF库,允许开发者在C或C++应用程序中创建、修改和读取PDF文件。...
在VC++游戏开发中,Win32 API是一个重要的工具,它为开发者提供了底层访问操作系统的能力,特别是对于构建桌面游戏而言。下面将详细讲解Win32 API在游戏开发中的关键概念和应用。 首先,Windows编程是游戏开发的...
为了理解这个示例,你需要熟悉Win32编程的基本概念,如窗口过程、消息队列、GDI绘图等。同时,对C++类的使用和对象生命周期管理也需要有基础了解。 总之,“VC右下角弹出框代码(Win32示例)”是一个学习和实践...
2. 点菜单 File -> New...,Projects 选项卡选择 Win32 Console Application,Project name 写项目名称(例如 easyx),Location 选择项目位置,点 OK; 3. Step 1 of 1 选择“An empty project.”,点 Finish,在下...
这通常涉及到创建一个新的Win32控制台或Windows应用程序项目,然后添加必要的库链接(如glu32.lib、opengl32.lib等)和包含文件(如gl/gl.h、gl/glu.h等)。 在VC的SDI应用中,你需要创建一个自定义的视图类,该类...
【VC2005 Win32 API 贪吃蛇】是一个使用Microsoft Visual C++ 2005开发的基于Windows操作系统的简单游戏程序。它利用了Win32 API(应用程序接口)来实现游戏的基本功能,如窗口创建、事件处理、图形绘制等。下面将...
使用Visual Studio 2010作为开发环境,意味着代码基于C++,可能结合了MFC(Microsoft Foundation Classes)或者Win32 API进行开发。Vc指的是Visual C++,是Visual Studio的一部分,用于C++编程。 这个项目不仅是一...
总结起来,本项目涉及的知识点包括:串口通信技术的实现,VC6.0中图形界面的创建与绘图,事件驱动编程,实时数据处理和多线程应用。通过这个项目,开发者不仅可以提升串口通信和图形界面编程的技能,还能对事件驱动...
《VC+Win32百叶窗:初学者的编程之旅》 在计算机编程的世界里,VC++和Win32 API是构建Windows桌面应用程序的重要工具。本文将深入探讨这两个概念,并结合"百叶窗"效果的实现,为入门级开发者提供一个生动的实践案例...
【Win32拼图游戏】是一款基于Windows操作系统开发的简单娱乐软件,利用Microsoft Visual Studio 2008作为集成开发环境(IDE),采用C语言进行编程,并借助Windows API中的Graphics Device Interface (GDI)库来实现...
1. **OpenGL环境配置**:在VC++中使用OpenGL,首先需要创建一个Win32应用程序项目,然后添加OpenGL库和GDI库(用于窗口管理)。通常,这涉及到链接`opengl32.lib`、`glu32.lib`和`gdi32.lib`库,并包含相应的头文件...
《使用Win32 API进行二维绘图:一个MFC/VC++实践教程》 在计算机图形学领域,二维绘图是基础且至关重要的技术之一。本文将深入探讨一个基于Win32 API编写的二维绘图软件,该软件实现了基本的绘图功能,包括画直线、...
安装完成后,创建一个新的Win32 Console Application项目,并选择“Empty Project”模板,以便从零开始构建你的播放器。 2. **多媒体库的选择**: VC++本身并不包含音频处理功能,因此你需要引入第三方库来处理MP3...
屏幕保护程序的核心在于理解和应用Windows的GDI(Graphics Device Interface)和Win32 API。GDI是一组函数,用于绘制图形、文本、图像等,而在屏幕保护程序中,开发者通常会利用这些函数来创建动态效果。例如,描述...
在Visual C++ (VC++)中,你可以使用MFC(Microsoft Foundation Classes)或Win32 API来创建OpenGL上下文并管理窗口。MFC提供了CWnd类,可以用来方便地创建窗口,并通过扩展CWnd来实现OpenGL绘图。 3. **多视图**:...
这通常涉及到GLUT库或者Win32 API的使用,用来处理窗口事件和初始化OpenGL环境。 2. **基本的OpenGL绘图函数**:包括`glBegin()`, `glEnd()`, `glVertex()`等,用于定义几何形状,如线条、三角形等。 3. **颜色和...