windows编程之画笔

windows编程之画笔

GetStockObject

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

  • API 函数原型:
HGDIOBJ GetStockObject(
  _In_  int fnObject
);

参数解析:

参数含义
fnObject指定待获取对象的类型,具体参考下边。

fnObject 可取如下值之一

含义
BLACK_BRUSH黑色画刷
DKGRAY_BRUSH暗灰色画刷
DC_BRUSH1. 纯色画刷,默认颜色是白色的 2. 调用 SetDCBrushColor 函数可以修改该值的颜色
GRAY_BRUSH灰色画刷
HOLLOW_BRUSH空画刷(相当于 NULL_BRUSH)
LTGRAY_BRUSH浅灰色画刷
NULL_BRUSH空画刷(相当于 HOLLOW_BRUSH)
WHITE_BRUSH白色画刷
BLACK_PEN黑色画笔
DC_PEN1. 纯色画笔,默认颜色是白色的 2. 调用 SetDCPenColor 函数可以修改该值的颜色
NULL_PEN空画笔(空画笔不绘制任何东西)
WHITE_PEN白色画笔
ANSI_FIXED_FONTWindows 中的固定间距(等宽)系统字体
ANSI_VAR_FONTWindows 中的可变间距(比例间距)系统字体
DEVICE_DEFAULT_FONT设备相关字体
DEFAULT_GUI_FONT1. 用户界面对象(如菜单、对话框)的默认字体 2. 不推荐使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 获得对话框或系统的字体 3. 该字体默认是 Tahoma
OEM_FIXED_FONT原始设备制造商(OEM)相关固定间距(等宽)字体
SYSTEM_FONT1. 系统字体 2. 默认情况下,Windows 使用系统字体绘制菜单,对话框和文本 3. 不推荐使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 获得对话框或系统的字体 4. 该字体默认是 Tahoma
SYSTEM_FIXED_FONT1. 固定间距(等宽)系统字体 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指定设备环境句柄
hgdiobj1. 被选择的对象的句柄 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指定画笔样式,详细内容请看下边
nWidth1. 指定画笔的宽度 2. 如果该值为 0,则画笔为一个像素宽度,不管当前的映射模式
crColor1. 指定画笔的 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指定画笔样式,详细内容请看下边
lopnWidth1. 指定画笔的宽度 2. POINT 结构,Windows 只使用该结构的 x 成员表示画笔宽度,y 成员不使用 3. 如果该值为 0,则画笔为一个像素宽度,不管当前的映射模式
lopnColor1. 指定画笔的 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 参数指定)

对象类型写入到缓冲区的数据
HBITMAPBITMAP 结构
HBITMAP(通过调用 CreateDIBSection 函数获得)【1】DIBSECTION 结构(如果 cbBuffer 参数的值被设置为 sizeof (DIBSECTION))【2】BITMAP 结构(如果 cbBuffer 参数的值被设置为 sizeof (BITMAP))
HPALETTE逻辑调色板的颜色数(WORD 类型)
HPEN(通过调用 ExtCreatePen 函数获得)EXTLOGPEN 结构
HPENLOGPEN 结构
HBRUSHLOGBRUSH 结构
HFONTLOGFONT 结构

*注释:*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 ~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
说明文档:制作类似windows画笔的程序 功能: 文件—— 新建 打开 保存 另存为 页面设置——画布大小变化 退出 编辑—— 剪切 复制 粘贴 删除选定区域(但是背景变成黑色的了?!) 查看—— 工具栏、状态栏、颜料盒的显示与隐藏 大尺寸、常规尺寸、自定义尺寸的缩放 图像—— 翻转功能实现(包括水平、垂直翻转,以及180度旋转,90与270度旋转理论上亦实现了,只是速度有些慢,只能适用于小图形) 图像反色 颜色—— 编辑颜色功能实现 帮助—— 弹出信息框 界面: 突出显示按件 鼠标移动显示坐标 使用铅笔在画布上任意绘画,且可以变化颜色 橡皮擦功能实现(橡皮擦大小的变化可以通过改变笔刷粗细后改变) 拾色器功能实现 油漆桶功能实现 直线、笔刷功能实现 屏幕输入文字 放大镜功能实现!!(——强烈注意:它又名奇异镜> <……即使用之后,所有画图功能(比如颜色反色出现,橡皮变成铅笔……填充的色块可以叠加……,O(∩_∩)O哈哈~所以使用之后,记得退出程序,重新开启……) 可以画空心或实心的矩形 可以画空心或实心的椭圆和圆 喷枪功能实现(只是在画笔变粗时,效果会有些恶心……,建议通过笔刷,选择1,然后使用) 另:支持各种快捷键,如ctrl+S/ctrl+x 等,详情请见菜单栏。 使用的API函数与ActiveX控件: API函数: GetCursorPos GetDC GetPixel RoundRect ActiveX控件: 通用对话框控件, 位于“Microsoft CommonDialog Control 6.0” 中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值