# Windowsプログラミング

みんな大好きWindowsプログラミングについてのいろいろ

# ComptrとDirectXの話

マイクロソフト界隈のプログラミング環境で、度々見かける正体不明の言葉たち。  
DirectX関連のコードを書いているとちょいちょい見かけて、知らんうちに使ってるけど正体がよくわかっていない怖いやつ****「ＣＯＭオブジェクト」****について

## COMオブジェクトって何ぞ？（ていがくねんむけせつめい）

### 💡まず「COM」ってなに？

****COM（コム）****は「****Component Object Model****（コンポーネント オブジェクト モデル）」の略です。  
でもそんなカタい言葉、いったん忘れてください。

---

### 🍱 COMオブジェクトは「お弁当のおかず」

たとえば「ゲームを作る」としましょう。

- 自分で全部作るのは大変なので、
- 「誰かが作ったキャラ描画システム」や「音を鳴らす仕組み」を借りたいとします。

それが、****「COMオブジェクト」****です。

---

### 📦 COMオブジェクトは「貸してくれる便利な道具」

- 「絵を描く道具」
- 「音を出す道具」
- 「データを保存する道具」

みたいな「****完成された便利な道具（部品）****」を、他の人（Microsoftなど）が作っていて、  
それを****「COMオブジェクト」として使えるようにしてくれてる****んです。

---

### 🗣️「共通のルールで話せる友達」

COMオブジェクトにはルールがあります。

- 誰が使っても動くように、
- どんな言語（C++、C#、VB）でも使えるように、
- 「同じ約束（インターフェース）」でやりとりするんです。

だから「****知らない人が作ったプログラムの部品****」でも、安心して呼び出して使えます。

---

### 🧩 まとめ

<table id="bkmrk-%E6%AF%94%E5%96%A9%E6%84%8F%E5%91%B3%E3%81%8A%E3%81%8B%E3%81%9A%EF%BC%88%E9%81%93%E5%85%B7%EF%BC%89com%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88"><colgroup><col></col><col></col></colgroup><tbody><tr><th>比喩

</th><th>意味

</th></tr><tr><td>おかず（道具）

</td><td>COMオブジェクト

</td></tr><tr><td>お弁当箱

</td><td>自分のアプリ

</td></tr><tr><td>### おかずの受け渡しのルール

</td><td>COMの決まり（インターフェース）

</td></tr><tr><td>作ってくれた人

</td><td>Microsoftや他の開発者

</td></tr></tbody></table>

---

### ✅ 一言で言うと

> ****「COMオブジェクト」とは、共通のルールで作られた便利な部品のこと。いろんなソフトから呼び出して使える。****

## もう少し勉強した人向けの説明

## 🔧 COMオブジェクトとは何か？

### ✳️ ざっくり一言でいうと：

> ****「異なるプログラミング言語やアプリケーション同士が、共通の仕組みでオブジェクトをやりとりできるようにした技術」****  
> <span style="white-space: pre-wrap;">→ それが </span>****COM（Component Object Model）****  
> <span style="white-space: pre-wrap;">→ COMを通じて使えるインスタンス（機能の塊）が </span>****COMオブジェクト****

---

### 🎯 COMが目指すこと

プログラムの世界には「部品の再利用」や「モジュール化」が大事です。

でも、

- C++で書かれたモジュール
- VBで書かれたアプリ
- スクリプトで動かしたい自動処理

これらが****言語や仕組みを超えて****、****共通のやり方で連携できる****ようにしたのがCOMです。

---

### 🧱 COMオブジェクトの仕組み（ざっくり）

1. ****インターフェース（IUnknownやIDispatch）****
    - COMオブジェクトには最低1つ、****インターフェース****があります。
    - 利用者はインターフェース越しにしかCOMオブジェクトにアクセスできません。
    - 実装の中身は隠蔽されていて見えません（カプセル化）。
2. ****GUID（Globally Unique Identifier）****
    - COMオブジェクトやインターフェースには一意のID（GUID）が振られています。
    - これにより、OSや他アプリから動的に識別できます。
3. ****参照カウント（Reference Counting）****
    - COMは内部的にAddRef/Releaseを通じてオブジェクトの寿命を管理します（ガベージコレクションはしません）。

---

### ✅ よく使われる場面

