本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/47271829

在上一篇中,我们说到了通过GdipCreateFromHDC函数将HDC(设备上下文句柄)装换成GDI+的Graphics对象,并讲到了画笔的使用,这一篇就来讲讲画刷。

画刷和画笔差不多,就是画刷是画的实心的图形、

其实画刷有很多种,这里只介绍最常用的两种,分别是单色画刷线性渐变画刷

还是和以前一样,我们必须自己声明GDI+Flat函数,自己定义GDI+Flat的数据结构。自己动手,丰衣足食。~~

对于画刷的创建和销毁,其实是GDI+调用的GDI+Flat的这几个函数:GdipCreateSolidFill、GdipCreateLineBrush和GdipDeleteBrush

我们把这两个函数自己声明出来!不用那些GDI+类的东西!只用C和Win32的最基本的数据类型!

//画刷
typedef struct _PointF{float x;float y;
}PointF;
extern "C" int WINAPI GdipCreateSolidFill(unsigned int argb_color,int** brush);
extern "C" int WINAPI GdipCreateLineBrush(PointF* point1, PointF* point2, unsigned int argb_color1,unsigned int argb_color2,int wrapMode,int** lineGradient);
extern "C" int WINAPI GdipDeleteBrush(int* brush);

GdipCreateSolidFill:创建单色画刷

参数1:画刷的ARGB颜色

参数2:指向一个画刷的指针,用于接收返回的画刷,画刷是int*

GdipCreateLineBrush:创建线性渐变画刷

参数1:起点坐标,是我上面定义的PointF结构,PointF结构中:x为横坐标,y为纵坐标

参数2:终点坐标,是我上面定义的PointF结构,PointF结构中:x为横坐标,y为纵坐标

参数3:画刷的起点ARGB颜色

参数4:画刷的终点ARGB颜色

参数5:wrapMode 包围模式:WrapModeTile=0,WrapModeTileFlipX=1,WrapModeTileFlipY=2,WrapModeTileFlipXY=3,WrapModeClamp=4

其中0最为常用,为“平铺模式“。MSDN:https://msdn.microsoft.com/en-us/library/ms534407(v=vs.85).aspx

参数6:指向一个画刷的指针,用于接收返回的画刷,画刷是int*

GdipDeleteBrush:销毁画刷

参数:要销毁的画刷

以上三个函数的返回值:0成功,非0失败

通过画刷画图,以画填充矩形为例:

//画填充矩形
extern "C" int WINAPI GdipFillRectangle(int graphics, int* brush, float x, float y, float width, float height);

GdipFillRectangle:画填充矩形

参数1:Graphics对象

参数2:画刷

参数3-6:矩形左上角的x坐标,y坐标,矩形宽度,矩形高度

例子:

<pre class="cpp" name="code">    case WM_PAINT:HDC hdc;PAINTSTRUCT ps;hdc = BeginPaint(hwnd, &ps);int graphics;GdipCreateFromHDC(hdc, &graphics);//创建Graphics对象GdipCreateSolidFill(0x700000FF, &brush);//创建单色画刷GdipFillRectangle(graphics, brush, 10, 10, 60, 60);//用单色画刷填充矩形PointF p1; p1 = { 70, 0 };PointF p2; p2 = { 170, 0 };GdipCreateLineBrush(&p1, &p2, 0xFFFF0000, 0x400000FF, 0, &linebrush);//创建线性渐变画刷GdipFillRectangle(graphics, linebrush, 70, 70, 100, 100);//用线性渐变画刷填充矩形GdipDeleteBrush(brush);//销毁画刷GdipDeleteBrush(linebrush);//销毁画刷GdipDeleteGraphics(graphics);//销毁Graphics对象EndPaint(hwnd, &ps);return 0;//告诉系统,WM_PAINT消息我已经处理了,你那儿凉快哪儿玩去吧。

效果图:

完整源码:

#include "stdafx.h"
#include <gdiplus.h>
#include <gdiplusflat.h>
#pragma comment(lib,"gdiplus.lib")//very important#include <windows.h>
#include <windowsx.h>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"gdi32.lib")//GDI+Flat
typedef struct _GdiplusStartupInput{unsigned int GdiplusVersion;unsigned int DebugEventCallback;BOOL SuppressBackgroundThread;BOOL SuppressExternalCodecs;
}GdiplusStartupInput;extern "C" int WINAPI GdiplusStartup(int* token, GdiplusStartupInput *input, int *output);
extern "C" void WINAPI GdiplusShutdown(int token);
extern "C" int WINAPI GdipCreateFromHDC(HDC hdc, int* graphics);
extern "C" int WINAPI GdipDeleteGraphics(int graphics);
//画笔
extern "C" int WINAPI GdipCreatePen1(unsigned int argb_color, float width, int unit, int** pen);
extern "C" int WINAPI GdipDeletePen(int* pen);
//画矩形 画直线
extern "C" int WINAPI GdipDrawRectangle(int graphics, int* pen, float x, float y, float width, float height);
extern "C" int WINAPI GdipDrawLine(int graphics, int* pen, float x1, float y1, float x2, float y2);
//画刷
typedef struct _PointF{float x;float y;
}PointF;
extern "C" int WINAPI GdipCreateSolidFill(unsigned int argb_color, int** brush);
extern "C" int WINAPI GdipCreateLineBrush(PointF* point1, PointF* point2, unsigned int argb_color1, unsigned int argb_color2, int wrapMode, int** lineGradient);
extern "C" int WINAPI GdipDeleteBrush(int* brush);
//画填充矩形
extern "C" int WINAPI GdipFillRectangle(int graphics, int* brush, float x, float y, float width, float height);int token;
int* pen;
int* brush;
int* linebrush;//*************************************************************
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);WNDCLASS wc;
const TCHAR* AppName = TEXT("MyWindowClass1");
HWND hwnd1;int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow)
{//GDI+开启GdiplusStartupInput StartupInput = { 0 };StartupInput.GdiplusVersion = 1;if (GdiplusStartup(&token, &StartupInput, NULL))MessageBox(0, TEXT("GdiPlus开启失败"), TEXT("错误"), MB_ICONERROR);//这里是在构建窗口类结构wc.style = CS_HREDRAW | CS_VREDRAW;wc.lpfnWndProc = WndProc;//窗口回调函数指针wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;//实例句柄wc.hIcon = LoadIcon(hInstance, TEXT("ICON_1"));wc.hCursor = LoadCursor(NULL, IDC_ARROW);//默认指针wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);//默认背景颜色wc.lpszMenuName = NULL;wc.lpszClassName = AppName;//窗口类名//注册窗口类if (!RegisterClass(&wc)){MessageBox(NULL, TEXT("注册窗口类失败!"), TEXT("错误"), MB_ICONERROR);return 0;}//创建窗口int style = WS_OVERLAPPEDWINDOW;hwnd1 = CreateWindowEx(NULL, AppName, TEXT("窗口标题"), style, 50, 50, 500, 500, 0, LoadMenu(hInstance, TEXT("MENU1")), hInstance, 0);if (hwnd1 == NULL){MessageBox(NULL, TEXT("创建窗口失败!"), TEXT("错误"), MB_ICONERROR);return 0;}//无边框窗口SetWindowLong(hwnd1, GWL_STYLE, WS_OVERLAPPED | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);//显示、更新窗口ShowWindow(hwnd1, nCmdShow);UpdateWindow(hwnd1);//消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}//GDI+关闭GdiplusShutdown(token);//可以把这个写在消息循环后面,程序退出就销毁,或者在不需要GDI+时调用,比如GDI+窗口的WM_DESTROY消息里调用return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){case WM_PAINT:HDC hdc;PAINTSTRUCT ps;hdc = BeginPaint(hwnd, &ps);int graphics;GdipCreateFromHDC(hdc, &graphics);//创建Graphics对象GdipCreateSolidFill(0x700000FF, &brush);//创建单色画刷GdipFillRectangle(graphics, brush, 10, 10, 60, 60);//用单色画刷填充矩形PointF p1; p1 = { 70, 0 };PointF p2; p2 = { 170, 0 };GdipCreateLineBrush(&p1, &p2, 0xFFFF0000, 0x400000FF, 0, &linebrush);//创建线性渐变画刷GdipFillRectangle(graphics, linebrush, 70, 70, 100, 100);//用线性渐变画刷填充矩形if (0){//这是上一篇中画笔的代码,用if0作废GdipCreatePen1(0x60FF2015, 1, 2, &pen);//创建画笔GdipDrawRectangle(graphics, pen, 20, 20, 120, 120);//画矩形GdipDrawLine(graphics, pen, 50, 60, 170, 340);//画直线GdipDeletePen(pen);//销毁画笔}GdipDeleteBrush(brush);//销毁画刷GdipDeleteBrush(linebrush);//销毁画刷GdipDeleteGraphics(graphics);//销毁Graphics对象EndPaint(hwnd, &ps);return 0;//告诉系统,WM_PAINT消息我已经处理了,你那儿凉快哪儿玩去吧。case WM_CREATE:break;case WM_DESTROY://窗口已经销毁PostQuitMessage(0);//退出消息循环,结束应用程序return 0;break;case WM_LBUTTONDOWN://鼠标左键按下//让无边框窗口能够拖动(在窗口客户区拖动)PostMessage(hwnd, WM_SYSCOMMAND, 61458, 0);break;/*case WM_MOUSEMOVE://鼠标移动int xPos, yPos;xPos = GET_X_LPARAM(lParam);//鼠标位置X坐标yPos = GET_Y_LPARAM(lParam);//鼠标位置Y坐标//不要用LOWORD和HIWORD获取坐标,因为坐标有可能是负的break;*/default:break;}return DefWindowProc(hwnd, uMsg, wParam, lParam);//其他消息交给系统处理
}


