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

CEdit::Create

CEdit::Createで、エディットコントロールのウィンドウを作成する。

CEdit Class | Microsoft Docs

CEditDlg.hで、

CWndポインタのm_pEdit1、CEditポインタのm_pEdit2を追加。
CEditDlg.cppで、

このように書く。
CEditのCreateはウィンドウ名も不要。

どちらも入力できる
どちらも入力できる

どちらも入力できる。

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