- ****DirectX****（Direct3DなどはCOMベース）
- ****Office VBA****（Excel.Application などもCOMオブジェクト）
- ****Windows APIの一部****
- ****ActiveXコントロール****

---

### 💡 なぜ今でも使われる？

- Windows OSレベルで深く組み込まれている（レジストリ、OLE、自動化）
- <span style="white-space: pre-wrap;">いまだに </span>****多くの既存ライブラリがCOMで提供されている****
- C++などで細かく制御したい場面に強い（低レイヤ）

---

### 👨‍🏫 まとめ

<table id="bkmrk-%E9%A0%85%E7%9B%AE%E5%86%85%E5%AE%B9%E7%9B%AE%E7%9A%84%E8%A8%80%E8%AA%9E%E3%82%92%E8%B6%85%E3%81%88%E3%81%A6%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%8C%E5%85%B1"><colgroup><col></col><col></col></colgroup><tbody><tr><th>項目

</th><th>内容

</th></tr><tr><td>目的

</td><td>言語を超えて再利用できる「共通のオブジェクト化」技術

</td></tr><tr><td>コア概念

</td><td>インターフェースベース、参照カウント、GUID

</td></tr><tr><td>主な用途

</td><td>DirectX、Office自動化、ActiveX、WinAPI

</td></tr><tr><td>メリット

</td><td>再利用性、互換性、Windowsとの親和性

</td></tr><tr><td>デメリット

</td><td>実装がやや複雑（CoCreateInstance、IUnknown、HRESULT...）

</td></tr></tbody></table>

## ComPtrについて

### 🧩 前提まとめ：DirectXはCOMベース

まず前提として：

- ****DirectX（特に Direct3D）****<span style="white-space: pre-wrap;"> は </span>****COMベースのAPI****<span style="white-space: pre-wrap;"> です。</span>
- つまり、Direct3Dの各機能（デバイス、バッファ、シェーダなど）は****COMオブジェクトとして提供されている****。
- 例：`<span class="editor-theme-code">ID3D11Device</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">ID3D11Texture2D</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">IDXGISwapChain</span>`<span style="white-space: pre-wrap;"> など</span>

---

### ❗COMの注意点：メモリ管理が自分持ち

COMオブジェクトは自動で解放されません。  
<span style="white-space: pre-wrap;">代わりに </span>`<span class="editor-theme-code">AddRef()</span>`<span style="white-space: pre-wrap;"> と </span>`<span class="editor-theme-code">Release()</span>`<span style="white-space: pre-wrap;"> で </span>****参照カウント管理****<span style="white-space: pre-wrap;"> を自前で行う必要があります。</span>

```cpp
ID3D11Device* device = nullptr;
CreateDevice(..., &device);
// 使い終わったら手動で解放
device->Release();
```

<span style="white-space: pre-wrap;">これをうっかり忘れると </span>****メモリリーク****<span style="white-space: pre-wrap;"> や </span>****クラッシュ****<span style="white-space: pre-wrap;"> の原因になります。</span>

---

### 🛡️ ComPtr とは？（Microsoft::WRL::ComPtr）

> ****ComPtrは、COMオブジェクトをスマートポインタで安全に扱うためのラッパークラス****です。

`<span class="editor-theme-code">ComPtr<T></span>`<span style="white-space: pre-wrap;"> を使えば、参照カウントの管理を自動でやってくれます！</span>

### 🔁 ComPtrがやってくれること：

- `<span class="editor-theme-code">AddRef()</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Release()</span>`<span style="white-space: pre-wrap;"> を自動で呼ぶ</span>
- 所有権の移動（Move）やコピー（Copy）も安全に処理
- `<span class="editor-theme-code">nullptr</span>`<span style="white-space: pre-wrap;"> チェックや </span>`<span class="editor-theme-code">QueryInterface()</span>`<span style="white-space: pre-wrap;"> も簡潔にできる</span>

---

### ✅ 使用例（素のポインタ vs ComPtr）

#### 【従来】生ポインタでの DirectX デバイス生成：

```cpp
ID3D11Device* device = nullptr;
ID3D11DeviceContext* context = nullptr;

D3D11CreateDevice(..., &device, &context);
// ...使う
device->Release();
context->Release();
```

#### 【今どき】ComPtrを使った安全なやり方：

