|
程序界面:

使用方法:
輸入數字后即可動態算出結果!緩椭啤堪粹o 的功能是將結果復制到 剪切板中
設計這個程序,是因為一個兄弟的需要,界面布局由他設計。
剛設計的時候,我沒有多大的把握。因為一個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();
}
|
|