标题: 练习作品 -> 存储单位换算器 V1.0 [打印本页]

作者: liuyuxi    时间: 2015-1-11 00:26
标题: 练习作品 -> 存储单位换算器 V1.0
程序界面:




使用方法:
    输入数字后即可动态算出结果。【复制】按钮 的功能是将结果复制到 剪切板中


设计这个程序,是因为一个兄弟的需要,界面布局由他设计。

刚设计的时候,我没有多大的把握。因为一个int 类型的变量 是没法存储 9 位以上的数字。这就意味着,计算数值时有很大的限制。

网上有中算法叫大数算法,听说可以解决这个问题。在设计时想到,数值可能会有小数,就使用double 双精度浮点数类型。没想到,居然可以存储超过9位的数字,这太让我惊讶。


根据容量单位换算公式 具体算法:

在Dialog 初始化类中 加入 初始化代码

SetDlgItemText(IDC_IN,"输入数值");    // 初始化输入框

SetDlgItemText(IDC_OUT,"结果显示");    // 初始化输出框
SetDlgItemText(IDC_TS,"");    // 初始化提示 静态文本


CComboBox* combo= ( CComboBox*)GetDlgItem(IDC_COMBO2);    // 获取第一个下拉列表
combo->SetCurSel(2);    // 初始值为 M 单位
combo= ( CComboBox*)GetDlgItem(IDC_COMBO3);
combo->SetCurSel(3);   // 初始化为 K 单位


// 考虑到使用动态计算方式,这段代码使用的频率很高 就自定义一个函数供调用
void JG()
{
char InText[30];
char OutText[30];
char Tmp[100];

HWND m_hWnd = AfxGetApp()->m_pMainWnd->m_hWnd;


SetDlgItemText(m_hWnd,IDC_TS,"");
// 获取文本框内容
GetDlgItemText(m_hWnd,IDC_IN,Tmp,100);


if (IsNumber(Tmp))
SetDlgItemText(m_hWnd,IDC_TS,"【请输入数值】");
else
SetDlgItemText(m_hWnd,IDC_TS,"");


if (strlen(Tmp) ==0 || strcmp(Tmp,"输入数值") == 0)
{
SetDlgItemText(m_hWnd,IDC_OUT,"请在输入框输入数值~O(∩_∩)O~~~~");
return ;
}
double  ui = atof(Tmp);
double  sun = 0;


// 获取单位
// 由于是自定义函数 这里调用的是SDK 中的GetDlgItem函数 它返回的就是控件句柄
// MFC 中的GetDlgItem 的使用方式:HWND hwnd = GetDlgItem(IDC_COMBO2)->SetSafeHwnd();
//  GetDlgItem(IDC_COMBO2) 是获取控件指针CWnd*   再获取SetSafeHwnd() 控件句柄
HWND hwnd = GetDlgItem(m_hWnd,IDC_COMBO2);


int In = ::SendMessage( hwnd,(UINT)CB_GETCURSEL,0,0 );
if(In != CB_ERR)
::SendMessage(hwnd, CB_GETLBTEXT, In, (LPARAM)InText);
CloseHandle(hwnd);


// 获取要转换的单位
hwnd = GetDlgItem(m_hWnd,IDC_COMBO3);
int Out = ::SendMessage( hwnd,(UINT)CB_GETCURSEL,0,0 );
if(Out != CB_ERR)
::SendMessage(hwnd, CB_GETLBTEXT, Out, (LPARAM)OutText);
CloseHandle(hwnd);


if (InText[1] == 'T')
{
switch(OutText[1])
{  
case 'T': sun = ui;  break;
case 'G': sun = ui * 1024; break;
case 'M': sun = ui * 1024 * 1024; break;
case 'K': sun = ui * 1024 * 1024 * 1024; break;
case 'B': sun = ui * 1024 * 1024 * 1024 * 1024; break;
case 'b': sun = ui * 1024 * 1024 * 1024 * 1024 * 8; break;
}
}


if (InText[1] == 'G')
{
switch(OutText[1])
{  
case 'T': sun = ui / 1024;  break;
case 'G': sun = ui; break;
case 'M': sun = ui * 1024 ; break;
case 'K': sun = ui * 1024 * 1024 ; break;
case 'B': sun = ui * 1024 * 1024 * 1024 ; break;
case 'b': sun = ui * 1024 * 1024 * 1024  * 8; break;
}
}


if (InText[1] == 'M')
{
switch(OutText[1])
{  
case 'T': sun = ui / 1024 / 1024;  break;
case 'G': sun = ui / 1024; break;
case 'M': sun = ui; break;
case 'K': sun = ui * 1024 ; break;
case 'B': sun = ui * 1024 * 1024 ; break;
case 'b': sun = ui * 1024 * 1024 * 8; break;
}
}


if (InText[1] == 'K')
{
switch(OutText[1])
{  
case 'T': sun = ui / 1024 / 1024 / 1024;  break;
case 'G': sun = ui / 1024 / 1024; break;
case 'M': sun = ui/ 1024 ; break;
case 'K': sun = ui ; break;
case 'B': sun = ui * 1024  ; break;
case 'b': sun = ui * 1024 * 8; break;
}
}

if (InText[1] == 'B')
{
switch(OutText[1])
{  
case 'T': sun = ui / 1024 / 1024 / 1024 / 1024;  break;
case 'G': sun = ui / 1024 / 1024 /1024; break;
case 'M': sun = ui/ 1024 / 1024; break;
case 'K': sun = ui / 1024; break;
case 'B': sun = ui ; break;
case 'b': sun = ui * 8; break;
}
}


if (InText[1] == 'b')
{
switch(OutText[1])
{  
case 'T': sun = ui / 1024 / 1024 / 1024 / 1024 /1024 / 8;  break;
case 'G': sun = ui / 1024 / 1024 /1024 / 1024 / 8; break;
case 'M': sun = ui/ 1024 / 1024 / 1024 / 8; break;
case 'K': sun = ui / 1024 / 1024 / 8; break;
case 'B': sun = ui / 8; break;
case 'b': sun = ui; break;
}
}


sprintf(Tmp,"%.10f",sun);


int i = strlen(Tmp)-1;
while(Tmp[i--] == '0');        // 去掉多余的小数点
      Tmp[i+2] = 0;


SetDlgItemText(m_hWnd,IDC_OUT,Tmp); // 输出结果
}

