MFC实现CSGO汰换合同磨损计算器(长期更新)

开发环境:Visual Studio 2019


目录

  • Version 0.1 完成项目基本部分
  • Version 0.2 项目功能强化
  • Version 0.3 增加自定义函数
  • Version 0.4 自定义函数以及输入检查
  • Version 0.5 细节完善以及清理窗口
  • Version 0.6 错误修复以及反向计算

Version 0.1 完成项目基本部分

首先在VS2019中搜索到MFC应用。(此文章不提供安装方法)

点击下一步,到达此页面选择创建。

点击创建,并在应用程序类型中选择基于对话框。

正确进入时的界面。

在右侧工具箱中选择Edit Control并添加十一个到窗口中。(直接拖过去)

完成效果如下图。

在右侧工具箱中选择Static Text并添加十个到窗口中的Edit Control左边。

完成效果如下图。

然后单击第最后一个示例编辑框(正确的前提是前十个示例编辑框的范围在1~10,最后一个为11)在右侧属性页修改ID,修改为IDC_RESULT。

然后双击确定和取消。

进入CSGODlg.cpp开始编辑代码。

将void CCSGODlg::OnBnClickedOk()的代码修改为如下。

void CCSGODlg::OnBnClickedOk()
{CString WFloat[10], Result;double strResult{};GetDlgItem(IDC_EDIT1)->GetWindowText(WFloat[0]);GetDlgItem(IDC_EDIT2)->GetWindowText(WFloat[1]);GetDlgItem(IDC_EDIT3)->GetWindowText(WFloat[2]);GetDlgItem(IDC_EDIT4)->GetWindowText(WFloat[3]);GetDlgItem(IDC_EDIT5)->GetWindowText(WFloat[4]);GetDlgItem(IDC_EDIT6)->GetWindowText(WFloat[5]);GetDlgItem(IDC_EDIT7)->GetWindowText(WFloat[6]);GetDlgItem(IDC_EDIT8)->GetWindowText(WFloat[7]);GetDlgItem(IDC_EDIT9)->GetWindowText(WFloat[8]);GetDlgItem(IDC_EDIT10)->GetWindowText(WFloat[9]);for (int i = 0; i < 10; i++){strResult += _ttof(WFloat[i]);}strResult /= 10;Result.Format((CString)"%0.15f",strResult );GetDlgItem(IDC_RESULT)->SetWindowText(Result);
}


然后对窗口的界面进行一下修改,0.1版本汰换磨损计算器就做好了。

测试效果如下。

Version 0.2 项目功能强化

Version 0.1仅仅只能做到十个数求平均值,还不能真正的日常使用。
待完成目标列表如下:

1.使用CSGO的汰换合同算法来完成计算。
2.磨损输出精确位数提升到极限。
3.提供正反向的精确计算功能。
4.增加一个界面用于输出提示信息。
5.对输入错误的值弹出警告。

Version 0.2将完成以上的目标1和4。


先将界面修改如下。将ID为IDC_RESULT的窗口移至右上角、添加两个Edit Control并将ID修改为IDC_LOWEST和IDC_HIGHEST、右下角添加一个提示按钮并修改ID为IDC_MESSAGE

双击提示进入代码编辑页面。

加入如下代码。

void CCSGODlg::OnBnClickedMessage()
{CString Message{ "CSGO汰换计算 Version 0.2\r\n" }, Temp;GetDlgItem(IDC_RESULT)->GetWindowText(Temp);Temp += Message;GetDlgItem(IDC_RESULT)->SetWindowText(Temp);
}

然后在属性中将IDC_RESULT窗口的多行和想要返回设置为True。

自此第四个目标已经初步实现,接下来,Introducing CSGO汰换合同磨损算法。

最终目标磨损=(目标最高磨损-目标最低磨损)*十件材料的平均磨损+目标最低磨损

将确定的函数修改为如下。

