WM_HSCROLL

WM_HSCROLLをやってなかったので、ここのイベント時の処理も書いて、水平方向にもスクロールしてみる。

WM_HSCROLL メッセージ (Winuser.h) - Win32 apps | Microsoft Learn

WM_HSCROLL.cppで、

左クリック時の初期化で、水平方向分の設定も追加。

WM_HSCROLLに来た時の処理も追加。

起動時
起動時

起動時。

左クリックで表示
左クリックで表示

左クリックで表示。

右に1ピクセルずつスクロール
右に1ピクセルずつスクロール

右に1ピクセルずつスクロール。

1ページスクロールで一気に。
1ページスクロールで一気に。

1ページスクロールで一気に。

つまみを1番左に戻す。
つまみを1番左に戻す。

つまみを1番左に戻す。
スクロールするたびに見えてなかった部分は白く出てしまう。

Sample/winapi/WM_HSCROLL/WM_HSCROLL/src/WM_HSCROLL at master · bg1bgst333/Sample · GitHub

ScrollWindow

ScrollWindowでクライアント領域をスクロールする。

ScrollWindow 関数 (winuser.h) - Win32 apps | Microsoft Learn

これまでは、WM_PAINT時のBitBltで描画する範囲をスクロールごとに変えていく方法を取っていた。
しかし、どうもScrollWindowを使えば、WM_PAINTが無くても見えている範囲のスクロールは勝手にやってくれるらしい。
ScrollWindow.cppで、

左クリックで、ビットマップを描画し、スクロールバーの初期設定。
上下のスクロールのみ対応。
WM_PAINTは無い。

クライアント領域は画像より小さい
クライアント領域は画像より小さい

クライアント領域は画像より小さい。
ここで左クリックすると、

bitmap1.bmpが描画される
bitmap1.bmpが描画される

bitmap1.bmpが描画される。
スクロールバーの長さも適切なものに。

スクロールバーの一番下のボタンで1行ずつスクロールする。
スクロールバーの一番下のボタンで1行ずつスクロールする。

スクロールバーの一番下のボタンで1行ずつスクロールする。
下の見えていなかった部分は、WM_PAINTが呼ばれるようにして、そこで描画しないといけないが、ここではあえてそれをしていないので白くなっている。

一番下のボタンとつまみの間をクリックすると、1ページ分のスクロール。
一番下のボタンとつまみの間をクリックすると、1ページ分のスクロール。

一番下のボタンとつまみの間をクリックすると、1ページ分のスクロール。
ここでは、一気に下までスクロールしている。その分、白い部分が大きく見えている。

今度はつまみを掴んで一気に上に戻す。
今度はつまみを掴んで一気に上に戻す。

今度はつまみを掴んで一気に上に戻す。
隠れていた部分は再描画されないので今度は上のほうが白くなる。
ScrollWindowでスクロールは出来たが、どっちみちWM_PAINTで見えてない部分の再描画は必要。

Sample/winapi/ScrollWindow/ScrollWindow/src/ScrollWindow at master · bg1bgst333/Sample · GitHub

STM_SETIMAGE

ウィンドウメッセージSTM_SETIMAGEで、スタティックコントロールにビットマップをセットできる。

STM_SETIMAGE message (Winuser.h) - Win32 apps | Microsoft Learn

プロジェクト作成後、

リソースを追加
リソースを追加

リソースを追加。

Bitmapを新規作成
Bitmapを新規作成

Bitmapを新規作成。

最初はこうだけど、いったん閉じて
最初はこうだけど、いったん閉じて

最初はこうだけど、いったん保存して閉じて、
テキストエディタで、resource.hを、

こうして、STM_SETIMAGE.rcも、

こうして、

bitmap1.bmpをこれに置き換える。
bitmap1.bmpをこれに置き換える。

bitmap1.bmpをこれに置き換える。
ソリューション開いたら、