GdiplusFlat(4)单色画刷 和 线性渐变画刷相关推荐

  1. WPF线性渐变画刷应用之——炫彩线条

    原文:WPF线性渐变画刷应用之--炫彩线条 效果图: Xaml代码: <Rectangle Width="800" Height="10"> < ...

  2. GDI+ 学习记录(10): 线性渐变画刷 - LinearGradientBrush

    为什么80%的码农都做不了架构师?>>>    //线性渐变画刷 varg: TGPGraphics;lb: TGPLinearGradientBrush;rect: TGPRect ...

  3. 转 Silverlight开发历程—(画刷与着色之线性渐变画刷)

    转自:http://blog.csdn.net/work201003/article/details/6960427 线性渐变画刷(LinearGradientBrush)用来填充一个复合渐变色到一个 ...

  4. WPF(C#) LinearGradientBrush线性渐变画刷

    LinearGradientBrush线性渐变画刷 LinearGradientBrush其实很简单,我们只需要关注5个属性,使用这5个属性你就可以完成这个画刷几乎所有的变化. 一.属性介绍 1.St ...

  5. GDI+学习之线性渐变画刷

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 作者:朱 ...

  6. WPF图形之纯色画刷和渐变画刷的使用

    背景介绍   在WPF中,画刷的使用无处不在,可以说画刷是整个WPF体系里不可或缺的一部分,在画刷中,从渲染效果的特征来看,可以分为纯色画刷.线性渐变画刷.径向渐变画刷.每一种画刷都有其适用的场景,下 ...

  7. GDI+学习笔记(六)渐变画刷

    画刷,顾名思义,就是像画刷一样,向设备上绘制,还记得小时候常唱的首歌,"我是一个粉刷匠.." 好吧,跑题了. 本系列博客希望尽可能简单的描述每项功能,而不希望把每个参数都介绍的详详 ...

  8. GDI+ 学习记录(11): 路径渐变画刷 - PathGradientBrush

    为什么80%的码农都做不了架构师?>>>    //路径渐变画刷 varg: TGPGraphics;path: TGPGraphicsPath;pb: TGPPathGradien ...

  9. CSS重复线性渐变之画格子

    正式开始文章前,先看图,看到以下图片你会想到什么呢?是不是程序员的标配来了,格子衫.没错,今天的内容就是用CSS画格子. 前言 看到上面各种各样的格子,你会用什么方式实现呢?由于格子的大小间隙及方向多 ...

最新文章

  1. 7.1.1 [Enterprise Library]缓存应用程序块场景和目标
  2. Apache Spark 介绍的演讲ppt (slice),全英文
  3. 配置SQL Server 2005 远程连接(转)
  4. 使用 ACE 库框架在 UNIX 中开发高性能并发应用
  5. 学习笔记之-php编码技巧
  6. 聊聊你知道和不知道的相关性系数
  7. 一个Web前端自学者的自述
  8. ellen 纽奥良大学演讲
  9. python代数式的表达方式_关于python字典类型最疯狂的表达方式
  10. hashtable允许null键和值吗_【29期】Java集合框架 10 连问,你有被问过吗?
  11. Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
  12. node获取windows pc 机器的标示
  13. LCD驱动程序详细讲解(三)
  14. iPhone的AFC(Apple File Conduit)
  15. IE插件技术 BHO C# IE 插件
  16. NoSQLBooster for MongoDB软件使用
  17. 判断一个字符串能否通过添加一个字符变成回文串
  18. cadence SPB17.4 - allegro - Artwork will be rounded down
  19. 你听到海豚们的哭声了吗?
  20. python实现QQ和微信刷屏

热门文章

  1. 微信小程序发起HTTPS网络通信
  2. c语言程序中函数未关联,在C语言的源程序函数中,函数体中可以没有任何语句
  3. 前端已死?全栈当立?取法于中,仅得其下。
  4. 贵阳市政府、英特尔与中国人工智能产业创新联盟签署战略合作备忘录
  5. 小米商城项目实战(一)顶部导航栏
  6. 几何算法——5.关于ACIS和Parasolid求交的调研以及返回参数设计
  7. MySQL学习笔记——课后练习
  8. 求实数的整数次幂(循环版)(高效)(位运算解题)
  9. STM32入门笔记03_EXTI外部中断详解+案例:红外对射计数、旋转编码器计数
  10. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(三)——Internal