中年人学C语言Windows程序设计,13窗口绘画:画笔

本文介绍了中年人学习C语言时如何在Windows程序设计中利用GetStockObject函数获取预设画笔,如黑色、白色和不同灰度级别的画刷,以及如何通过CreatePen创建自定义画笔和SetBkMode设置背景模式。通过实例演示了如何在窗口绘画中使用这些功能,包括实线、虚线和点线等效果。
摘要由CSDN通过智能技术生成

中年人学C语言Windows程序设计,13窗口绘画:画笔

GetStockObject

函数功能:

GetStockObject 函数用于获得 Windows 预设的画笔、画刷、字体或者调色板的句柄。

API 函数原型:

注释:_In_ 说明该参数是输入的。
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_HREDRAW 和 CS_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 函数原型:

注释:In 说明该参数是输入的。

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 函数原型:

注释:In 说明该参数是输入的。

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 函数将其删除。

SetBkColor

函数功能:

SetBkColor 函数用于设置当前的背景颜色。

如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。

API 函数原型:

注释:In 说明该参数是输入的。

COLORREF SetBkColor(
  _In_  HDC hdc,
  _In_  COLORREF crColor
);

参数解析:

参数 含义
hdc 指定设备环境句柄
crColor 新的背景颜色值(使用 RGB 宏获得 COLORREF 类型)

返回值:

  1. 如果函数调用成功,返回值是先前背景的颜色值(COLORREF 类型);

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

备注:

  1. 该函数填充由 CreatePen 函数创建出来的非实线画笔之间的空隙(例如点线画笔,填充的是画笔间点和线的空隙,不是客户区的背景颜色哦)。

  2. 该函数不会填充由 ExtCreatePen 函数创建出来的画笔。

  3. 该函数也可以用于填充 TextOut 函数和 ExtTextOut 函数输出字符的背景颜色。

  4. 如果背景颜色设置为不透明(OPAQUE)时,背景颜色用来填充非实线画笔风格的间隙、阴影画刷和字符的背景颜色。

SetBkMode

Windows 也允许我们设置画笔对象的背景模式,总共有两种模式:透明(TRANSPARENT)和不透明(OPAQUE),刚才我们说了,默认是不透明的,所以我们看得到画笔对象的背景颜色,我们可以调用 SetBkMode 函数将背景模式设置为透明。

函数功能:

SetBkMode 函数用于设置字符、阴影画刷和非实线画笔的背景模式。

API 函数档案:

注释:In 说明该参数是输入的。

int SetBkMode(
  _In_  HDC hdc,
  _In_  int iBkMode
);

参数解析:

参数 含义
hdc 指定设备环境句柄
iBkMode 背景模式:
OPAQUE 使用当前背景颜色来填充字符、阴影画刷和非实线画笔的空隙
TRANSPARENT 背景模式为透明,Windows 不填充字符、阴影画刷和非实线画笔的空隙

返回值:

  1. 如果函数调用成功,返回值是先前的背景模式;

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

备注:

  1. 该函数将影响到由 CreatePen 函数创建的非实线画笔。

  2. 该函数并不会影响到由 ExtCreatePen 函数创建的画笔。

SetROP2

函数功能:

SetROP2 函数用于设置当前的前景色混合模式(绘图模式)。

GDI 使用前景色混合模式,将画笔的颜色和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值