```cpp
#include <wrl/client.h>
using Microsoft::WRL::ComPtr;

ComPtr<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;

D3D11CreateDevice(..., device.GetAddressOf(), context.GetAddressOf());
// 解放は自動（RAII）で行われる
```

> `<span class="editor-theme-code">GetAddressOf()</span>`<span style="white-space: pre-wrap;"> は </span>`<span class="editor-theme-code">T**</span>`<span style="white-space: pre-wrap;"> が必要なAPIのために ComPtr の中身のアドレスを渡す関数です。</span>

---

### 📌 DirectX × ComPtr：なぜ使うのが当たり前？

#### 👍 メリットまとめ：

<table id="bkmrk-comptr-%E3%81%AE%E5%88%A9%E7%82%B9%E8%A7%A3%E8%AA%AC%E8%87%AA%E5%8B%95%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86r"><colgroup><col></col><col></col></colgroup><tbody><tr><th>ComPtr の利点

</th><th>解説

</th></tr><tr><td>自動メモリ管理

</td><td>`<span class="editor-theme-code">Release()</span>`

<span style="white-space: pre-wrap;"> を書かなくていい。例外にも安全</span>

</td></tr><tr><td>スマートなコード

</td><td>`<span class="editor-theme-code">if (device)</span>`

<span style="white-space: pre-wrap;"> のようにそのままチェックできる</span>

</td></tr><tr><td>RAIIに沿う

</td><td>C++のモダンな設計思想とマッチ

</td></tr><tr><td>安心してAPI連携

</td><td>`<span class="editor-theme-code">GetAddressOf()</span>`

<span style="white-space: pre-wrap;"> で API に渡しやすい</span>

</td></tr></tbody></table>

---

### 🧠 最後に一言でまとめると…

> ****DirectXはCOMでできている。COMの参照カウント管理は手間がかかる。ComPtrを使えばそれが自動で、ミスも減る。だからプロでも標準的に使われている。****

# Windowsプログラミングについて

## Windowクラス

### 種類

- WNDCLASSEXA
- WNDCLASSEXW
- WNDCLASSA
- WNDCLASSW

### 構造体メンバ

<style id="bkmrk-.struct-members-th%2C-">
  .struct-members th,
  .struct-members td 
  {
  border: 1px solid #111;
  width: 6rem;
  }
  .struct-members th 
  {
    background-color: #ddf;
  }
</style><table class="struct-members" id="bkmrk-%E5%88%97-a%E5%88%97-b-%E8%A1%8C-1a-1b-1-%E8%A1%8C-2"><thead> <tr><th></th><th>列-A</th><th>列-B</th></tr> <tr><th>行-1</th><td>A-1</td><td>B-1</td></tr> <tr><th>行-2</th><td>A-2</td><td>B-2</td></tr> <tr><th>行-3</th><td>A-3</td><td>B-3</td></tr> <tr><th>行-3</th><td>A-3</td><td>B-3</td></tr> <tr><th>行-3</th><td>A-3</td><td>B-3</td></tr> <tr><th>行-3</th><td>A-3</td><td>B-3</td></tr> <tr><th>行-3</th><td>A-3</td><td>B-3</td></tr></thead></table>

### このパラメタを変えるとこうなる！

## WinMainの引数の意味

- hInstance 
    - aaa
- hPrevInstace 
    - aaa
- lpCmdLine 
    - aaa
- nCmdShow 
    - aaa

## CreateWindowExの引数と戻り値

- dwExStyle
- lpClassName
- lpWindowName
- dwStyle
- X
- Y
- nWidth
- nHeight
- hWndParent
- hMenu
- hInstance
- lpParam

## メッセージループとコールバック関数の関係と仕組み

### メッセージループ

### コールバック

# XMVECTORとXMFLOATどっち？問題

### `<span class="editor-theme-code">XMVECTOR</span>`

`<span class="editor-theme-code">XMVECTOR</span>`は、DirectXMathライブラリの中核をなすデータ型です。その特徴は以下の通りです。

