質問: ### 前提・実現したいこと CとWinAPIで独自スクロールバーをネイティブ関数で実装したいと考えていますがどのような手順を踏めばいいのでしょう?実装の概要や関数,検索ワードを教えていただきたいです. バーのデザインはデフォルト同様上下にそれぞれボタンとドラックできるノブで考えています. ### 補足情報 Windows10 Pro VisualStudio2017 Community
回答: かつて作った身としては結構泥臭い実装するしかなかったです。 基本はマウスorキーボード入力で値等を更新、再描画、を繰り返します。 スクロールバーは一般的にアップ/ダウンボタン、トラック(バー)領域、残りのページアップ/ダウン(?)領域の5つで構成されていますので、それぞれが押されているかどうかで処理とか移動量を分けます。 位置判定とか描画時には縦向きか横向きかで細々と処理を分ける必要があります。 ・RegisterClassExで独自スクロールバーのウィンドウクラスを作成 ・WM_MOUSEDOWNで各領域判定してSetCaptureでキャプチャーを開始、ボタン、ページ領域なら押している間タイマーで値を更新、トラック領域ならWM_MOUSEMOVEで移動先の位置を判定 ・WM_MOUSEUPでキャプチャーを完了 それぞれで値などの変化があったらInvalidateRect等で再描画 ・WM_PAINTでは現在のステートに応じて各パーツの表示状態を変える という流れです。 各プロパティの設定はスクロールバーのものをそのまま流用するかWM_APP以降の値で独自のコマンドを作り、SendMessageで設定します。 あとマウスが押されたらフォーカスを移動してWM_KEYDOWNとかも処理が必要になります。 独自の値等を保持するにはWM_CREATEで領域を確保、ポインタをSetWindowLongで保存しておいて、WM_DESTROYで開放します。