void CCSGODlg::OnBnClickedOk()
{CString WFloat[10], Result, HF, LF;double strResult{};GetDlgItem(IDC_EDIT1)->GetWindowText(WFloat[0]);GetDlgItem(IDC_EDIT2)->GetWindowText(WFloat[1]);GetDlgItem(IDC_EDIT3)->GetWindowText(WFloat[2]);GetDlgItem(IDC_EDIT4)->GetWindowText(WFloat[3]);GetDlgItem(IDC_EDIT5)->GetWindowText(WFloat[4]);GetDlgItem(IDC_EDIT6)->GetWindowText(WFloat[5]);GetDlgItem(IDC_EDIT7)->GetWindowText(WFloat[6]);GetDlgItem(IDC_EDIT8)->GetWindowText(WFloat[7]);GetDlgItem(IDC_EDIT9)->GetWindowText(WFloat[8]);GetDlgItem(IDC_EDIT10)->GetWindowText(WFloat[9]);GetDlgItem(IDC_HIGHEST)->GetWindowText(HF);GetDlgItem(IDC_LOWEST)->GetWindowText(LF);if (HF == "" || _ttof(HF) <= 0 || _ttof(HF) > 1)//当最高磨损的输入错误时,将其设为默认值1HF = "1";if (LF == "" || _ttof(LF) >= 1 || _ttof(LF) <= 0 || _ttof(LF) > _ttof(HF))//当最低磨损的输入错误时,将其设为默认值0{HF = "1";LF = "0";}for (int i = 0; i < 10; i++){strResult += _ttof(WFloat[i]);}strResult = (_ttof(HF) - _ttof(LF)) * strResult / 10 + _ttof(LF);Result.Format((CString)"%0.15f", strResult);GetDlgItem(IDC_RESULT)->SetWindowText(Result);
}

在最高最低磨损输入错误的情况下会默认输出最低磨损为0最高磨损为1时的值。

Version 0.3 增加自定义函数

在CSGODlg.h中类的Public下声明要自定义的函数,我在此声明的是:

afx_msg void GetFloat(CString Weapon[10]);


然后在CSGODlg.cpp中将此函数实例化。

void CCSGODlg::GetFloat(CString Weapon[10])
{GetDlgItem(IDC_EDIT1)->GetWindowText(Weapon[0]);GetDlgItem(IDC_EDIT2)->GetWindowText(Weapon[1]);GetDlgItem(IDC_EDIT3)->GetWindowText(Weapon[2]);GetDlgItem(IDC_EDIT4)->GetWindowText(Weapon[3]);GetDlgItem(IDC_EDIT5)->GetWindowText(Weapon[4]);GetDlgItem(IDC_EDIT6)->GetWindowText(Weapon[5]);GetDlgItem(IDC_EDIT7)->GetWindowText(Weapon[6]);GetDlgItem(IDC_EDIT8)->GetWindowText(Weapon[7]);GetDlgItem(IDC_EDIT9)->GetWindowText(Weapon[8]);GetDlgItem(IDC_EDIT10)->GetWindowText(Weapon[9]);
}

然后将void CCSGODlg::OnBnClickedOk()的代码进行修改以使用此函数。

void CCSGODlg::OnBnClickedOk()
{CString WFloat[10], Result, HF, LF;double strResult{};GetFloat(WFloat);GetDlgItem(IDC_HIGHEST)->GetWindowText(HF);GetDlgItem(IDC_LOWEST)->GetWindowText(LF);if (HF == "" || _ttof(HF) <= 0 || _ttof(HF) > 1)//当最高磨损的输入错误时,将其设为默认值1HF = "1";if (LF == "" || _ttof(LF) >= 1 || _ttof(LF) <= 0 || _ttof(LF) > _ttof(HF))//当最低磨损的输入错误时,将其设为默认值0{HF = "1";LF = "0";}for (int i = 0; i < 10; i++){strResult += _ttof(WFloat[i]);}strResult = (_ttof(HF) - _ttof(LF)) * strResult / 10 + _ttof(LF);Result.Format((CString)"%0.15f", strResult);GetDlgItem(IDC_RESULT)->SetWindowText(Result);
}

Version 0.4 自定义函数以及输入检查

在CSGODlg.h头文件类下的Public中,声明一个函数,用于保持窗口原有内容的情况下附加内容。声明如下:

afx_msg void DisplayInResult(CString Message);

然后在CSGODlg.cpp中将此函数实例化。

void CCSGODlg::DisplayInResult(CString Message)
{CString Temp;GetDlgItem(IDC_RESULT)->GetWindowText(Temp);Temp += Message;GetDlgItem(IDC_RESULT)->SetWindowText(Temp);
}

使用此函数可将之前的提示按钮的函数的内容减少到一行:

void CCSGODlg::OnBnClickedMessage()
{DisplayInResult((CString)"CSGO汰换计算 Version 0.4\r\n");
}

确定按钮的函数可修改为如下:

void CCSGODlg::OnBnClickedOk()
{int Warn{};CString WFloat[10], Result, HF, LF, WarnS{};double strResult{};GetFloat(WFloat);GetDlgItem(IDC_HIGHEST)->GetWindowText(HF);GetDlgItem(IDC_LOWEST)->GetWindowText(LF);if (HF == "" || _ttof(HF) <= 0 || _ttof(HF) > 1)//当最高磨损的输入错误时,将其设为默认值1HF = "1";if (LF == "" || _ttof(LF) >= 1 || _ttof(LF) <= 0 || _ttof(LF) > _ttof(HF))//当最低磨损的输入错误时,将其设为默认值0{HF = "1";LF = "0";}for (int i = 0; i < 10; i++){if (_ttof(WFloat[i]) < 0 || _ttof(WFloat[i]) > 1)//当磨损输入错误时,将其设为默认值0{WFloat[i] = "0";Warn += 1;}strResult += _ttof(WFloat[i]);}strResult = (_ttof(HF) - _ttof(LF)) * strResult / 10 + _ttof(LF);Result.Format((CString)"%0.15f", strResult);DisplayInResult(Result);if (Warn != 0)//对输入错误的值的数量进行提示_0.4更新{WarnS.Format((CString)"%d", Warn);DisplayInResult((CString)"警告,输入的十个值中出现了" + WarnS + (CString)"个错误的值,当前已复原为0\r\n");}
}

以上代码包含了对输入错误的值的判断,具体代码节选如下:
Warn初始化为0,每次出现不满足数值的值就给Warn+1,如果最后Warn不为0则弹出提示。

if (_ttof(WFloat[i]) < 0 || _ttof(WFloat[i]) > 1)//当磨损输入错误时,将其设为默认值0
{WFloat[i] = "0";Warn += 1;
}
if (Warn != 0){WarnS.Format((CString)"%d", Warn);DisplayInResult((CString)"警告,输入的十个值中出现了" + WarnS + (CString)"个错误的值,当前已复原为0\r\n");}

运行效果如下:

Version 0.5 细节完善以及清理窗口

193行用于输出汰换计算的磨损结果,在此处加上换行符(\r\n)。

Result.Format((CString)"%0.15f\r\n", strResult);

删除198行开头的\r\n。

DisplayInResult((CString)"警告,输入的十个值中出现了" + WarnS + (CString)"个错误的值,当前已复原为0\r\n");

增加对最高磨损&最低磨损输入错误的提示。

if (HF == "" || _ttof(HF) <= 0 || _ttof(HF) > 1)//当最高磨损的输入错误时,将其设为默认值1
{DisplayInResult((CString)"输入的最高值出现了错误,当前已复原为1!\r\n");HF = "1";
}
if (LF == "" || _ttof(LF) >= 1 || _ttof(LF) <= 0 || _ttof(LF) > _ttof(HF))//当最低磨损的输入错误时,将其设为默认值0
{DisplayInResult((CString)"输入的最低值出现了错误,当前已复原为0!\r\n");LF = "0";
}

添加一个名为IDC_CLEAR的按钮。

双击按钮对其进行编辑,其内容如下。

void CCSGODlg::OnBnClickedClear()
{GetDlgItem(IDC_RESULT)->SetWindowText(NULL);
}

顺便修改一下提示按钮的内容:

void CCSGODlg::OnBnClickedMessage()
{DisplayInResult((CString)"CSGO汰换计算 Version 0.5\r\n更新内容:细节完善以及清理窗口\r\n");
}

对窗口进行微调,以适应四个按钮。

运行效果如下:

Version 0.6 错误修复以及反向计算

182行的if在最低磨损为0时会错误的得到True的bool值,将_ttof(LF)<=0改为_ttof(LF)<0即可

将IDC_RESULT的Auto HScroll设置为False,这样就不会输出到范围以外。

因为取消的功能和右上角的×重复了,所以将取消按钮IDCANCEL改为IDC_RECAL,作为反向计算按钮。

在源文件中删除对Cancel按钮的定义。

添加一个用于反向计算时输入主材料数量的Edit_Control,ID为IDC_NUM。

目前仅在函数中添加计算主材料平均磨损的功能,后续将会得到完善。

修改确认与取消的名称。

运行效果如下。