- ****SIMD (Single Instruction, Multiple Data) 最適化****: 複数の浮動小数点数を同時に処理できるCPU命令（SSE/AVXなど）を利用するために設計されています。これにより、ベクトル演算や行列演算が非常に高速に行われます。
- ****アラインメント****: SIMD命令が効率的に動作するために、通常16バイト境界にアラインメントされています。
- ****レジスタでの操作****: 多くの場合、CPUのレジスタ上で直接操作されるため、メモリアクセスによるオーバーヘッドが少ないです。
- ****直接的なアクセスが難しい****<span style="white-space: pre-wrap;">: </span>`<span class="editor-theme-code">XMVECTOR</span>`<span style="white-space: pre-wrap;">の個々の要素に直接アクセス（例: </span>`<span class="editor-theme-code">vec.x</span>`）することは通常できません。要素にアクセスするには、`<span class="editor-theme-code">XMVectorGetX()</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">XMVectorSetX()</span>`などの関数を使用する必要があります。

**`<strong class="editor-theme-bold editor-theme-code">XMVECTOR</strong>` **を使うべき場面****:

- ****ベクトルや行列の計算****: 加算、減算、乗算、内積、外積、変換など、あらゆる数学的な演算を行う場合。
- ****シェーダーへの定数バッファのアップロード****: シェーダーで利用するベクトルや行列データは、通常`<span class="editor-theme-code">XMVECTOR</span>`で計算し、`<span class="editor-theme-code">XMFLOAT4</span>`などで構成された定数バッファに格納してからGPUへ送ります。
- ****一時的な計算結果****: 関数内で中間的な計算を行う場合。

****例****:

C++

```
#include <DirectXMath.h>

// XMVECTOR同士の加算
XMVECTOR v1 = XMVectorSet(1.0f, 2.0f, 3.0f, 0.0f);
XMVECTOR v2 = XMVectorSet(4.0f, 5.0f, 6.0f, 0.0f);
XMVECTOR vResult = XMVectorAdd(v1, v2);

// 行列とベクトルの乗算
XMMATRIX m = XMMatrixRotationY(XM_PIDIV4);
XMVECTOR transformedVec = XMVector3TransformCoord(v1, m);
```

### `<span class="editor-theme-code">XMFLOAT</span>`<span style="white-space: pre-wrap;"> (例: </span>`<span class="editor-theme-code">XMFLOAT3</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">XMFLOAT4</span>`)

`<span class="editor-theme-code">XMFLOAT</span>`シリーズのデータ型（`<span class="editor-theme-code">XMFLOAT2</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">XMFLOAT3</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">XMFLOAT4</span>`など）は、C++の通常の構造体として定義されています。

- ****メモリ上でのデータ格納****: メモリ上にデータをシンプルに格納するために使用されます。
- ****アクセスしやすい****<span style="white-space: pre-wrap;">: </span>`<span class="editor-theme-code">float x, y, z, w;</span>`のようにメンバが直接公開されているため、個々の要素にアクセスしやすいです。
- ****アラインメントの制約が少ない****: 特別なアラインメントを考慮する必要がない場合が多いです（ただし、定数バッファなどGPUに送るデータの場合はアラインメントが重要になります）。
- ****SIMD最適化はされない****<span style="white-space: pre-wrap;">: </span>`<span class="editor-theme-code">XMFLOAT</span>`自体はSIMD最適化の恩恵を受けません。

**`<strong class="editor-theme-bold editor-theme-code">XMFLOAT</strong>` **を使うべき場面****:

- ****構造体やクラスのメンバ変数****: オブジェクトの位置、回転、スケールなど、永続的に保持したいデータ。
- ****頂点バッファのレイアウト****: 頂点データ（位置、法線、UVなど）を定義する場合。
- ****ファイルへの保存や読み込み****: データをファイルに書き込んだり、ファイルから読み込んだりする場合。
- ****GUIでの表示など、個々の要素へのアクセスが必要な場合****。
- **`<strong class="editor-theme-bold editor-theme-code">XMVECTOR</strong>`**での計算結果の格納****<span style="white-space: pre-wrap;">: </span>`<span class="editor-theme-code">XMVECTOR</span>`で計算した結果をメモリに保存する際、`<span class="editor-theme-code">XMStoreFloat3()</span>`や`<span class="editor-theme-code">XMStoreFloat4()</span>`関数を使用して`<span class="editor-theme-code">XMFLOAT</span>`型に変換します。

****例****:

C++

