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