GdiPlus

2023-11-10

GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。

在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。
GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。
作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离.从而使开发人员编写设备无关的应用程序变得非常容易。

相关头文件

//GDI Plus
#include <gdiplus.h>     //gdiplus是基于MFC的..需要在MFC工程中使用,或者包含一下MFC的头文件
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;

win32项目会报错,因为GdiPlus依赖MFC

//解决#error:  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version.
//也可以使用mt运行库
#define _AFXDLL
//mfc头文件
#include <afxwin.h>
#include <afxdisp.h>

初始化Gdiplus

    //初始化GDI Plus应用环境
	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

关闭Gdiplus

	//释放GDI Plus的应用环境
	GdiplusShutdown(gdiplusToken);

demo



//解决#error:  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version.
//也可以使用mt运行库
#define _AFXDLL
//mfc头文件
#include <afxwin.h>
#include <afxdisp.h>

#include "framework.h"
#include "GdiPlus.h"

//GDI Plus
#include <gdiplus.h>     //gdiplus是基于MFC的..需要在MFC工程中使用,或者包含一下MFC的头文件
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    //初始化GDI Plus应用环境
	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    // 初始化全局字符串
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_GDIPLUS, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // 执行应用程序初始化:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GDIPLUS));

    MSG msg;

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }


	//释放GDI Plus的应用环境
	GdiplusShutdown(gdiplusToken);

    return (int) msg.wParam;
}



//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_GDIPLUS));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_GDIPLUS);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

