找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2581|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

練習(xí)作品 -> 存儲(chǔ)單位換算器 V1.0

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71922 發(fā)表于 2015-1-11 00:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
程序界面:




使用方法:
    輸入數(shù)字后即可動(dòng)態(tài)算出結(jié)果!緩(fù)制】按鈕 的功能是將結(jié)果復(fù)制到 剪切板中


設(shè)計(jì)這個(gè)程序,是因?yàn)橐粋(gè)兄弟的需要,界面布局由他設(shè)計(jì)。

剛設(shè)計(jì)的時(shí)候,我沒有多大的把握。因?yàn)橐粋(gè)int 類型的變量 是沒法存儲(chǔ) 9 位以上的數(shù)字。這就意味著,計(jì)算數(shù)值時(shí)有很大的限制。

網(wǎng)上有中算法叫大數(shù)算法,聽說可以解決這個(gè)問題。在設(shè)計(jì)時(shí)想到,數(shù)值可能會(huì)有小數(shù),就使用double 雙精度浮點(diǎn)數(shù)類型。沒想到,居然可以存儲(chǔ)超過9位的數(shù)字,這太讓我驚訝。


根據(jù)容量單位換算公式 具體算法:

在Dialog 初始化類中 加入 初始化代碼

SetDlgItemText(IDC_IN,"輸入數(shù)值");    // 初始化輸入框

SetDlgItemText(IDC_OUT,"結(jié)果顯示");    // 初始化輸出框
SetDlgItemText(IDC_TS,"");    // 初始化提示 靜態(tài)文本


CComboBox* combo= ( CComboBox*)GetDlgItem(IDC_COMBO2);    // 獲取第一個(gè)下拉列表
combo->SetCurSel(2);    // 初始值為 M 單位
combo= ( CComboBox*)GetDlgItem(IDC_COMBO3);
combo->SetCurSel(3);   // 初始化為 K 單位


// 考慮到使用動(dòng)態(tài)計(jì)算方式,這段代碼使用的頻率很高 就自定義一個(gè)函數(shù)供調(diào)用
void JG()
{
char InText[30];
char OutText[30];
char Tmp[100];

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


SetDlgItemText(m_hWnd,IDC_TS,"");
// 獲取文本框內(nèi)容
GetDlgItemText(m_hWnd,IDC_IN,Tmp,100);


if (IsNumber(Tmp))
SetDlgItemText(m_hWnd,IDC_TS,"【請輸入數(shù)值】");
else
SetDlgItemText(m_hWnd,IDC_TS,"");


if (strlen(Tmp) ==0 || strcmp(Tmp,"輸入數(shù)值") == 0)
{
SetDlgItemText(m_hWnd,IDC_OUT,"請?jiān)谳斎肟蜉斎霐?shù)值~O(∩_∩)O~~~~");
return ;
}
double  ui = atof(Tmp);
double  sun = 0;


// 獲取單位
// 由于是自定義函數(shù) 這里調(diào)用的是SDK 中的GetDlgItem函數(shù) 它返回的就是控件句柄
// 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);


// 獲取要轉(zhuǎn)換的單位
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');        // 去掉多余的小數(shù)點(diǎn)
      Tmp[i+2] = 0;


SetDlgItemText(m_hWnd,IDC_OUT,Tmp); // 輸出結(jié)果
}

【復(fù)制】按鈕觸發(fā)的按鈕
void CTGMKBDlg::OnCopy()

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


char Tmp[MAX_PATH];


GetDlgItemText(IDC_IN,Tmp,MAX_PATH);// 檢查輸入框是不是數(shù)值
if (IsNumber(Tmp))
{
SetDlgItemText(IDC_TS,"【請輸入數(shù)值】");
return ;
}
else
SetDlgItemText(IDC_TS,"");


GetDlgItemText(IDC_OUT,Tmp,MAX_PATH);


if (strlen(Tmp) == 0 || strcmp(Tmp,"結(jié)果顯示") == 0 || strcmp(Tmp,"請?jiān)谳斎肟蜉斎霐?shù)值~O(∩_∩)O~~~~") == 0)
{
SetDlgItemText(IDC_OUT,"請?jiān)谳斎肟蜉斎霐?shù)值~O(∩_∩)O~~~~");
GetDlgItem(IDC_IN)-> SetFocus();// 設(shè)置光標(biāo)在 輸入 文本框
return ;
}


Tmp[strlen(Tmp)-1]='\0';// 復(fù)制到時(shí)候 去掉小數(shù)點(diǎn)


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

EmptyClipboard(); // 清空剪切板 并釋放剪切板中數(shù)據(jù)的句柄 把剪切板的所有權(quán)賦給當(dāng)前窗口
hClip = GlobalAlloc(GMEM_MOVEABLE,strlen(Tmp)+1); // 分配一個(gè)內(nèi)存對象 第二個(gè)參數(shù) 字節(jié)數(shù)
pBuf = (char *)GlobalLock(hClip); // 將空間加鎖 并返回 指針
strcpy(pBuf,Tmp);  
GlobalUnlock(hClip);  // 解鎖
SetClipboardData(CF_TEXT,pBuf); // 寫入數(shù)據(jù)
CloseClipboard(); // 關(guān)閉


SetDlgItemText(IDC_TS,"【復(fù)制數(shù)據(jù)完畢!】");
}
}
粗略檢查 輸入合法性
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;
}

動(dòng)態(tài)計(jì)算的實(shí)現(xiàn):
在對話框編輯器上,選中combo控件,屬性,事件。選中CBN_SELCHANGE,下拉中選中哪個(gè)函數(shù),就能產(chǎn)生事件函數(shù)入口了。然后雙擊該下拉列表控件 即可轉(zhuǎn)入 寫函數(shù)的地方

文本框 則 選擇 事件 :EN_CHANGE

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


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


// 第二個(gè) 下拉列表
void CTGMKBDlg::OnSelchangeCombo3()  //  下拉列表
{
JG();
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表