【复制】按钮触发的按钮
void CTGMKBDlg::OnCopy()

{
// TODO: Add your control notification handler code here


char Tmp[MAX_PATH];


GetDlgItemText(IDC_IN,Tmp,MAX_PATH);// 检查输入框是不是数值
if (IsNumber(Tmp))
{
SetDlgItemText(IDC_TS,"【请输入数值】");
return ;
}
else
SetDlgItemText(IDC_TS,"");


GetDlgItemText(IDC_OUT,Tmp,MAX_PATH);


if (strlen(Tmp) == 0 || strcmp(Tmp,"结果显示") == 0 || strcmp(Tmp,"请在输入框输入数值~O(∩_∩)O~~~~") == 0)
{
SetDlgItemText(IDC_OUT,"请在输入框输入数值~O(∩_∩)O~~~~");
GetDlgItem(IDC_IN)-> SetFocus();// 设置光标在 输入 文本框
return ;
}


Tmp[strlen(Tmp)-1]='\0';// 复制到时候 去掉小数点


if (OpenClipboard())//  打开剪切板
{
HANDLE hClip;
char *pBuf;

EmptyClipboard(); // 清空剪切板 并释放剪切板中数据的句柄 把剪切板的所有权赋给当前窗口
hClip = GlobalAlloc(GMEM_MOVEABLE,strlen(Tmp)+1); // 分配一个内存对象 第二个参数 字节数
pBuf = (char *)GlobalLock(hClip); // 将空间加锁 并返回 指针
strcpy(pBuf,Tmp);  
GlobalUnlock(hClip);  // 解锁
SetClipboardData(CF_TEXT,pBuf); // 写入数据
CloseClipboard(); // 关闭


SetDlgItemText(IDC_TS,"【复制数据完毕!】");
}
}
粗略检查 输入合法性
bool IsNumber( char Text[] )

{
int len = strlen(Text);
for (int i=0; i<=len; i++)
{
if ( Text[ i] >='0' && Text[ i] <='9' || Text[ i]=='.')
return 0;
}
return 1;
}

动态计算的实现:
在对话框编辑器上,选中combo控件,属性,事件。选中CBN_SELCHANGE,下拉中选中哪个函数,就能产生事件函数入口了。然后双击该下拉列表控件 即可转入 写函数的地方

文本框 则 选择 事件 :EN_CHANGE

// 输入文本框
void CTGMKBDlg::OnChangeIn()
{
JG();
}


//  第一个 下拉列表
void CTGMKBDlg::OnSelchangeCombo2()
{
JG();
}


// 第二个 下拉列表
void CTGMKBDlg::OnSelchangeCombo3()  //  下拉列表
{
JG();
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1