OPENFILENAME

ファイル選択をするときは、OPENFILENAME構造体をGetOpenFileNameなどに渡す必要がある。

OPENFILENAMEA (commdlg.h) - Win32 apps | Microsoft Learn

どれくらい最低限渡せば動くのか。

		// メニュー項目が選択されたり, ボタンなどのコントロールが押されたりした時.
		case WM_COMMAND:	// メニュー項目が選択されたり, ボタンなどのコントロールが押されたりした時.(uMsgがWM_COMMANDの時.)

			// WM_COMMANDブロック
			{

				// どのメニュー項目が選択されたかを判定する.
				switch (LOWORD(wParam)){	// LOWORD(wParam)で選択されたメニュー項目のIDが取得できるので, その値で判定する.

					// 取得したIDごとに処理を分岐.
					// Openが選択された時.
					case ID_FILE_OPEN:

						// ID_FILE_OPENブロック
						{

							// 変数の宣言・初期化.
							OPENFILENAME ofn = {0};	// OPENFILENAME構造体変数ofnを{0}で初期化.

							// ファイル選択.
							if (!GetOpenFileName(&ofn)){	// GetOpenFileNameでファイルを選択.

								// 選択しなかった場合.(キャンセル)
								return 0;	// 処理したので戻り値として0を返す.

							}

						}

						// 既定の処理へ向かう.
						break;	// breakで抜けて, 既定の処理(DefWindowProc)へ向かう.

初期化だけで渡すと、

選択しても、
選択しても、

選択しても、

何も起きない
何も起きない

何も起きない。

ofn.lStructSizeにsizeof(OPENFILENAME)を渡すだけで、

選択したら、
選択したら、

選択したら、

表示された
表示された

ファイル選択ダイアログが表示された。

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

BITMAP構造体

BITMAP構造体に、ビットマップの幅、高さ、形式、色書式などの情報が含まれる。

BITMAP (wingdi.h) - Win32 apps | Microsoft Learn

BITMAP_struct.cppで、

bmBitsPixel以外の要素を表示してみる。
左クリックで、

こうなっている。
こうなっている。

こうなっている。
32bitビットマップなのか?!

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

GetObject

GetObjectで、GDIオブジェクトハンドルから、GDIオブジェクト情報を持つ構造体を取得できる。

GetObject function (wingdi.h) - Win32 apps | Microsoft Learn

ビットマップハンドルHBITMAPを渡せば、BITMAP構造体を取得でき、そこから幅と高さを取得できる。
GetObject.cppで、

このように取得。

ウィンドウ名に幅と高さをセット。

起動時
起動時

起動時。
左クリックすると、

ウィンドウ名が(640, 480)に。
ウィンドウ名が(640, 480)に。

ウィンドウ名が(640, 480)に。

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

GetUpdateRect

GetUpdateRectで、InvalidateRectなどで指定されたりして出来た無効領域のRECTを取得できる。

GetUpdateRect function (winuser.h) - Win32 apps | Microsoft Learn

ScrollWindowでスクロールして出来た白い描画されてない領域のRECTを、InvalidateRectに指定して、WM_PAINT側でGetUpdateRectでそれを取得し、そこに残りの描画すべきビットマップの一部を描画する。
GetUpdateRect.cppにて、WM_HSCROLLは、

こうする。
WM_VSCROLLは、

こうする。
WM_PAINTは、

こう書く。
GetUpdateRectはBeginPaintより前に置く。

"Update"って入ってるので、app.manifestが要る。
"Update"って入ってるので、app.manifestが要る。

"Update"って入ってるので、app.manifestが要る。

左上
左上

左上。

右上
右上

右上。

右下
右下

右下。

左下
左下

左下。
これで、スクロールバーでビットマップをスクロールして見ることが出来た。

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

SCROLLINFO

SCROLLINFOは、スクロール情報を持つ構造体。

SCROLLINFO (winuser.h) - Win32 apps | Microsoft Learn

SCROLLINFO.cppで、

RECTの計算も、WM_HSCROLLの項では間違っていたので修正したし、コードが複雑になっていたので、ちょっと整理した。

起動時
起動時

起動時。

左クリック。画像も変えた。
左クリック。画像も変えた。

左クリック。画像も変えた。

下にスクロール
下にスクロール

下にスクロール。

右にスクロール
右にスクロール

右にスクロール。

スクロールを両方とも元の位置に戻すとこうなる。
スクロールを両方とも元の位置に戻すとこうなる。

スクロールを両方とも元の位置に戻すとこうなる。
まだ、再描画がないので、隠れたところは白く消えてしまう。

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

RECT

RECTは、矩形の左端、右端、上端、下端、を表す構造体。

RECT (windef.h) - Win32 apps | Microsoft Learn

GetWindowRectでウィンドウのRECTが取得できるので、そこから幅と高さを計算する。

で、勘違いしてたんだけど、幅widthはrc.right - rc.left, 高さheightはrc.bottom-rc.topが正解だった・・・。
(以前の項で、right - left + 1とか、bottom - top + 1とか、なぜか+1してたけど、これはいらなかった・・・。)

結果はこうなる
結果はこうなる

結果はこうなる。

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

POINT

POINTは、位置(x, y)を指定するときに使う構造体。

POINT (windef.h) - Win32 apps | Microsoft Learn

GetCursorPosの項で、ウィンドウメッセージが来てない時に、マウスカーソルの座標を描画するようなプログラムを作ったが、WindowFromPointをさらに使えば、リアルタイムにその位置のウィンドウハンドルを描画できる。
POINT.cppで、

前回のプログラムに、その位置のウィンドウハンドルも描画する処理を追加した。

ボタンのハンドル
ボタンのハンドル

ボタンのハンドル。

ボタン以外のウィンドウのクライアント領域のハンドル
ボタン以外のウィンドウのクライアント領域のハンドル

ボタン以外のウィンドウのクライアント領域のハンドル。

この位置だとウィンドウハンドルが出る
この位置だとウィンドウハンドルが出る

この位置だとウィンドウハンドルが出る。

ボタンの上だとボタンハンドルが出る
ボタンの上だとボタンハンドルが出る

ボタンの上だとボタンハンドルが出る。

ウィンドウの外のこの位置だとまた別のハンドル
ウィンドウの外のこの位置だとまた別のハンドル

ウィンドウの外のこの位置だとまた別のハンドル。

さらにウィンドウの下のこの位置だとまた別のハンドル
さらにウィンドウの下のこの位置だとまた別のハンドル

さらにウィンドウの下のこの位置だとまた別のハンドル。

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