画笔和画刷是重要的GDI对象,因为不管你画什么图形都需要画笔和画刷,虽然多数情况下是系统默认的。

Windows提供的三种备用画笔(stock pen)

白色画笔:WHITE_PEN
黑色画笔:BLACK_PEN //这是默认的画笔
空画笔:NULL_PEN

使用画笔需要以下几个函数:

//获取预定义的备用笔、刷子、字体或者调色板的句柄
//HGDIOBJ就是GDI对象的句柄

HGDIOBJ GetStockObject(int fnObject   //对象类型
);

//该函数选择一对象到指定的设备上下文环境中,新对象替换先前的相同类型的对象。

HGDIOBJ SelectObject( HDC hdc,          // 设备环境句柄HGDIOBJ hgdiobj   // 对象句柄
);

它返回一个先前选入DC的句柄,比如hPen=SelectObject(hDc,GetStockObject(WHITE_PEN));
此时hPen的颜色为BLACK_PEN,当前为WHITE_PEN。

//删除对象句柄

BOOL DeleteObject( HGDIOBJ hObject   //对象句柄
);

如果想用画笔,就必须把该画笔选到设备环境。

例如:

HPEN hPen=nullptr;//创建画笔句柄hPen=(HPEN)GetStockObject(WHITE_PEN);//获取画笔颜色SelectObject(hDc,hPen);//把画笔选入设备环境[其它代码]DeleteObject(hPen);

创建自定义画笔:
画笔、画刷、位图、区域、字体和调色盘都是GDI对象,这些对象要用的话都要选入设备环境

我们要用到如下函数:

//创建一个逻辑画笔
//成功返回一个逻辑画笔句柄,否则返回NULL

HPEN CreatePen(int fnPenStyle,    // 画笔风格,参阅MSDNint nWidth,        // 画笔宽度(像素为单位)COLORREF crColor   // 画笔颜色
);

例如:

      //创建逻辑画笔hPen = CreatePen(PS_SOLID, 4, RGB(255,255,0));SelectObject(hdc, hPen);//选入设备环境MoveToEx(hdc, 10, 10, nullptr);LineTo(hdc, 200, 200);EndPaint(hwnd, &ps);DeleteObject(hPen);//删除画笔

逻辑画笔信息结构

typedef struct tagLOGPEN { UINT     lopnStyle; //画笔风格POINT    lopnWidth; //画笔宽度,只用x,y不用COLORREF lopnColor; //画笔颜色
} LOGPEN, *PLOGPEN; 

创建逻辑画笔

HPEN CreatePenIndirect(CONST LOGPEN *lplgpn   // 指向逻辑画笔信息结构的指针
);

例如:

           POINT pt[1] = {0};HPEN hPen = nullptr;//创建逻辑画笔信息结构LOGPEN logpen = {0};[其它代码]//设置画笔宽度pt[0].x= 4;logpen.lopnStyle = PS_SOLID;//画笔风格logpen.lopnWidth = pt[0];   logpen.lopnColor = RGB(255, 255, 0);hPen = CreatePenIndirect(&logpen);SelectObject(hdc, hPen);MoveToEx(hdc, 10, 10, nullptr);LineTo(hdc, 200, 200);EndPaint(hwnd, &ps);DeleteObject(hPen);

//获取指定对象句柄的信息

int GetObject(HGDIOBJ hgdiobj,  // 对象句柄int cbBuffer,     // 指定将要写到缓冲区的信息的字节数目LPVOID lpvObject  // 指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息
);

