最近我像学习下图形的绘制,自己是学C/C++的,所以我就把目光放在了GDI上面。基本的win32编程和基本的GDI绘制我已经了解,接下来就进行实践环节。

最简单的GDI绘制图形那就是矩形了,所以我用基本的矩形来绘制进度条,今天写的是最基本的,之后我会把相关操作写成类,代码如下(代码里面有很详细的注释,所以我就不过多介绍了)

#include <windows.h>
#include <atlstr.h> //因为wsprintf不能进行浮点型转换,所以加上这个用CString//自绘一个进度条//定义一个定时器宏
#define ID_TIMER 1LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int cxClient, cyClient;  //客户区的高和宽RECT rect;int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{static TCHAR szAppName[] = TEXT("ProgressBar");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_INFORMATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;RegisterClass(&wndclass);hwnd = CreateWindow(szAppName, L"自绘一个进度条",WS_OVERLAPPEDWINDOW,100, 200, 800, 600, NULL, NULL, hInstance, NULL);ShowWindow(hwnd, nShowCmd);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}void RenderProgressBar(HWND hwnd)   //重绘进度条
{RECT RenderRect;RenderRect.left = rect.left;RenderRect.top = rect.top;RenderRect.right = cxClient;RenderRect.bottom = rect.bottom;InvalidateRect(hwnd, &RenderRect, TRUE); //只是让进度条和显示文字的矩形无效就行了}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdcClient;PAINTSTRUCT ps;//画笔画刷HBRUSH hBrush;HPEN  hPen,hOldPen;TCHAR temp[40];static float right;float tempD;CString str;int x;switch (message){case WM_TIMER:   //定时器消息RenderProgressBar(hwnd);return 0;case WM_CREATE:SetTimer(hwnd, ID_TIMER, 100, NULL); //每隔10秒触发return 0;case WM_SIZE:cxClient = LOWORD(lParam); //获取客户区的大小cyClient = HIWORD(lParam);rect.left = cxClient / 2 - 300;rect.top = cyClient / 2;rect.right = cxClient / 2 - 300;rect.bottom = cyClient / 2 + 50;right = cxClient / 2 + 300;return 0;case WM_PAINT:hPen = CreatePen(PS_NULL, 0, 0);  //创建一个新画笔(这个画笔在绘制矩形的时候是没有边框的)hBrush = (HBRUSH)GetStockObject(BLACK_BRUSH);  //取得黑色的画刷hdcClient = BeginPaint(hwnd, &ps);hOldPen = (HPEN)SelectObject(hdcClient, hPen);  //取得原来的画笔并将自己创建的画笔放入hdc中//创建一个长600,宽50的矩形,位置在客户区中央Rectangle(hdcClient, cxClient / 2-300, cyClient / 2, cxClient / 2 + 300, cyClient / 2 + 50);if (rect.right <= right) //如果还没到头{FillRect(hdcClient, &rect, hBrush);tempD = (float)(rect.right - rect.left) / 600.0;str.Format(TEXT("进度:%.2f%%"), tempD*100.0);TextOut(hdcClient, right, rect.top + 25, temp, wsprintf(temp, L"%s", str.GetBuffer(str.GetLength())));rect.right++;}if (rect.right > right)//已经100%了{RECT tempRect;tempRect.left = rect.left;tempRect.top = rect.top;tempRect.right = rect.right-1;tempRect.bottom = rect.bottom;FillRect(hdcClient, &tempRect, hBrush);TextOut(hdcClient, right, rect.top + 25, temp, wsprintf(temp, L"进度:%d.00%%", 100));}DeleteObject(hPen);SelectObject(hdcClient, hOldPen);//将原来的画笔还回去DeleteObject(hBrush);EndPaint(hwnd, &ps);return 0;case WM_DESTROY:KillTimer(hwnd, ID_TIMER);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

运行如下:

基本的进度条就这样了,之后我会将它进行改进,改成类的样子,这样的话可以自己设置宽高和进度条的值。

使用GDI绘制一个类似进度条的控件(1)相关推荐

  1. android基础 [超级详细android常用控件解析(ScollView控件,ProgressBar进度条,PopupWindow控件)]

    目录 1 章节目录 2 ScollView控件 2.1 ScrollView简介 2.2 ScrollView使用 2.3 常用属性及方法 3 ProgressBar进度条 3.1 简介 3.2 常用 ...

  2. 使用ASP.NET Atlas编写显示真实进度的ProgressBar(进度条)控件

    当后台在进行某些长时间的操作时,如果能在页面上提供一个显示真实进度的进度条,而不是让用户不知情的等待或是从前的那些简单的估计,将是一个非常难得的出彩之处.现在使用ASP.NET Atlas完全有可能做 ...

  3. android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析

    这里用SeekBar做演示,SeekBar继承自ProgressBar,拥有其一切特性,并且其支持拖动以及DPAD左右键的进退.一起学习吧! 一.自定义SeekBar进度条样式 原生SeekBar效果 ...

  4. react封装一个类似安卓的toast控件message

    项目中经常会用到类似安卓的toast的控件.封装一个这样的组件是每个项目必须的事情. import React from 'react'; import ReactDOM from 'react-do ...

  5. jeecg t:datagrid列表使用进度条progressbar控件

    稍微摸索了一下,在列表中显示进度条.如下图所示: 闲话少说,直接上代码: <t:datagrid name="taskMgrList" checkbox="fals ...

  6. 转帖 .Net(C#)纯GDI+绘制实时动态曲线图之二(曲线控件全部源码)

    #region 曲线数据显示 #region 绘制背景网格    /// <summary>    /// 刷新背景网格线,并返回背景图片(背景不判断是否滚动)    /// </s ...

  7. vue.js 利用canvas绘制仪表盘圆环进度条-带动画

    vue.js 利用canvas绘制简易仪表盘进度条 html代码 因为动画效果比较消耗性能,所以进度条单独canvas绘制 <template><div class="ci ...

  8. 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程

    作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一个ActiveX控件.其中将要讲解关于ActiveX开发的一些基础概念,诸如方法(method).属性(prope ...

  9. 免费打工仔:一个完善的ActiveX Web控件教程

    免费打工仔:一个完善的ActiveX Web控件教程 出自Ogre3D开放资源地带 跳转到: 导航, 搜索 原作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一个A ...

  10. 一个完善的ActiveX Web控件教程

    免费打工仔:一个完善的ActiveX Web控件教程 出自Ogre3D开放资源地带 跳转到:  导航,  搜索 原作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一 ...

最新文章

  1. 2020年度最佳的23个的机器学习项目(附源代码)
  2. BTrace生产调试
  3. mastered skills
  4. Undo TableSpace ②.回滚段研究
  5. 合并两个排序的链表递归和非递归C++实现
  6. json php 数组读写_PHP如何将数据写入JSON?
  7. 【视频专访】他用3年时间,从0开始打造专属大学生的IT教育品牌,只为将他们送入国内最顶尖IT名企。...
  8. [Linux 高并发服务器] 信号
  9. 唱响艾泽拉斯_战争篇
  10. 云服务器多开账号,怎么用云服务器多开模拟器
  11. 迁移学习,DomainAdaption 笔记
  12. 第九周项目——穷举法之三色球
  13. 常量与变量有哪些区别
  14. 快速上手golang
  15. 力扣:我的日程安排表I
  16. axis=0 与 axis=1 的区分
  17. 【Windows】Word文档中的Endnote“乱码”
  18. 珠心算测验 【暴力】
  19. Win7 无法用win+R打开dos命令窗口的问题
  20. win32 注册表操作API

热门文章

  1. rtklib-RINEX文件读取-rinex.c解析(二)
  2. matlab 直方图 拟合,MATLAB 直方图拟合
  3. 2021-2027全球与中国X射线检测系统市场现状及未来发展趋势
  4. URI与URL的区别
  5. 2020-2023保时捷Taycan维修手册电路图技术培训手册用户手册电动汽车技术资料
  6. c51间隔点亮c语言编程,51系列单片机C语言编程
  7. winform 获取NotifyIcon的位置
  8. 大数运算(加减乘除,阶乘,取余)
  9. PS2015下载PSCC2015安装教程
  10. 微型计算机原理与接口技术马静答案,微机原理与接口技术(马静)