MFC实现CSGO汰换合同磨损计算器相关推荐

  1. MFC界面美化之换肤

    1.在项目中导入头文件SkinPPWTL.h并在stdafx.h中加入 #include"SkinPPWTL.h" #pragma comment(lib,"SkinPP ...

  2. 成为会带团队的技术人 升级汰换:“心要慈,刀要快”

    今天我想和你聊一聊"招聘与解聘"中最后一个动作:升级汰换. 升级汰换直白点说就是"开人",一个团队如果从来没有人"被离开",就好像人生了病但 ...

  3. MFC 利用 Codejock XtremeToolkitPro 换肤

    CodejockXtremeToolkitPro 安装文件下载:http://download.csdn.net/detail/abidepan/4538677 CodejockXtremeToolk ...

  4. CSGO/steam游戏搬砖项目入行前必看知识点汇总(一)

    CSGO/steam游戏搬砖项目入行前必看知识点汇总(一) CSGO武器皮肤的入门级知识点,入行前一定要看 CSGO武器皮肤有什么用以及如何分类?有多少人已经彻底搞清楚了这个问题?今天这篇文章是专为新 ...

  5. CSGO开箱的水很深,年轻人你把握的住嘛?

    如果你在网上搜索"CSGO开箱",基本上所有的贴子都会告诉你"开箱子不如直接买",以过来人的身份劝你回头是岸. 作为21世纪新兴的一门玄学,开箱子是令广大CSG ...

  6. python爬虫实战-网易BUFF CSGO饰品

    python爬虫实战-网易BUFF CSGO饰品 寒假迷上了csgo,一方面对这个纯粹的枪战游戏着迷,另一方面对精美的饰品着迷.众所周知,csgo是个理财游戏饰品游戏,能够掌握到喜欢饰品的价格就可以得 ...

  7. MFC exe替换大、中、小图标方法

    为了让自己的软件更加个性化决定把MFC生成的图标换掉,网上查了一下,发现还挺简单的,把喜欢的图片转成ico格式,然后直接找到工程文件夹里的res文件夹把"工程名.ico"这个图标替 ...

  8. UI 智能化的原理和未来

    本文将从 GUI 中用户体验的构建开始,用高质量.可调控.交互体验创新三个部分,分别介绍如何从传统 UI 一步步迈向 UI 智能化.最后,用如何实现 UI 智能化的一些思考收尾. 本文仅代表作者个人观 ...

  9. mpvue 调起子组件的方法_牢记 | 智鹏五金机电设备这些方法的使用更安全!

    大多数的人在使用手动工具之前并未受过训练,因此导致意外伤害频繁.根据统计资料显示,每年因为手动工具使用不当所引起的伤害,占所有意外伤害发生原因的7%至8%.故对于常用的五金工具,必须了解其正确使用方法 ...

最新文章

  1. 如何使用Next.js创建动态的Rick and Morty Wiki Web App
  2. Jquery加载dom元素
  3. 网页页面设计如何做到极致舒适感?
  4. c 正则表达式替换html,正则表达式替换html元素属性的方法
  5. VS2015使用小技巧
  6. url 转换中文_数字快速转换成中文大写,我有妙招
  7. Windows安装pytorch-gpu
  8. pm2.5测试软件,测pm2.5的软件准吗
  9. 华三ap设置无线服务器,H3C无线控制器实现Remote AP功能典型配置举例(V7)
  10. jest单元测试-匹配器
  11. 如何从JFrog Artifactory下载资源到本地
  12. Timer的源码分析
  13. PS常用快捷键(持续更新)
  14. SSM项目实战之二十五:新增订单
  15. 【不积跬步_无以至千里】 数学知识(不定时整理)
  16. Stream流基本使用
  17. 又又又一边缘计算初创企业融资
  18. 路由器重温——RIP路由
  19. java计算机毕业设计幼儿园综合管理系统源码+数据库+系统+lw文档+部署
  20. 增删改查操作下锁的相关情况_查询时的锁分析

热门文章

  1. c语言程序 用追赶法求解方程组,编写用追赶法解三对角线性方程组的程序,并解下列方程组...
  2. 手机英文上面的逗号怎么打_英文写作中标点符号怎么用?--逗号篇
  3. 使用Pdroid patcher打补丁的时候的日志
  4. python 多张图片拼凑成一个完整的PDF
  5. ListView 局部刷新
  6. Windows权限提升—溢出提权
  7. Java项目:JSP高校教务排课管理系统
  8. python千人成像_千图成像,教你用胡歌照片做千人成像照片
  9. 【杂记】数字签名概述
  10. 【Chrome】各种有关 Flash 插件问题的解决方法