例如:

        POINT pt[1] = {0};HPEN hPen = nullptr;LOGPEN logpen = {0};//缓冲区长度DWORD iLength = 0;//存放输出信息的缓冲区WCHAR SZBuffer[100] = { 0 };hPen = CreatePen(PS_SOLID, 4, RGB(255, 255, 0));SelectObject(hdc, hPen);//获取hPen的信息GetObject(hPen, sizeof(LOGPEN), &logpen);//获取logpen里面的信息iLength = wsprintfW(SZBuffer, TEXT("logpen.lopnStyle =%u logpen.lopnWidth=%u logpen.lopnColor = %u"),logpen.lopnStyle,logpen.lopnWidth,logpen.lopnColor);TextOut(hdc, 200, 200, SZBuffer, iLength);MoveToEx(hdc, 10, 10, nullptr);LineTo(hdc, 200, 200);EndPaint(hwnd, &ps);DeleteObject(hPen);

//获取当前被选入设备环境的画刷句柄
HGDIOBJ GetCurrentObject(
HDC hdc, // 设备环境句柄
UINT uObjectType // 对象类型
);

hPen=GetCurrentObject(hDc,OBJ_PEN);

接下以来到画刷。

Windows提供的六种备用画刷(stock brush)

白色画刷:WHITE_BRUSH
浅灰色画刷:LTGRAY_BRUSH、
灰色画刷:GRAY_BRUSH、
深灰色画刷:DKGRAY_BRUSH、
黑色画刷:BLACK_BRUSH
空画刷:NULL_BRUSH (也叫HOLLOW_BRUSH)

其原理和画笔一样,就不多讲了。
要注意的是,这里的选入DC的画刷和窗口类中的背景画刷不一样
这里的画刷是当画某个图形的时候里面会自动填充该画刷的颜色。

创建自定义画刷,其原理也和画笔基本一样:

//创建一个逻辑画刷

HBRUSH CreateSolidBrush(COLORREF crColor   // 画刷颜色
);

//创建一个有阴影线的画刷

HBRUSH CreateHatchBrush(int fnStyle,      // 阴影风格COLORREF clrref   // 指定用于阴影的刷子的前景色
);

//逻辑画刷信息结构

typedef struct tagLOGBRUSH { UINT     lbStyle; //画刷风格COLORREF lbColor; //画刷颜色LONG     lbHatch; //阴影风格
} LOGBRUSH, *PLOGBRUSH; 

//创建逻辑画刷

HBRUSH CreateBrushIndirect(CONST LOGBRUSH *lplb   // 指向LOGBRUSH的指针
);

例如:

        hPen = CreatePen(PS_SOLID, 4, RGB(255, 255, 0));SelectObject(hdc, hPen);//使用纯画刷logbrush.lbStyle = BS_SOLID;//使用阴影画刷//logbrush.lbStyle = BS_HATCHED;logbrush.lbHatch = HS_CROSS;logbrush.lbColor = RGB(255, 255, 0);hBrush = CreateBrushIndirect(&logbrush);SelectObject(hdc, hBrush);//这是画矩形的函数Rectangle(hdc, 100, 100, 300, 300);

画笔和画刷基本就这样使用了,还有位图画刷,这是后面才用到的内容。

