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 默认调色板(该调色板由系统调色板中的静态色彩组成)

返回值:

  1. 如果函数调用成功,返回值是所申请的逻辑对象的句柄;

  2. 如果函数调用失败,返回值是 NULL。

备注:

  1. 不建议您使用该函数获得对话框和窗口的当前字体。应该使用 SystemParametersInfo 函数(SPI_GETNONCLIENTMETRICS 参数)来获得当前字体,因为 SystemParametersInfo 函数将考虑到当前主题,并提供了标题栏,菜单和消息对话框的字体信息。

  2. 仅在窗口风格为 CS_HREDRAWCS_VREDRAW 中,才能使用 DKGRAY_BRUSH、GRAY_BRUSH 和 LTGRAY_BRUSH 对象。如果在其他风格的窗口中使灰色画刷,可能导致在窗口移动或改变大小之后出现画刷模式错位现象,原始画刷不能被调整。

  3. HOLLOW_BRUSH 和 NULL_BRUSH 对象是一样的。

  4. 不必要通过调用[DeleteObject 函数来删除 Windows 预设的对象。

  5. 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

返回值:

  1. 如果选择对象不是区域并且函数调用成功,那么返回值是被取代的对象的句柄;

  2. 如果选择对象是区域并且函数执行成功,返回以下值之一:

含义
SIMPLEREGION 区域由单个矩形组成
COMPLEXREGION 区域由多个矩形组成
NULLREGION 区域为空
  1. 如果发生错误并且选择对象不是一个区域,那么返回值为 NULL,否则返回 HGDI_ERROR。

备注:

  1. 该函数返回先前指定类型的选择对象。

  2. 一个应用程序在它使用新对象进行绘制完成之后,应该用原始的默认对象替换新对象。

  3. 应用程序不能同时选择一个位图到多个设备环境中。

  4. 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 函数绘图中实现,绘制椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画笔宽度向内扩展。

返回值:

  1. 如果函数调用成功,返回值是新画笔的句柄;

  2. 如果函数调用失败,返回值是 NULL。

备注:

  1. 调用该函数创建新画笔之后,可以使用 SelectObject 函数将新画笔选入设备环境中。只有当画笔被选入设备环境,才能使用该画笔绘制线段或曲线。

  2. 如果 nWidth 参数的值是 0,则画笔为一个像素宽度,不管当前的映射模式。

  3. 如果 nWidth 参数的值大于 1,则 fnPenStyle 参数的值必须为 PS_NULL, PS_SOLID 或 PS_INSIDEFRAME 的其中一个。

  4. 如果 nWidth 参数的值大于 1,且 fnPenStyle 参数的值为 PS_INSIDEFRAME,所有与该画笔相关联(除了折线和多边形)的封闭图形绘制,画笔宽度向内扩展。

  5. 如果 nWidth 参数的值大于 1,且 fnPenStyle 参数的值为 PS_INSIDEFRAME,如果指定的 RGB 颜色不存在,就进行抖动处理。

  6. 如果你再也不需要该画笔,可以使用 DeleteObject 函数将其删除。


CreatePenIndirect

CreatePenIndirect 函数根据指定的 LOGPEN 结构创建一个画笔。

  • API 函数原型:
HPEN CreatePenIndirect(_In_  const LOGPEN *lplgpn
);

参数解析:

参数 含义
lplgpn 【1】指向 LOGPEN 结构 的指针 【2】 LOGPEN 结构 指定了画笔的样式、宽度和颜色

返回值:

  1. 如果函数调用成功,返回值是新画笔的句柄;

  2. 如果函数调用失败,返回值是 NULL。

备注:

  1. 调用该函数创建新画笔之后,可以使用 SelectObject 函数将新画笔选入设备环境中。只有当画笔被选入设备环境,才能使用该画笔绘制线段或曲线。

  2. 如果你再也不需要该画笔,可以使用 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 函数绘图中实现,绘制椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框时,画笔宽度向内扩展。

备注:

  1. 如果 lopnWidth 成员的值大于 1,且 lopnStyle 成员的值为 PS_INSIDEFRAME,所有与该画笔相关联(除了折线和多边形)的封闭图形绘制,画笔宽度向内扩展。

  2. 如果指定的 RGB 颜色不存在,就进行抖动处理。

  3. 如果 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 函数调用失败。

返回值:

  1. 如果函数调用成功,且 lpvObject 参数是一个有效的指针,则返回值是存储到缓冲区的字节数;

  2. 如果函数调用成功,而 lpvObject 参数是 NULL,则返回值是需要存储到缓冲区的信息的字节数;

  3. 如果函数调用失败,返回值是 0。

备注:

  1. lpvObject 参数指向的缓冲区一定要足够大以接收图形对象的信息。

  2. 如果 hgdiobj 参数指定一个由调用 CreateDIBSection 函数创建的位图,且指定的缓冲区足够大,则 GetObject 函数返回一个 DIBSECTION 结构。

  3. 如果 hgdiobj 参数指定一个通过其他途径创建的位图,则 GetObject 只返回位图的宽、高和颜色格式信息,通过调用 GetDIBits 或 GetBitmapBits 函数可以得到位置的位值。

  4. 如果 hgdiobj 参数指定一个逻辑调色板,则 GetObject 获得一个 2 字节的整数,该整数指定调色板中的项数,函数不会获得定义调色板的 LOGPALETTE 结构,为了获得有关调色板项的信息,应用程序可以调用 GetPaletteEntries 函数。


DeleteObject

DeleteObject 函数用于删除一个逻辑画笔、画刷、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源。

注意,在对象被删除之后,指定的句柄也就失效了。

  • API 函数原型:
BOOL DeleteObject(_In_  HGDIOBJ hObject
);

参数解析:

参数 含义
hObject 指定待删除的逻辑画笔、画刷、字体、位图、区域或者调色板的句柄

返回值:

  1. 如果函数调用成功,返回值是非 0;

  2. 如果指定的句柄无效或者它已被选入设备环境,则返回值是 0。

备注:

  1. 当一个绘画对象(如画笔或画刷)当前被选入一个设备环境中时,不要删除该对象。

  2. 当一个画刷被删除时,与该画刷相关的位图并不被删除,该图必须单独地删除。


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 返回指定设备环境选入的画笔

返回值:

  1. 如果函数调用成功,返回值是指定对象的句柄;

  2. 如果函数调用失败,返回值是 NULL。

备注:

应用程序可以使用 GetCurrentObject 函数和 GetObject 函数来获得对当前选入给定设备环境的图形对象的描述。


enjoy it ~

windows编程之画笔相关推荐

  1. 【Windows编程】系列第三篇:文本字符输出

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输 ...

  2. MFC与Windows编程

    Windows编程基础 MFC:Microsoft Foundation Classes,它封装了WIN32/WIN64功能,在MFC应用程序中,可以使用一组标准类,它们把我们与Windows API ...

  3. Windows编程 第四回 Windows程序的生与死(下)

    致歉 很抱歉,读者看到的这篇文章将是我写的最没什么条理的一篇了,由于这一块儿内容是所有Windows程序的核心与基础,所以我分了三回来写.我想讲 得既易懂有又丰富,无奈本人才疏学浅,每每一提笔就要查很 ...

  4. 有一定基础的 C++ 学习者该如何学习 Windows 编程?

    这篇文章是回答一位知友的提问: 有一定基础是指对大学教材级别的C++知识有了解,然而只停留在黑框程序的编写和阅读上. 手头有一个使用VS2010开发的windows工程想要读懂(这是契机,不是原因), ...

  5. windows编程常用系统API函数

    windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...

  6. Windows编程的图形基础(一)HDC, HPEN, HBRUSH

    在windows编程中,要在设备(显示器)上显示相应的图像,这里先针对简单的对象,比如line, polygon, 矩形,椭圆等,实现的具体过程如下: 首先要获得设备句柄,有了设备句柄你才可以在相应设 ...

  7. c语言windows编程句柄,HANDLE句柄(windows编程)

    首先什么是句柄?(理解了句柄,也就知道了句柄和指针的区别了) 所谓句柄实际上是一个数据,是一个Long (整长型)的数据. 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WIND ...

  8. Windows 编程,画笔画刷以及几何图形的绘制

    Windows编程,画笔画刷的介绍 画笔,可以用以下代码新建一个画笔对象: HPEN hpen = CreatePen(PS_SOLID, 1, RGB(255,0,0)); 可以看到,画笔的Crea ...

  9. Windows编程---句柄

    句柄,是整个Windows编程的基础.一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动 ...

最新文章

  1. PHP中self和static的区别,php中self与static的区别
  2. 如何发现数据中的异常值?对异常值是怎么处理的?
  3. jQuery基础介绍
  4. 排序算法--睡眠排序
  5. python教学视频a_2019何老师一个月带你玩转Python分布式爬虫实战教程视频(视频+源码)...
  6. centos7 kickstart 使用小结
  7. sqlserver获取当前时间_c#获取并显示当前日期时间
  8. 用JSmooth制作java jar文件的可运行exe文件教程【图文】
  9. 拼音输入法功能大比拼
  10. All-In-One Code Framework [一站式示例代码库] 【转】
  11. Python3 Ocr 初探
  12. socket中使用心跳来检测连接是否断开[ZT]
  13. mysql 从服务器同步数据_MySQL 同一台服务器同步数据
  14. Python---面向对象(一)
  15. php如何定义变量,它和c# 等语言有什么不同呢?,PHP 变量和常量的定义
  16. 缓存与缓冲的区别 cache与buffer的区别
  17. 安装一台RHEL7虚拟机
  18. 管家婆辉煌7.2 7.1 年结存导致单据明细丢失 提示:这段时间无过帐单据。
  19. MySQL pt工具应用
  20. 联想网上审批系统方案

热门文章

  1. 新品发布 | P600准行业无人机研发平台,室外视觉识别跟踪、激光雷达避障、多机组网!
  2. 关于Ubuntu的16.04对应版本的ros安装和turtlebot安装
  3. 会python_会Python了不起吗?是的,简直开挂!
  4. 读书笔记-干法-人生三毒
  5. 【工具篇】EasyExcel的应用
  6. 某公司HP-EVA4400存储硬盘离线的数据恢复方法和数据恢复过程
  7. 论文解读(一)V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
  8. Api 接口文档是什么?如何直接使用 ApiDoc 生成接口文档
  9. Typora+Gitee打造个人云笔记
  10. iOS 将状态栏设置成白色