#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") #include <Windows.h> const TCHAR* APP_NAME = TEXT("Dollar Yen Conversion"); const int WINDOW_WIDTH = 680; const int WINDOW_HEIGHT = 480; const int CONTROL_BASEX = 30; const int CONTROL_BASEY = 30; const int MAX_EDIT_SIZE = 256; const int ID_MONEY_EDIT = 100; const int ID_RATE_EDIT = 101; const int ID_DOLLAR_BUTTON = 102; const int ID_YEN_BUTTON = 103; static HWND g_hwnd; enum ConversionType { TO_DOLLAR, TO_YEN }; void Calculate(TCHAR* money, TCHAR* rate, ConversionType ct, TCHAR* result, int result_size) { int nmoney = 0; int nrate = 0; int i; for(i = 0; money[i] != TEXT('\0'); i++){ if(TEXT('0')<=money[i] && money[i]<=TEXT('9')){ nmoney *= 10; nmoney += money[i] - TEXT('0'); } if(money[i] == TEXT('.')) break; // 小数点以下未対応 } for(i = 0; rate[i] != TEXT('\0'); i++){ if(TEXT('0')<=rate[i] && rate[i]<=TEXT('9')){ nrate *= 10; nrate += rate[i] - TEXT('0'); } if(rate[i] == TEXT('.')) break; // 小数点以下未対応 } TCHAR buf[MAX_EDIT_SIZE]; //デバッグ用 // wsprintf(buf, TEXT("%s-%d %s-%d"), money, nmoney, rate, nrate); // MessageBox(NULL, buf, TEXT("debug: money-nmoney rate-nrate"), NULL); if(nrate == 0){ lstrcpy(buf, TEXT("エラー:レート入力が不正です。")); }else{ if(ct == TO_DOLLAR){ int integer_part = nmoney / nrate; // オーバーフローを防ぐためキャストした int decimal_part = (static_cast<long long>(nmoney)*100 / nrate) % 100; wsprintf(buf, TEXT("$%d.%02d"), integer_part, decimal_part); }else{ wsprintf(buf, TEXT("\\%d"), nmoney * nrate); } } lstrcpyn(result, buf, result_size); } LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { static HWND money_edit, rate_edit; switch (msg) { case WM_CREATE: money_edit = CreateWindowEx( 0, TEXT("EDIT"), TEXT("\\1000"), WS_CHILD | WS_VISIBLE | WS_BORDER, CONTROL_BASEX, CONTROL_BASEY, 200, 40, hwnd, (HMENU)ID_MONEY_EDIT, ((LPCREATESTRUCT)lp)->hInstance, NULL); rate_edit = CreateWindowEx( 0, TEXT("EDIT"), TEXT("レート金額"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, CONTROL_BASEX, CONTROL_BASEY+50, 200, 40, hwnd, (HMENU)ID_RATE_EDIT, ((LPCREATESTRUCT)lp)->hInstance, NULL); CreateWindowEx( 0, TEXT("BUTTON"), TEXT("\\→$"), WS_CHILD | WS_VISIBLE, CONTROL_BASEX+300, CONTROL_BASEY, 80, 40, hwnd, (HMENU)ID_DOLLAR_BUTTON, ((LPCREATESTRUCT)lp)->hInstance, NULL); CreateWindowEx( 0, TEXT("BUTTON"), TEXT("$→\\"), WS_CHILD | WS_VISIBLE, CONTROL_BASEX+300, CONTROL_BASEY+50, 80, 40, hwnd, (HMENU)ID_YEN_BUTTON, ((LPCREATESTRUCT)lp)->hInstance, NULL); return 0; case WM_COMMAND: if (LOWORD(wp) == ID_DOLLAR_BUTTON || LOWORD(wp) == ID_YEN_BUTTON) { TCHAR money_text[MAX_EDIT_SIZE]; TCHAR rate_text[MAX_EDIT_SIZE]; TCHAR result[MAX_EDIT_SIZE]; GetWindowText(money_edit, money_text, MAX_EDIT_SIZE); GetWindowText(rate_edit, rate_text, MAX_EDIT_SIZE); // MessageBox(NULL, money_text, TEXT("debug-money_text"), NULL); // デバッグ用 if(LOWORD(wp) == ID_DOLLAR_BUTTON){ Calculate(money_text, rate_text, TO_DOLLAR, result, MAX_EDIT_SIZE); }else{ Calculate(money_text, rate_text, TO_YEN, result, MAX_EDIT_SIZE); } SetWindowText(money_edit, result); } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; wc.style = CS_CLASSDC; wc.lpfnWndProc = WinProc; wc.cbClsExtra = wc.cbWndExtra =0; wc.hInstance = hInst; wc.hIcon = 0; wc.hCursor = 0; wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = APP_NAME; if(RegisterClass(&wc) == 0) { MessageBox(NULL, TEXT("RegisterClass関数が失敗しました"), APP_NAME, NULL); return 0; } g_hwnd = CreateWindow( APP_NAME, //クラス名 APP_NAME, //タイトルバーテキスト WS_OVERLAPPEDWINDOW, //ウインドウスタイル CW_USEDEFAULT, //ウインドウ左上x座標 CW_USEDEFAULT, //ウインドウ左上y座標 WINDOW_WIDTH, //ウインドウ幅 WINDOW_HEIGHT, //ウインドウ高さ NULL, //親ウインドウのハンドル NULL, (HINSTANCE)GetModuleHandle(NULL), NULL ); if(!g_hwnd){ MessageBox(NULL, TEXT("CreateWindow関数が失敗しました"), APP_NAME, NULL); return 0; } ShowWindow(g_hwnd, SW_SHOW); UpdateWindow(g_hwnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } |
物置 >