Windows程序设计--画笔和画刷相关推荐

  1. 【VC++ MFC】vc 画笔和画刷|OnDraw()和OnPaint()

    目录 [VC++ MFC]vc 画笔和画刷 [VC++ MFC]OnDraw()和OnPaint() [VC++ MFC]vc 画笔和画刷 6,利用画笔改变线条颜色和类型: CPen pen(PS_D ...

  2. MFC基本图形的绘制(一)设备环境类CDC、画笔和画刷

    Windows的GDI(设备图形接口),提供了绘图的基本工具,如:画点.线.多边形.位图以及文本输出等.MFC的设备环境类CDC封装了全部的绘图函数,使得绘制的图形即可以显示,又可以打印. 概述 Vi ...

  3. 五、C语言创建桌面程序:画笔和画刷

    一.画笔画刷的概念 画笔和画刷都用来在画布上绘图.画布就是用来绘画的一块背景,可以有颜色,也可以没有,也可以有图案(比如条纹.网格等):画布可以理解为我们平时作图时使用的纸. 画笔用来画线,可以是封闭 ...

  4. win32 7.2 绘制图形 画笔和画刷

    "画笔和画刷"的介绍: GDI 中的绘画函数有 3 大类:画点.画线和画填充区域.对于photoshop之类的,一定知道,画线需要画笔,画填充区域需要画刷. GDI 同样也有画刷画 ...

  5. MFC——画笔和画刷

    MFC--画笔和画刷 一.画笔 1.创建画笔对象 MFC 中可以使用CPen创建画笔对象,其构造函数如下: CPen(int nPenStyle, //指定画笔样式int nWidth, //指定画笔 ...

  6. CSharp代码示例每日一讲: 在GDI+中使用画笔和画刷

    CSharp代码示例每日一讲,为刚刚学习编程的人准备,利用最简单的代码介绍CSharp编程知识! 画笔和画刷是图形应用中最常用的两种对象.笔用于绘制图形对象的轮廓,如线条和曲线;刷子是用来填充图形对象 ...

  7. MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)

    MFC画眼睛 换画笔(画刷)颜色(参考链接:https://blog.csdn.net/sunxiving/article/details/51272001) 由于画笔一旦创建后就无法修改.所以要修改 ...

  8. Windows程序设计——Ellipse函数画圆及不用Windows自带的画椭圆函数画椭圆

    Ellipse函数的用法 函数功能:该函数用于画一个椭圆,椭圆的中心是限定矩形的中心,使用当前画笔画椭圆,用当前的画刷填充椭圆. 函数原型:BOOL Ellipse(HDC hdc, int nLef ...

  9. 画笔和画刷的种类和使用方法

    画笔的使用和上一章的字体类似,首先用CreatePen()函数创建一个画笔对象,然后与设备文本绑定,同时得到旧的画笔.用完后删除新画笔,并且恢复旧画笔.画笔的种类有7种,参照下表及下面的例子. 值 说 ...

最新文章

  1. 让你的JS代码更具可读性
  2. Java基础 Day07(方法)
  3. 虚拟社会建设需要“网络社工”助力
  4. 记一种数据库水平扩展的技巧
  5. 英国如何推动分享经济的发展?
  6. Git Flow工作流图
  7. 【2016年第6期】大规模分布式科学数据管理与服务技术架构及系统
  8. python IDLE添加行号显示
  9. cocos2d-x之物理世界(创建物理世界)
  10. linux vi下划线,如何将我的Vim高亮线更改为不是下划线?
  11. 上海是怎么错失这些年的互联网机遇的?——写的很好,转
  12. html 微信声音自动播放 和 滑动屏幕播放
  13. C++重学之路 1 计算机和C++简介
  14. scrum立会报告+燃尽图(第三周第四次)
  15. acer计算机的无线功能键,Acer笔记本Fn组合键功能说明
  16. 算法表示法之大O表示法
  17. python读取txt文件并分割成列表_在python中读取文本文件并将其拆分为单个单词
  18. 布朗大学数学与计算机科学,数学差的人不配学计算机?布朗大学教授告诉你一毛钱关系都没有...
  19. 沙子是如何变成Micro LED模组。
  20. node.js的安装包 14.17版本

热门文章

  1. 安装cantera并且运行一个官方示例
  2. 前端使用原生js实现全局快捷键功能
  3. mysql replicate函数_使用mysqlreplicate命令快速搭建 Mysql 主从复制
  4. Unity Mecanim动画系统 之 IK(Inverse Kinematics即反向动力学)的相关说明和简单使用
  5. mysql utl_file_Oracle之UTL_FILE 包用法详解
  6. 台达DVP-MC运动控制器不完整笔记-目录
  7. 使用date -s修改系统时间未成功hwclock --hctosys同步系统时间未生效——解决办法
  8. python 大智慧 dll 下单_大智慧闪电下单
  9. 2,【electron+vue】 构建桌面应用——常见的功能及问题(修改桌面图标,软件图标,窗口图标,图标不显示问题,影藏默认菜单栏,开机自启,手动或被动关闭应用)
  10. 微信早教小程序源码开发设计方案