windows编程之画笔
windows编程之画笔
文章目录
- windows编程之画笔
- @[toc]
- GetStockObject
- SelectObject
- CreatePen
- CreatePenIndirect
- LOGPEN 结构
- GetObject
- DeleteObject
- GetCurrentObject
GetStockObject
GetStockObject 函数用于获得 Windows 预设的画笔、画刷、字体或者调色板的句柄。
- API 函数原型:
HGDIOBJ GetStockObject(_In_ int fnObject
);
参数解析:
参数 | 含义 |
---|---|
fnObject | 指定待获取对象的类型,具体参考下边。 |
fnObject 可取如下值之一:
值 | 含义 |
---|---|
BLACK_BRUSH | 黑色画刷 |
DKGRAY_BRUSH | 暗灰色画刷 |
DC_BRUSH |
1. 纯色画刷,默认颜色是白色的 2. 调用 SetDCBrushColor 函数可以修改该值的颜色
|
GRAY_BRUSH | 灰色画刷 |
HOLLOW_BRUSH | 空画刷(相当于 NULL_BRUSH) |
LTGRAY_BRUSH | 浅灰色画刷 |
NULL_BRUSH | 空画刷(相当于 HOLLOW_BRUSH) |
WHITE_BRUSH | 白色画刷 |
BLACK_PEN | 黑色画笔 |
DC_PEN |
1. 纯色画笔,默认颜色是白色的 2. 调用 SetDCPenColor 函数可以修改该值的颜色
|
NULL_PEN | 空画笔(空画笔不绘制任何东西) |
WHITE_PEN | 白色画笔 |
ANSI_FIXED_FONT | Windows 中的固定间距(等宽)系统字体 |
ANSI_VAR_FONT | Windows 中的可变间距(比例间距)系统字体 |
DEVICE_DEFAULT_FONT | 设备相关字体 |
DEFAULT_GUI_FONT | 1. 用户界面对象(如菜单、对话框)的默认字体 2. 不推荐使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 获得对话框或系统的字体 3. 该字体默认是 Tahoma |
OEM_FIXED_FONT | 原始设备制造商(OEM)相关固定间距(等宽)字体 |
SYSTEM_FONT | 1. 系统字体 2. 默认情况下,Windows 使用系统字体绘制菜单,对话框和文本 3. 不推荐使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 获得对话框或系统的字体 4. 该字体默认是 Tahoma |
SYSTEM_FIXED_FONT | 1. 固定间距(等宽)系统字体 2. 该对象仅为兼容 16 位 Windows 版本提供 |
DEFAULT_PALETTE | 默认调色板(该调色板由系统调色板中的静态色彩组成) |
返回值:
如果函数调用成功,返回值是所申请的逻辑对象的句柄;
如果函数调用失败,返回值是 NULL。
备注:
不建议您使用该函数获得对话框和窗口的当前字体。应该使用
SystemParametersInfo
函数(SPI_GETNONCLIENTMETRICS 参数)来获得当前字体,因为 SystemParametersInfo 函数将考虑到当前主题,并提供了标题栏,菜单和消息对话框的字体信息。仅在窗口风格为
CS_HREDRAW
和CS_VREDRAW
中,才能使用 DKGRAY_BRUSH、GRAY_BRUSH 和 LTGRAY_BRUSH 对象。如果在其他风格的窗口中使灰色画刷,可能导致在窗口移动或改变大小之后出现画刷模式错位现象,原始画刷不能被调整。HOLLOW_BRUSH 和 NULL_BRUSH 对象是一样的。
不必要通过调用[DeleteObject 函数来删除 Windows 预设的对象。
DC_BRUSH 和 DC_PEN 都能与其他对象如 BLACK_BRUSH 和 BLACK_PEN 相互交换。具体请参考 GetDCBrushColor 函数、SetDCBrushColor 函数、GetDCPenColor 函数和 SetDCPenColor 函数。
SelectObject
SelectObject 函数用于选择一对象到指定的设备环境中,该新对象将替换先前的相同类型的对象。
- API 函数原型:
HGDIOBJ SelectObject(_In_ HDC hdc,_In_ HGDIOBJ hgdiobj
);
参数解析:
参数 | 含义 |
---|---|
hdc | 指定设备环境句柄 |
hgdiobj | 1. 被选择的对象的句柄 2. 该指定对象必须由以下的函数创建 |
hgdiobj 参数的对象必需由以下的函数创建:
对象 | 函数 |
---|---|
位图 | CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection (只有内存设备环境可选择位图,并且在同一时刻只能一个设备环境选择位图) |
画刷 | CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush |
字体 | CreateFont, CreateFontIndirect |
画笔 | CreatePen, CreatePenIndirect |
区域 | CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect |
返回值:
如果选择对象不是区域并且函数调用成功,那么返回值是被取代的对象的句柄;
如果选择对象是区域并且函数执行成功,返回以下值之一:
值 | 含义 |
---|---|
SIMPLEREGION | 区域由单个矩形组成 |
COMPLEXREGION | 区域由多个矩形组成 |
NULLREGION | 区域为空 |
- 如果发生错误并且选择对象不是一个区域,那么返回值为 NULL,否则返回 HGDI_ERROR。
备注:
该函数返回先前指定类型的选择对象。
一个应用程序在它使用新对象进行绘制完成之后,应该用原始的默认对象替换新对象。
应用程序不能同时选择一个位图到多个设备环境中。
ICM:如果被选择的对象是画笔或笔,那么就执行颜色管理。
CreatePen
CreatePen 函数用指定的样式、宽度和颜色创建一个逻辑画笔。
创建的画笔随后可以被选择到设备环境中,并用于绘制直线和曲线。
- API 函数原型:
HPEN CreatePen(_In_ int fnPenStyle,_In_ int nWidth,_In_ COLORREF crColor
);
参数解析:
参数 | 含义 |
---|---|
fnPenStyle | 指定画笔样式,详细内容请看下边 |
nWidth | 1. 指定画笔的宽度 2. 如果该值为 0,则画笔为一个像素宽度,不管当前的映射模式 |
crColor | 1. 指定画笔的 RGB 颜色 2. RGB 颜色使用 RGB 宏 生成 COLORREF 结构 |
fnPenStyle 参数指定画笔样式为如下值之一:
值 | 含义 |
---|---|
PS_SOLID | 实线 |
PS_DASH | 虚线(nWidth 参数的值必须 <= 1) |
PS_DOT | 点线(nWidth 参数的值必须 <= 1) |
PS_DASHDOT | 点划线(nWidth 参数的值必须 <= 1) |
PS_DASHDOTDOT | 点点划线(nWidth 参数的值必须 <= 1) |
PS_NULL | 该画笔看不见 |
PS_INSIDEFRAME | 该画笔用于在 GDI 函数绘图中实现,绘制椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画笔宽度向内扩展。 |
返回值:
如果函数调用成功,返回值是新画笔的句柄;
如果函数调用失败,返回值是 NULL。
备注:
调用该函数创建新画笔之后,可以使用
SelectObject
函数将新画笔选入设备环境中。只有当画笔被选入设备环境,才能使用该画笔绘制线段或曲线。如果 nWidth 参数的值是 0,则画笔为一个像素宽度,不管当前的映射模式。
如果 nWidth 参数的值大于 1,则 fnPenStyle 参数的值必须为 PS_NULL, PS_SOLID 或 PS_INSIDEFRAME 的其中一个。
如果 nWidth 参数的值大于 1,且 fnPenStyle 参数的值为 PS_INSIDEFRAME,所有与该画笔相关联(除了折线和多边形)的封闭图形绘制,画笔宽度向内扩展。
如果 nWidth 参数的值大于 1,且 fnPenStyle 参数的值为 PS_INSIDEFRAME,如果指定的 RGB 颜色不存在,就进行抖动处理。
如果你再也不需要该画笔,可以使用
DeleteObject
函数将其删除。
CreatePenIndirect
CreatePenIndirect 函数根据指定的 LOGPEN 结构创建一个画笔。
- API 函数原型:
HPEN CreatePenIndirect(_In_ const LOGPEN *lplgpn
);
参数解析:
参数 | 含义 |
---|---|
lplgpn | 【1】指向 LOGPEN 结构 的指针 【2】 LOGPEN 结构 指定了画笔的样式、宽度和颜色 |
返回值:
如果函数调用成功,返回值是新画笔的句柄;
如果函数调用失败,返回值是 NULL。
备注:
调用该函数创建新画笔之后,可以使用
SelectObject
函数将新画笔选入设备环境中。只有当画笔被选入设备环境,才能使用该画笔绘制线段或曲线。如果你再也不需要该画笔,可以使用
DeleteObject
函数将其删除。
LOGPEN 结构
LOGPEN 结构定义了画笔、图形对象用于绘制线条和边框的宽度、样式和颜色。
CreatePenIndirect 函数需要使用到 LOGPEN 结构。
typedef struct tagLOGPEN {UINT lopnStyle;POINT lopnWidth;COLORREF lopnColor;
} LOGPEN, *PLOGPEN;
成员解析:
成员 | 含义 |
---|---|
lopnStyle | 指定画笔样式,详细内容请看下边 |
lopnWidth | 1. 指定画笔的宽度 2. POINT 结构,Windows 只使用该结构的 x 成员表示画笔宽度,y 成员不使用 3. 如果该值为 0,则画笔为一个像素宽度,不管当前的映射模式 |
lopnColor | 1. 指定画笔的 RGB 颜色 2. RGB 颜色使用 RGB 宏 生成 COLORREF 结构 |
lopnStyle 成员指定画笔样式为如下值之一:
值 | 含义 |
---|---|
PS_SOLID | 实线 |
PS_DASH | 虚线(nWidth 参数的值必须 <= 1) |
PS_DOT | 点线(nWidth 参数的值必须 <= 1) |
PS_DASHDOT | 点划线(nWidth 参数的值必须 <= 1) |
PS_DASHDOTDOT | 点点划线(nWidth 参数的值必须 <= 1) |
PS_NULL | 该画笔看不见 |
PS_INSIDEFRAME | 该画笔用于在 GDI 函数绘图中实现,绘制椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画笔宽度向内扩展。 |
备注:
如果 lopnWidth 成员的值大于 1,且 lopnStyle 成员的值为 PS_INSIDEFRAME,所有与该画笔相关联(除了折线和多边形)的封闭图形绘制,画笔宽度向内扩展。
如果指定的 RGB 颜色不存在,就进行抖动处理。
如果 lopnWidth 成员的值小于等于 1,则 PS_INSIDEFRAME 样式与 PS_SOLID 相同。
GetObject
GetObject 函数用于获得指定图形对象的信息。
- API 函数原型:
int GetObject(_In_ HGDIOBJ hgdiobj,_In_ int cbBuffer,_Out_ LPVOID lpvObject
);
参数解析:
参数 | 含义 |
---|---|
hgdiobj | 【1】 指定目标图形对象的句柄 【2】 它可以是这样的一个句柄:逻辑位图、画刷、字体、调色板、画笔或通过调用 CreateDIBsection 函数创建的与设备无关位图 |
cbBuffer | 指定将要写到缓冲区的信息的字节数 |
lpvObject | 指向一个缓冲区的指针(该缓冲区将用于存放指定图形对象的信息) |
下边列出的是缓冲区获得的每种图形对象的信息类型(通过 hgdiobj 参数指定)
对象类型 | 写入到缓冲区的数据 |
---|---|
HBITMAP | BITMAP 结构 |
HBITMAP(通过调用 CreateDIBSection 函数获得) | 【1】DIBSECTION 结构(如果 cbBuffer 参数的值被设置为 sizeof (DIBSECTION))【2】BITMAP 结构(如果 cbBuffer 参数的值被设置为 sizeof (BITMAP)) |
HPALETTE | 逻辑调色板的颜色数(WORD 类型) |
HPEN(通过调用 ExtCreatePen 函数获得) | EXTLOGPEN 结构 |
HPEN | LOGPEN 结构 |
HBRUSH | LOGBRUSH 结构 |
HFONT | LOGFONT 结构 |
*注释:*lpvObject 参数指向的地址必须是 4 字节的倍数,否则 GetObject 函数调用失败。
返回值:
如果函数调用成功,且 lpvObject 参数是一个有效的指针,则返回值是存储到缓冲区的字节数;
如果函数调用成功,而 lpvObject 参数是 NULL,则返回值是需要存储到缓冲区的信息的字节数;
如果函数调用失败,返回值是 0。
备注:
lpvObject 参数指向的缓冲区一定要足够大以接收图形对象的信息。
如果 hgdiobj 参数指定一个由调用 CreateDIBSection 函数创建的位图,且指定的缓冲区足够大,则 GetObject 函数返回一个 DIBSECTION 结构。
如果 hgdiobj 参数指定一个通过其他途径创建的位图,则 GetObject 只返回位图的宽、高和颜色格式信息,通过调用 GetDIBits 或 GetBitmapBits 函数可以得到位置的位值。
如果 hgdiobj 参数指定一个逻辑调色板,则 GetObject 获得一个 2 字节的整数,该整数指定调色板中的项数,函数不会获得定义调色板的 LOGPALETTE 结构,为了获得有关调色板项的信息,应用程序可以调用
GetPaletteEntries
函数。
DeleteObject
DeleteObject 函数用于删除一个逻辑画笔、画刷、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源。
注意,在对象被删除之后,指定的句柄也就失效了。
- API 函数原型:
BOOL DeleteObject(_In_ HGDIOBJ hObject
);
参数解析:
参数 | 含义 |
---|---|
hObject | 指定待删除的逻辑画笔、画刷、字体、位图、区域或者调色板的句柄 |
返回值:
如果函数调用成功,返回值是非 0;
如果指定的句柄无效或者它已被选入设备环境,则返回值是 0。
备注:
当一个绘画对象(如画笔或画刷)当前被选入一个设备环境中时,不要删除该对象。
当一个画刷被删除时,与该画刷相关的位图并不被删除,该图必须单独地删除。
GetCurrentObject
GetCurrentObject 函数用于获得被选入指定环境设备中的指定对象类型的句柄。
- API 函数原型:
HGDIOBJ GetCurrentObject(_In_ HDC hdc,_In_ UINT uObjectType
);
参数解析:
参数 | 含义 |
---|---|
hdc | 指定设备环境句柄 |
uObjectType | 指定要获取的对象类型 |
uObjectType 参数可以是下边任意一值:
值 | 含义 |
---|---|
OBJ_BITMAP | 返回指定设备环境选入的位图 |
OBJ_BRUSH | 返回指定设备环境选入的画刷 |
OBJ_COLORSPACE | 返回指定设备环境选入的色彩空间 |
OBJ_FONT | 返回指定设备环境选入的字体 |
OBJ_PAL | 返回指定设备环境选入的调色板 |
OBJ_PEN | 返回指定设备环境选入的画笔 |
返回值:
如果函数调用成功,返回值是指定对象的句柄;
如果函数调用失败,返回值是 NULL。
备注:
应用程序可以使用 GetCurrentObject
函数和 GetObject
函数来获得对当前选入给定设备环境的图形对象的描述。
enjoy it ~
windows编程之画笔相关推荐
- 【Windows编程】系列第三篇:文本字符输出
2019独角兽企业重金招聘Python工程师标准>>> 上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输 ...
- MFC与Windows编程
Windows编程基础 MFC:Microsoft Foundation Classes,它封装了WIN32/WIN64功能,在MFC应用程序中,可以使用一组标准类,它们把我们与Windows API ...
- Windows编程 第四回 Windows程序的生与死(下)
致歉 很抱歉,读者看到的这篇文章将是我写的最没什么条理的一篇了,由于这一块儿内容是所有Windows程序的核心与基础,所以我分了三回来写.我想讲 得既易懂有又丰富,无奈本人才疏学浅,每每一提笔就要查很 ...
- 有一定基础的 C++ 学习者该如何学习 Windows 编程?
这篇文章是回答一位知友的提问: 有一定基础是指对大学教材级别的C++知识有了解,然而只停留在黑框程序的编写和阅读上. 手头有一个使用VS2010开发的windows工程想要读懂(这是契机,不是原因), ...
- windows编程常用系统API函数
windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...
- Windows编程的图形基础(一)HDC, HPEN, HBRUSH
在windows编程中,要在设备(显示器)上显示相应的图像,这里先针对简单的对象,比如line, polygon, 矩形,椭圆等,实现的具体过程如下: 首先要获得设备句柄,有了设备句柄你才可以在相应设 ...
- c语言windows编程句柄,HANDLE句柄(windows编程)
首先什么是句柄?(理解了句柄,也就知道了句柄和指针的区别了) 所谓句柄实际上是一个数据,是一个Long (整长型)的数据. 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WIND ...
- Windows 编程,画笔画刷以及几何图形的绘制
Windows编程,画笔画刷的介绍 画笔,可以用以下代码新建一个画笔对象: HPEN hpen = CreatePen(PS_SOLID, 1, RGB(255,0,0)); 可以看到,画笔的Crea ...
- Windows编程---句柄
句柄,是整个Windows编程的基础.一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动 ...
最新文章
- PHP中self和static的区别,php中self与static的区别
- 如何发现数据中的异常值?对异常值是怎么处理的?
- jQuery基础介绍
- 排序算法--睡眠排序
- python教学视频a_2019何老师一个月带你玩转Python分布式爬虫实战教程视频(视频+源码)...
- centos7 kickstart 使用小结
- sqlserver获取当前时间_c#获取并显示当前日期时间
- 用JSmooth制作java jar文件的可运行exe文件教程【图文】
- 拼音输入法功能大比拼
- All-In-One Code Framework [一站式示例代码库] 【转】
- Python3 Ocr 初探
- socket中使用心跳来检测连接是否断开[ZT]
- mysql 从服务器同步数据_MySQL 同一台服务器同步数据
- Python---面向对象(一)
- php如何定义变量,它和c# 等语言有什么不同呢?,PHP 变量和常量的定义
- 缓存与缓冲的区别 cache与buffer的区别
- 安装一台RHEL7虚拟机
- 管家婆辉煌7.2 7.1 年结存导致单据明细丢失 提示:这段时间无过帐单据。
- MySQL pt工具应用
- 联想网上审批系统方案
热门文章
- 新品发布 | P600准行业无人机研发平台,室外视觉识别跟踪、激光雷达避障、多机组网!
- 关于Ubuntu的16.04对应版本的ros安装和turtlebot安装
- 会python_会Python了不起吗?是的,简直开挂!
- 读书笔记-干法-人生三毒
- 【工具篇】EasyExcel的应用
- 某公司HP-EVA4400存储硬盘离线的数据恢复方法和数据恢复过程
- 论文解读(一)V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
- Api 接口文档是什么?如何直接使用 ApiDoc 生成接口文档
- Typora+Gitee打造个人云笔记
- iOS 将状态栏设置成白色