```
#include <DirectXMath.h>

// 構造体のメンバとして位置を保持
struct GameObject {
    XMFLOAT3 position;
    XMFLOAT4 color;
    // ...
};

GameObject player;
player.position = XMFLOAT3(0.0f, 1.0f, 0.0f);
player.color = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f);

// XMVECTORの計算結果をXMFLOAT3に格納
XMVECTOR vec = XMVectorSet(10.0f, 20.0f, 30.0f, 0.0f);
XMFLOAT3 resultFloat3;
XMStoreFloat3(&resultFloat3, vec); // ここで変換
```

### 変換について

`<span class="editor-theme-code">XMVECTOR</span>`と`<span class="editor-theme-code">XMFLOAT</span>`の間は、以下の関数を使って相互に変換できます。

- **`<strong class="editor-theme-bold editor-theme-code">XMFLOAT</strong>` **→** `<strong class="editor-theme-bold editor-theme-code">XMVECTOR</strong>`**:
    - `<span class="editor-theme-code">XMLoadFloat2()</span>`
    - `<span class="editor-theme-code">XMLoadFloat3()</span>`
    - `<span class="editor-theme-code">XMLoadFloat4()</span>`
    - `<span class="editor-theme-code">XMLoadFloat3x3()</span>`<span style="white-space: pre-wrap;"> (行列用)</span>
    - `<span class="editor-theme-code">XMLoadFloat4x4()</span>`<span style="white-space: pre-wrap;"> (行列用) これらの関数は、</span>`<span class="editor-theme-code">XMFLOAT</span>`型のデータを`<span class="editor-theme-code">XMVECTOR</span>`型（または`<span class="editor-theme-code">XMMATRIX</span>`型）にロードし、SIMD演算の準備をします。
- **`<strong class="editor-theme-bold editor-theme-code">XMVECTOR</strong>` **→** `<strong class="editor-theme-bold editor-theme-code">XMFLOAT</strong>`**:
    - `<span class="editor-theme-code">XMStoreFloat2()</span>`
    - `<span class="editor-theme-code">XMStoreFloat3()</span>`
    - `<span class="editor-theme-code">XMStoreFloat4()</span>`
    - `<span class="editor-theme-code">XMStoreFloat3x3()</span>`
    - `<span class="editor-theme-code">XMStoreFloat4x4()</span>`<span style="white-space: pre-wrap;"> これらの関数は、</span>`<span class="editor-theme-code">XMVECTOR</span>`型の計算結果を`<span class="editor-theme-code">XMFLOAT</span>`型のメモリ領域にストアします。

### まとめと推奨されるフロー

DirectXプログラミングにおける理想的なデータフローは以下のようになります。

1. ****データ格納****: オブジェクトの状態（位置、回転、色など）は、クラスや構造体のメンバとして\*\*`<span class="editor-theme-code">XMFLOAT</span>`\*\*型で保持します。
2. ****計算開始****: 計算が必要になったら、\*\*`<span class="editor-theme-code">XMLoadFloat</span>`****関数を使用して****`<span class="editor-theme-code">XMFLOAT</span>`****型のデータを****`<span class="editor-theme-code">XMVECTOR</span>`\*\*型にロードします。
3. ****計算実行****: \*\*`<span class="editor-theme-code">XMVECTOR</span>`\*\*型を使って、DirectXMathの関数（`<span class="editor-theme-code">XMVectorAdd</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">XMMatrixMultiply</span>`など）で高速なSIMD演算を行います。
4. ****計算結果の格納****: 計算が終わったら、\*\*`<span class="editor-theme-code">XMStoreFloat</span>`****関数を使用して****`<span class="editor-theme-code">XMVECTOR</span>`****型の結果を再び****`<span class="editor-theme-code">XMFLOAT</span>`\*\*型にストアし、永続化します。

# ダイアログ

## 🪟 1. ダイアログってなに？

****ダイアログ（ダイアログボックス）は、****  
****ユーザーに何かを聞いたり、設定を入力させたりするための小さなウィンドウ****です。

### 例：

- ファイルを保存するときの「名前を付けて保存」画面
- 「OK」「キャンセル」などを選ばせる小さなウィンドウ
- 設定画面（オプション、プロパティ）

---

## 🔄 2. モーダル vs モードレス

<table id="bkmrk-%E7%A8%AE%E9%A1%9E%E7%89%B9%E5%BE%B4%E4%BE%8B%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E4%BB%96%E3%81%AE%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%A7"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>種類

</th><th>特徴

</th><th>例

</th></tr><tr><td>****モーダル****