こうなってる
こうなってる

こうなってる。
あとは、STM_SETIMAGE.cppで、

LoadBitmapで取得したhBitmapを、SendMessageのSTM_SETIMAGEにてセット。

セットできた
セットできた

セットできた。

Sample/winapi/STM_SETIMAGE/STM_SETIMAGE/src/STM_SETIMAGE at master · bg1bgst333/Sample · GitHub

CStatic::SetBitmap

CStatic::SetBitmapで、スタティックコントロールにビットマップをセットする。

CStatic クラス | Microsoft Docs

resの下にbitmap1.bmpを置いて、
resの下にbitmap1.bmpを置いて、

resの下にbitmap1.bmpを置いて、

リソース
リソース

リソース、

Bitmapをインポート
Bitmapをインポート

Bitmapをインポート。

bitmap1.bmpをIDB_BITMAP1としてインポート
bitmap1.bmpをIDB_BITMAP1としてインポート

bitmap1.bmpをIDB_BITMAP1としてインポート。

ハンドラOnDestroy追加
ハンドラOnDestroy追加

ハンドラOnDestroy追加。
CStaticDlg.hで、

こう書いて、
CStaticDlg.cppでは、OnInitDialogが、

で、OnDestroyは、

こう書く。

表示された。
表示された。

表示された。
SS_BITMAPだけなので、はみ出ている。

Sample/mfc/CStatic/SetBitmap/src/CStatic at master · bg1bgst333/Sample · GitHub

CBitmap::operator HBITMAP

HBITMAP演算子で、ロードされたビットマップのビットマップハンドルを取得できる。

CBitmap クラス | Microsoft Docs

CBitmapDlg.cppで、

取得したhBitmapも表示する。

成功
成功

成功。

hBitmapの値はこれ
hBitmapの値はこれ

hBitmapの値はこれ。

で、ダイアログが出る。
で、ダイアログが出る。

で、ダイアログが出る。

Sample/mfc/CBitmap/HBITMAP_operator/src/CBitmap at master · bg1bgst333/Sample · GitHub

CBitmap::LoadBitmap

CBitmap::LoadBitmapで、登録済みビットマップリソースを読み込む。

CBitmap クラス | Microsoft Docs

ビットマップファイルではなく、リソースとして登録したビットマップリソースなのがポイント。
(ビットマップファイルの場合は、ちょっと面倒くさい。)
プロジェクト作成したら、

resの下にビットマップファイルを置いておく
resの下にビットマップファイルを置いておく

resの下にビットマップファイルを置いておく。

リソース
リソース

リソース、

Bitmapをインポート
Bitmapをインポート

Bitmapをインポート、

ビットマップファイルを選択
ビットマップファイルを選択

ビットマップファイルを選択。

IDB_BITMAP1というリソースIDで登録される
IDB_BITMAP1というリソースIDで登録される

IDB_BITMAP1というリソースIDで登録される。
CBitmapDlg.cppで、

CBitmap::LoadBitmapでIDB_BITMAP1をロードする。
成功ならTRUE、失敗ならFALSE。

成功
成功

成功。

その後は、何もしてないので、ただダイアログが表示される。
その後は、何もしてないので、ただダイアログが表示される。

その後は、何もしてないので、ただダイアログが表示される。

Sample/mfc/CBitmap/LoadBitmap/src/CBitmap at master · bg1bgst333/Sample · GitHub

CStatic::Create

CStatic::Createで、スタティックコントロールのウィンドウを作成する。

CStatic クラス | Microsoft Docs

CStaticDlg.hで、

CWndポインタのm_pStatic1、CStaticポインタのm_pStatic2を追加。
CStaticDlg.cppで、

このように書く。
CStaticのCreateはリソースIDが不要。

2つ表示される
2つ表示される

2つ表示される。

Sample/mfc/CStatic/Create/src/CStatic at master · bg1bgst333/Sample · GitHub