GDI 画刷(10)
创建画刷
调用 CreateSoildBrush、CreateHatchBrush、CreateBrushIndirect 函数可以创建画刷。
CreateSoildBrush:创建实心画刷;
CreateHatchBrush:创建阴影画刷;
CreateBrushIndirect:根据 LOGBRUSH 结构的内容创建画刷;
Windows 使用被选入设备环境的画笔来描绘边线,使用被选入设备环境的画刷来填充图形。
画刷使用的示例代码:
// 定义画刷句柄(HBRUSH)
HBRUSH hBrush; // 获取 GRAY_BRUSH 的句柄
hBrush = GetStockObject(GRAY_BRUSH); // 将画刷选入当前的设备环境
SelectObject(hdc, hBrush);
将 NULL_PEN 画笔选入当前的设备环境,可以绘制不含边线的图形:
SelectObject(hdc, GetStockObject(NULL_PEN));
同样地,将 NULL_BRUSH 画刷选入当前的设备环境,可以绘制不填充内容的图形:
SelectObject(hdc, GetStockObject(NULL_BRUSH));
多边形填充(Polygon)
调用 Polygon 函数可以绘制一个带边框线且带填充效果的多边形,它的参数与 Polyline 函数类似:
BOOL Polygon(
HDC hdc, // 设备环境句柄
CONST POINT *lpPoints, // 端点的集合(POINT 类型数组)
int nCount // 端点的数量
);
调用 PolyPolygon 函数可以绘制多个待边框线且带填充效果的的多边形,它的参数与 PolyPolyline 函数类似:
BOOL PolyPolygon(
HDC hdc, // 设备环境句柄
CONST POINT *lpPoints, // 所有端点的集合
CONST INT *lpPolyCounts, // 整型数组,每个元素是每个多边形各自的端点个数
int nCount // 多边形的数量
);
填充颜色取决于当前选入设备环境的画刷,填充模式可以调用 SetPolyFillMode 函数来设置:
- ALTERNATE 模式(扫描线碰到奇数边则填充,偶数边则不填充)
- WINDING 模式(能够一笔完成的图形则填充,否则不填充)
int SetPolyFillMode(
HDC hdc, // 设备环境句柄
int iPolyFillMode // 多边形填充模式,可选 ALTERNATE(交替)或 WINDING(螺旋)
);
五角星 Polygon 示例程序
#include <windows.h>
#include <math.h> #define TIMES 200
#define PI 3.1415926535897932384626433832795 LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc;
PAINTSTRUCT ps;
POINT ptCenter;
POINT apt[5];
HBRUSH hBrush, hOldBrush; static int cxClient, cyClient; switch (message) { case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0; case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); ptCenter.x = cxClient / 2;
ptCenter.y = cyClient / 2; apt[3].x = ptCenter.x;
apt[3].y = ptCenter.y - TIMES; apt[1].x = (LONG)(ptCenter.x + cos(PI / 10) * TIMES);
apt[1].y = (LONG)(ptCenter.y - sin(PI / 10) * TIMES); apt[4].x = (LONG)(ptCenter.x + cos(3 * PI / 10) * TIMES);
apt[4].y = (LONG)(ptCenter.y + sin(3 * PI / 10) * TIMES); apt[2].x = (LONG)(ptCenter.x - cos(3 * PI / 10) * TIMES);
apt[2].y = (LONG)(ptCenter.y + sin(3 * PI / 10) * TIMES); apt[0].x = (LONG)(ptCenter.x - cos(PI / 10) * TIMES);
apt[0].y = (LONG)(ptCenter.y - sin(PI / 10) * TIMES); hBrush = CreateSolidBrush(RGB(255, 255, 0));
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); Polygon(hdc, apt, 5); DeleteObject(SelectObject(hdc, hOldBrush));
EndPaint(hwnd, &ps);
return 0; case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd, message, wParam, lParam);
} int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LPCTSTR lpszClassName = TEXT("PolygonDemo");
LPCTSTR lpszWindowName = TEXT("Polygon Demo Program"); WNDCLASS wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WindowProc;
wndclass.lpszClassName = lpszClassName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("This program requires Windows NT!"), lpszWindowName, MB_ICONERROR);
return 0;
} HWND hwnd = CreateWindow(
lpszClassName,
lpszWindowName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
); ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd); MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}
GDI 画刷(10)的更多相关文章
- GDI+编程(画笔/画刷/路径/区域)
构造Graphics对象 Graphics类是GDI+程序设计的核心,Graphics类能够完成大部分的绘图,文本输出,几何图形的填充及坐标系统的转换等各种操作.在功能上,它与GDI的设备环境(DC) ...
- C#GDI+基础(三)画刷详解
SolidBrush:一般的画刷,通常只用一种颜色去填充GDI+图形 创建一般画刷: SolidBrush sbBrush1 = new SolidBrush(Color.Green); HatchB ...
- C# GDI绘图之——画笔和画刷
绘制图形需要画笔和画刷: Pen(画笔类): Pen为C#编程语言中专门的画笔类 使用方式: // 用系统颜色来初始化我们的画笔类,使用Color静态类中的颜色 1. Pen p1 = new Pen ...
- WPF 10天修炼 第八天 - 形状、画刷和变换
图形 在WPF中使用绘图最简单的就是使用Shape类.Shape类继承自FrameworkElement,是一个专门用来绘图的类.Shape类中年派生的类有直线.矩形.多边形和圆形等. System. ...
- VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)
上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...
- GDI+绘制图形和画刷填充图形
GDI+可以再Windows窗体应用程序中以编程方式绘制图形等. 可以在VS里新建项目-Windows窗体应用程序-建一个窗体.首先引入命名空间using System.Drawing.Imaging ...
- VS2010-MFC(图形图像:GDI对象之画刷CBrush)
转自:http://www.jizhuomi.com/software/248.html 上一节讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. ...
- c# gdi设置画刷透明
使用solidBrush新建画刷,定义画刷的颜色为透明色 Brush b = new SolidBrush(Color.FromArgb(50, Color.Green)); 这里的50是透明度的设置 ...
- MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)
MFC画眼睛 换画笔(画刷)颜色(参考链接:https://blog.csdn.net/sunxiving/article/details/51272001) 由于画笔一旦创建后就无法修改.所以要修改 ...
随机推荐
- [转]wcf系列学习——服务托管
今天是系列的终结篇,当然要分享一下wcf的托管方面的知识. wcf中托管服务一般有一下四种: Console寄宿: 利于开发调试,但不是生产环境中的最佳实践. winform寄 ...
- Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例
今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...
- Redis 3.0.0 正式版出炉,高性能 K/V 服务
Redis 3.0.0 正式版最终到来了,与 RC6 版本号比較.该版本号改进包含: * 修复了无磁盘的复制问题 (Oran Agra) * 在角色变化后对 BLPOP 复制进行測试 (Salvato ...
- ActionBar第一课简单介绍
.ActionBar简单介绍 ActionBar是显示在界面顶部的标题栏. 官方推荐开发者尽量使用 ActionBar代替OptionsMenu和TabHost. 典型应用方式有: 使用导航栏中的应用 ...
- [面试题]java中final finally finalized 的差别是什么?
final 是修饰符,能够用于修饰变量.方法和类.修饰变量时.代表变量不能够改动,也就是常量了.常量须要在定义时赋值或通过构造函数赋值,两者仅仅能选其一:修饰方法时,代表方法仅仅能调用,不能被 ove ...
- WCF学习笔记——契约不能少了set
我定义的WCF契约里,有一个类,里面的属性,有一个因为只读,所以只写了个get.结果客户端就报错. [DataContract] public class UserItem { public User ...
- 一条SQL语句求全年平均值
一年有8760个小时!(才这么点...) 有个气候表,存储了当地从1到8760小时的温度数据.现在,要求全年的温度每天平均值. CREATE TABLE #Climate(h INT ,t DECIM ...
- commons-fileupload上传文件(1)
近期,写一个上传图片的功能.于是用到commons-fileupload这个组件.提过form提交表单到后台(这里没实用到structs框架).在后台List pl = dfu.parseReques ...
- hdu 1429(BFS+状态压缩)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- Java 错误:找不到或无法加载主类(源文件中含有包名 package)
1. 问题定位 编译(javac)和执行(java)java 程序时,出现这种类型的错误:找不到或无法加载主类: 首先排除是否是环境变量配置不当造成的问题,只要保证,命令行界面能够识别 javac/j ...