物置‎ > ‎

DollarYenConversion

#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;
}