// trackbarandspinbox.cpp // // trackbar + spinbox(edit + spin control) sample #include #include #include "framework.h" #include "trackbarandspinbox.h" #define MAX_LOADSTRING 100 #define IDC_BUTTON_OPENDIALOG 110 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 static int number = 1000; // このコード モジュールに含まれる関数の宣言を転送します: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); // entry point int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化する LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_TRACKBARANDSPINBOX, szWindowClass, MAX_LOADSTRING); // ウインドウクラスを登録 { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; // icon無し wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; // menu無し wcex.lpszClassName = szWindowClass; wcex.hIconSm = NULL; // icon無し RegisterClassExW(&wcex); } // メインウインドウ生成 { hInst = hInstance; HWND hWnd = CreateWindowW( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, // x, y 320, 180, // width, height nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); } MSG msg; // メイン メッセージ ループ: while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウを描画する // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: // メインウインドウ生成時の処理 // ”Open Dialog" ボタンを配置 CreateWindow( L"BUTTON", L"Open Dialog", WS_CHILD | WS_VISIBLE, 20, 20, 100, 24, // x, y, width, height hWnd, (HMENU)IDC_BUTTON_OPENDIALOG, // ボタンに割り当てるID hInst, NULL ); break; case WM_COMMAND: { int wmId = LOWORD(wParam); switch (wmId) { case IDC_BUTTON_OPENDIALOG: // "Open Dialog"ボタンが押されたのでダイアログを表示 DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc); InvalidateRect(hWnd, NULL, TRUE); // これを入れないとメインウインドウが再描画されない break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: // メインウインドウ描画処理 { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // TODO: HDC を使用する描画コードをここに追加してください... // 設定値を描画 { wchar_t szBuf[1024]; swprintf_s(szBuf, sizeof(szBuf) / sizeof(wchar_t), L"number=%d", number); TextOut(hdc, 20, 70, szBuf, lstrlen(szBuf)); } EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hEdit1, hSlider1, hSpin1; int n; BOOL success; UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: // ダイアログ生成時の処理 hSlider1 = GetDlgItem(hDlg, IDC_SLIDER1); hEdit1 = GetDlgItem(hDlg, IDC_EDIT1); hSpin1 = GetDlgItem(hDlg, IDC_SPIN1); // SpinBox(UpDOwnコントロール)を設定 SendMessage(hSpin1, UDM_SETBUDDY, (WPARAM)hEdit1, 0); // EDITTEXTと連動 SendMessage(hSpin1, UDM_SETRANGE, (WPARAM)0, (LPARAM)MAKELONG(4000, 10)); // 値の範囲を設定 SendMessage(hSpin1, UDM_SETPOS, 0, (LPARAM)number); // 現在の値を設定 // trackbarを設定 SendMessage(hSlider1, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(10, 4000)); // 値の範囲を設定 SendMessage(hSlider1, TBM_SETTICFREQ, 500, 0); // 目盛りの間隔を設定 SendMessage(hSlider1, TBM_SETPOS, TRUE, (LPARAM)number); // 現在の値を設定 return (INT_PTR)TRUE; case WM_HSCROLL: // trackbarが操作された if ((HWND)(lParam) == hSlider1) { int n; n = SendMessage(hSlider1, TBM_GETPOS, 0, 0); // get trackbar pos SendMessage(hSpin1, UDM_SETPOS, 0, (LPARAM)n); // set SpiBox pos } return (INT_PTR)TRUE; case WM_COMMAND: // ダイアログからコマンドを受け取る switch (LOWORD(wParam)) { case IDOK: // OKボタンが押された n = GetDlgItemInt(hDlg, IDC_EDIT1, &success, FALSE); if (success) number = n; EndDialog(hDlg, LOWORD(wParam)); // ダイアログを終了 return (INT_PTR)TRUE; case IDCANCEL: // Cancelボタンが押された EndDialog(hDlg, LOWORD(wParam)); // ダイアログを終了 return (INT_PTR)TRUE; case IDC_EDIT1: // EDIT欄が変更された n = GetDlgItemInt(hDlg, IDC_EDIT1, &success, FALSE); // get edit int value if (success) SendMessage(hSlider1, TBM_SETPOS, TRUE, (LPARAM)n); // set trackbar pos return (INT_PTR)TRUE; default: break; } break; } return (INT_PTR)FALSE; }