</td><td>他のウィンドウを操作できなくなる（完了するまで）

</td><td>「保存しますか？」などの確認ダイアログ

</td></tr><tr><td>****モードレス****

</td><td>他のウィンドウも同時に操作できる

</td><td>検索ウィンドウ、ツールパレット

</td></tr></tbody></table>

### 💡 イメージ

- モーダル：****呼び出した人に返事を返すまで、他は触らせない！****
- モードレス：****聞くけど、待たなくていいよ。他のことしててOK！****

---

## 📦 3. よく使われる「コントロール（部品）」

### 🟢 ボタン類

<table id="bkmrk-%E5%90%8D%E5%89%8D%E8%AA%AC%E6%98%8Ebutton%EF%BC%88%E3%83%9C%E3%82%BF%E3%83%B3%EF%BC%89%E3%80%8Cok%E3%80%8D%E3%80%8C"><colgroup><col></col><col></col></colgroup><tbody><tr><th>名前

</th><th>説明

</th></tr><tr><td>****Button（ボタン）****

</td><td>「OK」「キャンセル」など。押すと動作を実行。

</td></tr><tr><td>****CheckBox（チェックボックス）****

</td><td>ON/OFF の選択に使う。複数選択も可能。

</td></tr><tr><td>****RadioButton（ラジオボタン）****

</td><td>選択肢を1つだけ選ぶ（複数ある中で1つ）

</td></tr></tbody></table>

### 🔵 入力系

<table id="bkmrk-%E5%90%8D%E5%89%8D%E8%AA%AC%E6%98%8Eedit%EF%BC%88%E3%82%A8%E3%83%87%E3%82%A3%E3%83%83%E3%83%88%EF%BC%89%E6%96%87%E5%AD%97%E3%82%92%E5%85%A5%E5%8A%9B"><colgroup><col></col><col></col></colgroup><tbody><tr><th>名前

</th><th>説明

</th></tr><tr><td>****Edit（エディット）****

</td><td>文字を入力するテキストボックス。

</td></tr><tr><td>****ComboBox（コンボボックス）****

</td><td>リストから選ぶ＋入力もできる。

</td></tr><tr><td>****ListBox（リストボックス）****

</td><td>複数行の選択肢から選ぶ。複数選択可もあり。

</td></tr></tbody></table>

### 🟣 表示系・他

<table id="bkmrk-%E5%90%8D%E5%89%8D%E8%AA%AC%E6%98%8Estatic%EF%BC%88%E3%82%B9%E3%82%BF%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%EF%BC%89%E6%96%87%E5%AD%97"><colgroup><col></col><col></col></colgroup><tbody><tr><th>名前

</th><th>説明

</th></tr><tr><td>****Static（スタティック）****

</td><td>文字や画像を表示するだけのラベル。

</td></tr><tr><td>****GroupBox****

</td><td>コントロールをグループ化して囲む枠。

</td></tr><tr><td>****ProgressBar（プログレスバー）****

</td><td>処理の進行度を表示するバー。

</td></tr></tbody></table>

---

## 🧑‍💻 4. 実際に使うとどうなる？

### モーダルダイアログを表示するコード例（Win32 API）

```cpp
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);
```

### モードレスダイアログを表示するコード例

```cpp
CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);
ShowWindow(hDlg, SW_SHOW);
```

---

## 📌 5. まとめ

<table id="bkmrk-%E9%A0%85%E7%9B%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E8%B3%AA%E5%95%8F%E3%82%84%E6%93%8D"><colgroup><col></col><col></col></colgroup><tbody><tr><th>項目

</th><th>ポイント

</th></tr><tr><td>ダイアログ

</td><td>ユーザーに質問や操作を促す小ウィンドウ

</td></tr><tr><td>モーダル

</td><td>他の操作をブロックして返事を待つ

</td></tr><tr><td>モードレス

</td><td>他の操作もOK、自由に使える

</td></tr><tr><td>コントロール

</td><td>ボタン、入力欄、リストなど部品のこと

</td></tr></tbody></table>

---

### 🧁 もっとわかりやすく例えると…

> ダイアログは****コンビニのレジ****。  
> モーダルは「レジの人が“お会計終わるまで商品戻してね”って止める」状態。  
> モードレスは「セルフレジ。会計しながら他の人も動ける」状態です。