c++进度条图形版 c进度条形版理论纯控制台总结上次分享了用控制台做进度条使用了cls和Sleep但有个最关键的问题太闪了癫痫性患者受不了但是要不闪的又要很多库文件和一些复杂的文件我们普通人实在受不了解决方案使用图形化界面这个图形版很简单只需windows库就行。首先控制台必须要隐藏不然黑不溜秋的控制台显示在前端怎能受得了// 获取当前控制台窗口句柄HWND hConGetConsoleWindow();// 如果成功获取控制台窗口释放、隐藏控制台if(hCon)FreeConsole();这样就可以将控制台放后台运行完自动关闭但打开程序时还会闪一下控制台。先注册一下窗口// 自定义窗口类名constchar*clsHideConProgress;// 注册窗口类结构体初始清零WNDCLASSA wc{0};绑定一下窗口// 绑定窗口消息回调处理函数lambdawc.lpfnWndProc[](HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)-LRESULT{先初始化进度条// 进度条百分比数值staticintpos0;设定进度条计时器30毫秒前进1%进度条部分走过的是蓝色背景是白色switch(msg){// 窗口创建完成消息caseWM_CREATE:// 创建定时器30毫秒触发一次WM_TIMERSetTimer(hwnd,1,30,NULL);return0;// 定时器定时消息caseWM_TIMER:pos;// 进度到100%销毁定时器与窗口if(pos100){KillTimer(hwnd,1);DestroyWindow(hwnd);}else{// 进度更新触发重绘窗口InvalidateRect(hwnd,NULL,TRUE);}return0;// 窗口绘制消息绘制进度条界面caseWM_PAINT:{PAINTSTRUCT ps;// 获取绘图DC设备上下文HDC hdcBeginPaint(hwnd,ps);// 获取窗口客户区大小矩形RECT rc;GetClientRect(hwnd,rc);// 填充窗口背景色FillRect(hdc,rc,(HBRUSH)(COLOR_BTNFACE1));// 定义进度条外框区域垂直居中RECT track{30,rc.bottom/2-12,rc.right-30,rc.bottom/212};// 绘制凹陷边框作为进度条底板DrawEdge(hdc,track,EDGE_SUNKEN,BF_RECT);// 进度填充色块区域RECT filltrack;fill.left2;fill.top2;fill.bottom-2;// 根据进度百分比计算填充宽度fill.rightfill.left(int)((track.right-track.left-4)*pos/100.0);// 创建蓝色画刷填充进度HBRUSH brCreateSolidBrush(RGB(0,120,215));FillRect(hdc,fill,br);// 释放GDI画刷资源防止内存泄漏DeleteObject(br);// 设置文字背景透明不遮挡进度条SetBkMode(hdc,TRANSPARENT);chartxt[16];// 格式化百分比文本如 50%wsprintfA(txt,%d%%,pos);// 文字居中绘制在窗口DrawTextA(hdc,txt,-1,rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER);// 结束绘图释放DCEndPaint(hwnd,ps);return0;}// 窗口销毁消息caseWM_DESTROY:// 发送退出消息结束消息循环PostQuitMessage(0);return0;}// 未处理消息交由系统默认窗口过程处理returnDefWindowProcA(hwnd,msg,wp,lp);};接下来就是窗口处理部分了// 绑定当前程序实例句柄wc.hInstanceGetModuleHandle(NULL);// 指定窗口类名称wc.lpszClassNamecls;// 设置默认鼠标光标wc.hCursorLoadCursor(NULL,IDC_ARROW);// 向系统注册自定义窗口类RegisterClassA(wc);// 创建主窗口标题、样式、坐标、宽高、无父窗口无菜单HWND hwndCreateWindowA(cls,正在处理...,WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU,CW_USEDEFAULT,CW_USEDEFAULT,420,140,NULL,NULL,wc.hInstance,NULL);// 显示窗口ShowWindow(hwnd,SW_SHOW);// 强制刷新绘制一次窗口UpdateWindow(hwnd);// 消息循环捕获、转换、分发窗口消息MSG msg;while(GetMessageA(msg,NULL,0,0)){TranslateMessage(msg);DispatchMessageA(msg);}return0;}总的来说挺简单所有代码就是#includewindows.h// 程序入口intmain(){// 获取当前控制台窗口句柄HWND hConGetConsoleWindow();// 如果成功获取控制台窗口释放、隐藏控制台if(hCon)FreeConsole();// 自定义窗口类名constchar*clsHideConProgress;// 注册窗口类结构体初始清零WNDCLASSA wc{0};// 绑定窗口消息回调处理函数lambdawc.lpfnWndProc[](HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)-LRESULT{// 进度条百分比数值staticintpos0;switch(msg){// 窗口创建完成消息caseWM_CREATE:// 创建定时器30毫秒触发一次WM_TIMERSetTimer(hwnd,1,30,NULL);return0;// 定时器定时消息caseWM_TIMER:pos;// 进度到100%销毁定时器与窗口if(pos100){KillTimer(hwnd,1);DestroyWindow(hwnd);}else{// 进度更新触发重绘窗口InvalidateRect(hwnd,NULL,TRUE);}return0;// 窗口绘制消息绘制进度条界面caseWM_PAINT:{PAINTSTRUCT ps;// 获取绘图DC设备上下文HDC hdcBeginPaint(hwnd,ps);// 获取窗口客户区大小矩形RECT rc;GetClientRect(hwnd,rc);// 填充窗口背景色FillRect(hdc,rc,(HBRUSH)(COLOR_BTNFACE1));// 定义进度条外框区域垂直居中RECT track{30,rc.bottom/2-12,rc.right-30,rc.bottom/212};// 绘制凹陷边框作为进度条底板DrawEdge(hdc,track,EDGE_SUNKEN,BF_RECT);// 进度填充色块区域RECT filltrack;fill.left2;fill.top2;fill.bottom-2;// 根据进度百分比计算填充宽度fill.rightfill.left(int)((track.right-track.left-4)*pos/100.0);// 创建蓝色画刷填充进度HBRUSH brCreateSolidBrush(RGB(0,120,215));FillRect(hdc,fill,br);// 释放GDI画刷资源防止内存泄漏DeleteObject(br);// 设置文字背景透明不遮挡进度条SetBkMode(hdc,TRANSPARENT);chartxt[16];// 格式化百分比文本如 50%wsprintfA(txt,%d%%,pos);// 文字居中绘制在窗口DrawTextA(hdc,txt,-1,rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER);// 结束绘图释放DCEndPaint(hwnd,ps);return0;}// 窗口销毁消息caseWM_DESTROY:// 发送退出消息结束消息循环PostQuitMessage(0);return0;}// 未处理消息交由系统默认窗口过程处理returnDefWindowProcA(hwnd,msg,wp,lp);};// 绑定当前程序实例句柄wc.hInstanceGetModuleHandle(NULL);// 指定窗口类名称wc.lpszClassNamecls;// 设置默认鼠标光标wc.hCursorLoadCursor(NULL,IDC_ARROW);// 向系统注册自定义窗口类RegisterClassA(wc);// 创建主窗口标题、样式、坐标、宽高、无父窗口无菜单HWND hwndCreateWindowA(cls,正在处理...,WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU,CW_USEDEFAULT,CW_USEDEFAULT,420,140,NULL,NULL,wc.hInstance,NULL);// 显示窗口ShowWindow(hwnd,SW_SHOW);// 强制刷新绘制一次窗口UpdateWindow(hwnd);// 消息循环捕获、转换、分发窗口消息MSG msg;while(GetMessageA(msg,NULL,0,0)){TranslateMessage(msg);DispatchMessageA(msg);}return0;}编译的时候会有控制台但运行exe是就没有了。