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