void OnPaint(HWND hwnd, HDC hdc)
{
	//加载背景图片,并根据背景图片的大小调整窗口大小
	Gdiplus::Image bkImage(_TEXT("H:/植物大战僵尸素材/interface/background1.jpg")); //加载图片的类,jpg,png这样的压缩图片
	int nWidth = bkImage.GetWidth();
	int nHeight = bkImage.GetHeight();
	::SetWindowPos(hwnd, HWND_TOP, 0, 0, nWidth, nHeight, SWP_NOMOVE | SWP_SHOWWINDOW);

	Gdiplus::Graphics graphics(hdc);
	graphics.DrawImage(&bkImage, 0, 0, nWidth, nHeight);

	//画笔绘制
	Gdiplus::Pen pen(0xffff0000, 1.0f); //ARGB格式
	graphics.DrawLine(&pen, 10, 10, 20, 20);
	graphics.DrawEllipse(&pen, 30, 30, 100, 80);
	graphics.DrawRectangle(&pen, 300, 300, 40, 50);

	//画刷填充
	Gdiplus::SolidBrush brush(Gdiplus::Color(255, 0, 0, 255));
	graphics.FillRectangle(&brush, 400, 100, 40, 80);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            
			OnPaint(hWnd, hdc);

            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GdiPlus 的相关文章

随机推荐

  • C#从数据库中读取二进制流并生成文件

    下面以图片文件为例加以说明 从数据库表 图片存储 中读取ID为1的图片数据并生成图片文件 MySqlConnection conn new MySqlConnection Server localhost Database test cha
  • fff

    http www migucloud com vi0 109 3j KJ59CLFb6F9pvcJ1egcF cld450p FILENAME 54 cld450p mp4 duration 201 owner 109 path 109 3
  • linux 杀死进程失败,linux - Ubuntu关闭失败“ *杀死所有剩余进程…” - Ubuntu问答...

    问题描述 我已经重新安装了Ubuntu Server reboot 有效 但是在 Killing all remaining processes 步骤上关闭失败 我在用 sudo shutdown now 在失败之后 由 fail 指示 f
  • 【廖雪峰python入门笔记】函数

    1 函数 我们知道圆的面积计算公式为 S r 当我们知道半径r的值时 就可以根据公式计算出面积 假设我们需要计算3个不同大小的圆的面积 r1 12 34 r2 9 08 r3 73 1 s1 3 14 r1 r1 s2 3 14 r2 r2
  • 深入学习java源码之ArrayList.iterator()与ArrayList.listIterator()

    深入学习java源码之ArrayList iterator 与ArrayList listIterator 内部类的使用典型的情况是 内部类继承自某个类或实现某个接口 内部类的代码操作创建其的外层类的对象 所以你可以认为内部类提供了某种进入
  • php excel导入

    excel导入导出是我们做项目中经常用到的功能 那么 今天就来说说excel导入 一 类文件 二 调用代码
  • 使用 htmx 构建交互式 Web 应用

    学习目标 了解htmx的基本概念 特点和用法 并能够运用htmx来创建交互式的Web应用程序 学习内容 1 什么是htmx htmx是一种用于构建交互式Web应用程序的JavaScript库 它通过将HTML扩展为一种声明性的交互式语言 使
  • 深入webpack打包原理,loader和plugin的实现

    本文讨论的核心内容如下 webpack进行打包的基本原理 如何自己实现一个loader和plugin 注 本文使用的webpack版本是v4 43 0 webpack cli版本是v3 3 11 node版本是v12 14 1 npm版本v
  • uboot启动流程图以及boot启动linux流程图

    运行厂商u boot的前提 运行u boot 需要DDR或者DRAM 串口 SD卡驱动 EMMC NAND 这些要和厂商的开发板一致 就能直接在自己板子上运行u boot 开机流程 当把u boot bin下载到SD卡上时 由于整个u bo
  • Web Scraping指南: 使用Selenium和BeautifulSoup

    在当今信息时代 数据是无处不在的宝贵资源 对于许多企业 研究人员以及开发者来说 从互联网上获取准确且有价值的数据变得越来越重要 而Web scraping 网络爬虫 技术则成为了实现这一目标的关键工具 本篇文章将向您介绍一个高级Web Sc
  • 学习Linux第六天

    linux中命令的匹配顺序 1 别名 gt 2 命令缓存 gt 3 通过相提并论中所定义的命令文件路径开始匹配 alias 命令别名 alias 别名 命令本身 alias cc touch root www tm tm不是别名命令 通过
  • 明星漫画

    明星漫画 转载于 https www cnblogs com Dicky archive 2005 02 24 122393 html
  • 《C++编程规范:101条规则、准则与最佳实践》——1.5做代码审查

    本节书摘来自异步社区出版社 C 编程规范 101条规则 准则与最佳实践 一书中的第1章 第1 5节 作者 加 Herb Sutter 罗 Andrei 更多章节内容可以访问云栖社区 异步社区 公众号查看 1 5做代码审查 摘要审查代码 更多
  • 数组sort方法的使用

    sort 方法是数组自带的一种排序方法 数组在原数组上进行排序 不生成副本 如果调用该方法时没有使用参数 将按字母顺序对数组中的元素进行排序 说得更精确点 是按照字符编码的顺序进行排序 要实现这一点 首先应把数组的元素都转换成字符串 如有必
  • Spring_day01

    Spring day01 一 spring入门 1 什么是框架 源自于建筑学 隶属土木工程 后发展到软件工程领域 软件工程框架 经过验证的 具有一定功能的 半成品软件 经过验证 具有一定功能 半成品 2 框架的作用 3 spring是一个轻
  • C51单片机实验——LCD 1602液晶显示器

    实验名称 利用1602实现数字时钟 实验环境 普中实验系统 Keil Vision 4软件 实验目的 1 掌握1602液晶显示器的工作原理和接口方法 2 利用本课程前面所学的知识 实现数字时钟功能 硬件连线 LCD1602的RS R W 和
  • Arduino core for ESP8266 安装失败问题处理方法

    文章目录 目的 离线开发板数据包 鱼 安装最新开发板数据包 渔 总结 目的 理论上Arduino IDE安装开发板数据包是非常方便的 不过在国内的网络环境下有时候就会很纠结 另外Arduino IDE对于下载数据这块也存在问题 经常下着下着
  • 【LeetCode - 658】找到 K 个最接近的元素

    文章目录 1 题目描述 2 解题思路 3 解题代码 1 题目描述 2 解题思路 题目给定的函数返回的是 List 类型 List 有一个方法和字符串类似 为 subList a b 返回 list 区间 a b 的子序列 先把给定的 arr
  • xshell以及xftp免费版

    https www netsarang com zh free for home school
  • GdiPlus

    GDI是Graphics Device Interface的缩写 含义是图形设备接口 它的主要任务是负责系统与绘图程序之间的信息交换 处理所有Windows程序的图形输出 在Windows操作系统下 绝大多数具备图形界面的应用程序都离不开G