アナログ時計の作成

今回は、Direct2D および Windows Imaging Component(WIC)を使用した PNG をリソースに組み込む方法でアナログ時計の作成をします。

プロジェクトファイルの作成
空のプロジェクトをクリックして下さい。

空のプロジェクトを選択後、「名前(N)」を入力して、「OK」をクリックしてください。(例:AnalogClock)

ソースファイルを右クリックして、「追加(D)」「新しい項目(W)」を選択クリックしてください。

項目から「C++ ファイル(.cpp)」を選択して、「名前(N)」を入力後、「追加(A)」をクリックしてください。(例:Source)

WNDCLASSEX 構造体
ウィンドウ クラス情報を格納します。これは、RegisterClassEx および GetClassInfoEx 関数と共に使用されます。

WNDCLASSEX 構造体は、WNDCLASS 構造体に似ています。2 つの違いがあります。WNDCLASSEX には、構造体のサイズを指定する cbSize メンバと、ウィンドウクラスに関連付けられた小さいアイコンへのハンドルを含む hIconSm メンバが含まれています。
typedef struct tagWNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX, *NPWNDCLASSEX, *LPWNDCLASSEX;

メンバ

cbSize

この構造体のサイズ(バイト単位)。このメンバを sizeof (WNDCLASSEX) に設定します。GetClassInfoEx 関数を呼び出す前に、このメンバを設定してください。

style

クラス スタイル。このメンバは、クラス スタイル の任意の組み合わせにできます。

lpfnWndProc

ウィンドウプロシージャへのポインタ。ウィンドウプロシージャを呼び出すために、CallWindowProc 関数を使用する必要があります。詳細については、WindowProc を参照してください。

cbClsExtra

ウィンドウクラス構造体の後に割り当てる追加のバイト数。システムはバイトを 0 に初期化します。

cbWndExtra

ウィンドウインスタンスの後に割り当てる追加バイト数。システムはバイトを 0 に初期化します。アプリケーションが WNDCLASSEX を使用して、リソース ファイル内の CLASS ディレクティブを使用して作成されたダイアログ ボックスを登録する場合は、このメンバを DLGWINDOWEXTRA に設定する必要があります。

hInstance

クラスのウィンドウプロシージャを含むインスタンスへのハンドル。

hIcon

クラスアイコンへのハンドル。このメンバは、アイコンリソースへのハンドルである必要があります。このメンバが NULL の場合、システムは既定のアイコンを提供します。

hCursor

クラスカーソルへのハンドル。このメンバは、カーソルリソースへのハンドルでなければなりません。このメンバが NULL の場合、アプリケーションは、マウスがアプリケーションのウィンドウに移動するたびに、カーソルの形状を明示的に設定する必要があります。

hbrBackground

クラスの背景ブラシへのハンドル。このメンバは、背景の描画に使用するブラシへのハンドルを指定することも、カラー値にすることもできます。色の値は、次の標準システムカラーのいずれかである必要があります(値 1 を選択した色に追加する必要があります)。カラー値を指定する場合は、次の HBRUSH 型のいずれかに変換する必要があります。
  • COLOR_ACTIVEBORDER
  • COLOR_ACTIVECAPTION
  • COLOR_APPWORKSPACE
  • COLOR_BACKGROUND
  • COLOR_BTNFACE
  • COLOR_BTNSHADOW
  • COLOR_BTNTEXT
  • COLOR_CAPTIONTEXT
  • COLOR_GRAYTEXT
  • COLOR_HIGHLIGHT
  • COLOR_HIGHLIGHTTEXT
  • COLOR_INACTIVEBORDER
  • COLOR_INACTIVECAPTION
  • COLOR_MENU
  • COLOR_MENUTEXT
  • COLOR_SCROLLBAR
  • COLOR_WINDOW
  • COLOR_WINDOWFRAME
  • COLOR_WINDOWTEXT
クラスが UnregisterClass を使用して登録解除されると、システムはクラスの背景ブラシを自動的に削除します。アプリケーションは、これらのブラシを削除しないでください。

このメンバが NULL の場合、アプリケーションは、クライアント領域で描画を要求されたときに、独自の背景を描画する必要があります。背景を描画する必要があるかどうかを判断するには、アプリケーションは、WM_ERASEBKGND メッセージを処理するか、BeginPaint 関数で埋め込まれた PAINTSTRUCT 構造体の fErase メンバをテストします。

lpszMenuName

名前がリソースファイルに表示されるクラスメニューのリソース名を指定する、null で終わる文字列へのポインタ。整数を使用してメニューを識別する場合は、MAKEINTRESOURCE マクロを使用します。このメンバが NULL の場合、このクラスに属するウィンドウには既定のメニューはありません。

lpszClassName

null で終わる文字列へのポインタ、またはアトムです。このパラメータがアトムである場合は、RegisterClass 関数または RegisterClassEx 関数の前の呼び出しによって作成されたクラスアトムである必要があります。アトムは、下位ワードの中にある必要があります。上位ワードは 0 でなければなりません。

lpszClassName が文字列の場合は、ウィンドウ クラス名を指定します。クラス名は、RegisterClass または RegisterClassEx に登録された任意の名前、または定義済みのコントロールクラス名のいずれかです。

lpszClassName の最大長は 256 です。lpszClassName が最大長より大きい場合、RegisterClassEx 関数は失敗します。

hIconSm

ウィンドウクラスに関連付けられている小さいアイコンへのハンドル。このメンバが NULL の場合、システムは、小さいアイコンとして使用する適切なサイズのアイコンを hIcon メンバによって指定されたアイコンリソースを検索します。

解説

! 注意

winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして WNDCLASSEX を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

RegisterClassEx 関数
CreateWindow 関数または CreateWindowEx 関数の呼び出しで後で使用するウィンドウクラスを登録します。
ATOM RegisterClassEx(
const WNDCLASSEX *Arg1 // クラスデータ
);

パラメータ

Arg1

WNDCLASSEX 構造体へのポインタ。関数に渡す前に、構造体に適切なクラス属性を設定する必要があります。

戻り値

関数が成功した場合、戻り値は登録されるクラスを一意に識別するクラスアトムです。このアトムは、CreateWindowCreateWindowExGetClassInfoGetClassInfoExFindWindowFindWindowEx、および UnregisterClass 関数と IActiveIMMap::FilterClientWindows メソッドでのみ使用できます。

関数が失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説

RegisterClassExA を使用してウィンドウ クラスを登録すると、作成されたクラスのウィンドウが ANSI 文字セットを使用するテキストまたは文字パラメーターを持つメッセージを期待していることをシステムに通知します。RegisterClassExW を使用して登録すると、アプリケーションは、システムがメッセージのテキスト パラメータを Unicode として渡すように要求します。IsWindowUnicode 関数を使用すると、アプリケーションは各ウィンドウの性質を照会できます。ANSI 関数と Unicode 関数の詳細については、Conventions for Function Prototypes を参照してください。

アプリケーションが登録するすべてのウィンドウ クラスは、終了時に登録解除されます。

DLL がアンロードされるときに、DLL によって登録されたウィンドウ クラスは登録解除されません。DLL は、アンロード時に明示的にクラスの登録を解除する必要があります。

! 注意

winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして RegisterClassEx を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

MONITORINFO 構造体
‎‎MONITORINFO‎‎ 構造体には、ディスプレイモニターに関する情報が含まれています。

‎‎‎GetMonitorInfo 関数は、‎‎情報を MONITORINFO 構造体または ‎‎MONITORINFOEX 構造体に格納します。‎

MONITORINFOEX 構造体は、‎‎MONITORINFO 構造体のサブセットです。

‎‎MONITORINFOEX 構造体‎‎は、表示モニターの名前を含む文字列メンバを追加します。‎‎
typedef struct tagMONITORINFO {
  DWORD cbSize;
  RECT  rcMonitor;
  RECT  rcWork;
  DWORD dwFlags;
} MONITORINFO, *LPMONITORINFO;

メンバ

cbSize

この構造体のサイズ(バイト単位)。‎

GetMonitorInfo 関数‎‎を呼び出す前に、このメンバを sizeof ( MONITORINFO ) に設定します。これにより、関数は、渡す構造体の型を決定できます。

rcMonitor

‎‎ディスプレイモニタの四角形を指定する‎‎ RECT ‎‎構造体。モニタがプライマリディスプレイモニタでない場合、長方形の座標の一部が負の値になることがあります。‎

rcWork

‎‎ディスプレイ モニタの作業領域の四角形を指定する ‎‎RECT ‎‎構造体。モニタがプライマリディスプレイモニタでない場合、長方形の座標の一部が負の値になることがあります。‎‎

dwFlags

‎‎表示モニターの属性を表すフラグのセット。‎

次のフラグが定義されています。‎

‎意味‎
MONITORINFOF_PRIMARY‎これがプライマリディスプレイモニタです。‎

必要条件

ヘッダ: winuser.h( Windows.h を含む )

MonitorFromPoint 関数
‎‎MonitorFromPoint ‎関数‎‎は、指定したポイントを含むディスプレイ モニターへのハンドルを取得します。‎
HMONITOR MonitorFromPoint(
  POINT pt,
  DWORD dwFlags
);

パラメータ

pt

‎‎‎仮想画面座標の対象点を指定する‎‎ POINT‎‎ 構造体。‎

dwFlags

‎‎‎ポイントがディスプレイモニタ内に含まれていない場合に、関数の戻り値を決定します。

‎このパラメータは、次のいずれかの値になります。

‎意味‎
MONITOR_DEFAULTTONEAREST‎‎ポイントに最も近いディスプレイ モニタへのハンドルを返します。‎‎
MONITOR_DEFAULTTONULL‎‎NULL を‎‎返します。‎
MONITOR_DEFAULTTOPRIMARY‎‎プライマリディスプレイモニタへのハンドルを返します。‎

戻り値

‎ポイントがディスプレイモニターに含まれている場合、戻り値はそのディスプレイモニターに対する‎‎ HMONITOR ‎‎ハンドルです。‎

ポイントがディスプレイモニタに含まれていない場合、戻り値は ‎‎dwFlags‎‎ の値によって異なります。‎

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

GetMonitorInfo 関数
‎‎GetMonitorInfo 関数‎‎は‎‎、ディスプレイモニターに関する情報を取得します。‎‎
BOOL GetMonitorInfo(
  HMONITOR      hMonitor,
  LPMONITORINFO lpmi
);

パラメータ

hMonitor

‎‎対象のディスプレイ モニタへのハンドル。‎

lpmi

‎‎指定されたディスプレイモニターに関する情報を受け取る‎‎ ‎‎MONITORINFO または‎‎ MONITORINFOEX ‎‎構造体へのポインタ。‎

GetMonitorInfo 関数を‎‎呼び出す前に、構造体の ‎‎cbSize‎‎ メンバを sizeof (MONITORINFO) または sizeof (MONITORINFOEX) に設定する必要があります。これにより、関数は、渡す構造体の型を決定できます。‎

MONITORINFOEX 構造体‎‎は、‎‎‎‎MONITORINFO 構造体のスーパーセットです。このメンバには、ディスプレイ モニタの名前を含む文字列という 1 つの追加メンバがあります。ほとんどのアプリケーションはディスプレイモニター名を使用しないので‎‎、MONITORINFO‎‎ 構造体を使用して一部のバイトを節約できます。‎‎

戻り値

‎‎関数が成功した場合、戻り値は 0 以外になります。‎

関数が失敗した場合、戻り値は 0 です。‎

解説

! 注意

winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetMonitorInfo を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

APPBARDATA 構造体
‎システムアプリバーメッセージに関する情報が含まれます。‎
typedef struct _AppBarData {
  DWORD  cbSize;
  HWND   hWnd;
  UINT   uCallbackMessage;
  UINT   uEdge;
  RECT   rc;
  LPARAM lParam;
} APPBARDATA, *PAPPBARDATA;

メンバ

cbSize

この構造体のサイズ(バイト単位)。

hWnd

‎アプリバーウィンドウへのハンドル。すべてのメッセージがこのメンバを使用しているわけではありません。‎‎hWind ‎‎値を指定する必要があるかどうかを確認するには、個々のメッセージ ページを参照してください。‎

uCallbackMessage

‎アプリケーション定義のメッセージ識別子。アプリケーションは‎‎、hWnd‎‎ メンバによって識別されるアプリバーに送信する通知メッセージに対して、指定された識別子を使用します。このメンバは‎‎、ABM_NEW ‎‎メッセージを送信するときに使用されます。‎

uEdge

‎画面の端を指定する値。このメンバーは、以下のいずれかのメッセージを送信するときに使用されます。
  • ABM_GETAUTOHIDEBAR
  • ABM_SETAUTOHIDEBAR
  • ABM_GETAUTOHIDEBAREX
  • ABM_SETAUTOHIDEBAREX
  • ABM_QUERYPOS
  • ABM_SETPOS
‎このメンバは、次のいずれかの値になります。

ABE_BOTTOM
‎下端。‎

ABE_LEFT
‎左端。

ABE_RIGHT
‎右端。‎

ABE_TOP
‎上端。‎

rc

‎メッセージによって使用が異なる‎‎ RECT‎‎ 構造体。
  • ‎‎ABM_GETTASKBARPOS‎‎、 ‎‎ABM_QUERYPOS‎‎、 ‎‎ABM_SETPOS‎‎: アプリバーまたは Windows タスクバーの外接する四角形(画面座標)です。
  • ABM_GETAUTOHIDEBAREX‎‎‎‎ABM_SETAUTOHIDEBAREX‎‎: 操作を実行するモニタ。この情報は‎‎、GetMonitorInfo ‎‎関数を使用して取得できます。‎

lParam

‎メッセージに依存する値。このメンバは、次のメッセージで使用されます。
  • ‎ABM_SETAUTOHIDEBAR
  • ABM_SETAUTOHIDEBAREX
  • ABM_SETSTATE
‎詳細については、個々のメッセージページを参照してください。

必要条件

ヘッダ: shellapi.h( Windows.h を含む )

SHAppBarMessage 関数
‎アプリバーメッセージをシステムに送信します。‎
UINT_PTR SHAppBarMessage(
  DWORD       dwMessage,
  PAPPBARDATA pData
);

パラメータ

dwMessage

‎送信するアプリバーメッセージの値。このパラメータは、次のいずれかの値になります。

ABM_NEW (0x00000000)
‎新しいアプリ バーを登録し、通知メッセージをアプリ バーに送信するためにシステムが使用するメッセージ識別子を指定します。

ABM_REMOVE (0x00000001)
‎アプリ バーの登録を解除し、システムの内部リストからバーを削除します。

ABM_QUERYPOS (0x00000002)
‎アプリ バーのサイズと画面位置を要求します。

ABM_SETPOS (0x00000003)
‎アプリバーのサイズと画面位置を設定します。

ABM_GETSTATE (0x00000004)
‎Windows タスク バーの自動非表示状態と常時オントップ状態を取得します。

ABM_GETTASKBARPOS (0x00000005)
‎Windows タスクバーの外接する四角形を取得します。これはシステムタスクバーにのみ適用されます。他のオブジェクト、特にサードパーティ製ソフトウェアに付属するツールバーも存在できます。その結果、Windows タスクバーでカバーされていない画面領域の一部がユーザーに表示されないことがあります。タスクバーと他のアプリバー(アプリケーションで使用できる作業領域)の両方でカバーされていない画面の領域を取得するには‎‎、GetMonitorInfo‎‎ 関数を使用します。‎

ABM_ACTIVATE (0x00000006)
‎アプリバーをアクティブまたは非アクティブ化するようにシステムに通知します。‎‎pData ‎‎が指す APPBARDATA ‎‎の‎‎ lParam‎‎ メンバは‎‎ TRUE‎‎ に設定され、アクティブ化され‎‎、FALSE を指定‎‎すると非アクティブ化されます。‎

ABM_GETAUTOHIDEBAR (0x00000007)
‎画面の特定の端に関連付けられている自動非表示のアプリバーへのハンドルを取得します。

ABM_SETAUTOHIDEBAR (0x00000008)
‎画面の端に自動非表示のアプリバーを登録または登録解除します。‎

ABM_WINDOWPOSCHANGED (0x00000009)
‎アプリ バーの位置が変更されたときにシステムに通知します。‎

ABM_SETSTATE (0x0000000A)
Windows XP 以降: ‎‎アプリバーの自動非表示属性と常時オントップ属性の状態を設定します。‎

ABM_GETAUTOHIDEBAREX (0x0000000B)
Windows XP 以降:‎‎ 特定のモニターの特定のエッジに関連付けられている自動非表示のアプリ バーへのハンドルを取得します。‎

ABM_SETAUTOHIDEBAREX (0x0000000C)
Windows XP 以降:‎‎ 特定のモニターの端に対して、自動非表示のアプリバーを登録または登録解除します。‎

pData

‎構造体‎‎へのポインタ。入り口時および終了時の構造体の内容は‎‎、dwMessage ‎‎パラメータに設定された値によって異なります。詳細については、個々のメッセージページを参照してください。‎

戻り値

‎この関数は、メッセージに依存する値を返します。詳細については、特定のアプリバーメッセージが送信される Windows SDK のドキュメントを参照してください。これらのドキュメントへのリンクは、[参照] セクションにあります。‎

必要条件

ヘッダ: shellapi.h

ABM_NEW メッセージ
‎新しいアプリバーを登録し、通知メッセージの送信にシステムが使用するメッセージ識別子を指定します。アプリバーは、他のアプリバーメッセージを送信する前に、このメッセージを送信する必要があります。‎‎‎
fRegistered = (BOOL) SHAppBarMessage(ABM_NEW, pabd);

パラメータ

pabd

‎‎新しいアプリバーのウィンドウハンドルとメッセージ識別子を含む ‎‎‎‎APPBARDATA‎‎ 構造体へのポインタ。このメッセージを送信する場合は‎‎、cbSize‎‎‎‎、hWnd‎‎、‎‎および uCallbackMessage‎‎ メンバを指定する必要があります。他のメンバーはすべて無視されます。‎‎‎

戻り値

‎正常に終了した場合は‎‎ TRUE ‎‎を返し、エラーが発生した場合、またはアプリ バーが既に登録されている場合は‎‎FALSE ‎‎を返します。‎‎

必要条件

ヘッダ: Shellapi.h

ABM_REMOVE メッセージ
‎‎アプリバーをシステムの内部リストから削除して登録を解除します。システムがアプリバーに通知メッセージを送信したり、他のアプリケーションがアプリバーで使用する画面領域を使用できないようにするようになりました。‎‎
                SHAppBarMessage(ABM_REMOVE, pabd);

パラメータ

pabd

‎登録を解除するアプリバーへのハンドルを含む‎‎ ‎‎APPBARDATA‎‎ 構造体へのポインタ。このメッセージを送信する場合は‎‎、cbSize ‎‎および‎‎ hWnd‎‎ メンバを指定する必要があります。他のメンバはすべて無視されます。‎‎

戻り値

‎‎常に ‎‎TRUE を‎‎返します。‎

解説

‎このメッセージにより、システムは‎‎ ABN_POSCHANGED‎‎ 通知メッセージをすべての アプリバーに送信します。‎

必要条件

ヘッダ: Shellapi.h

ABN_POSCHANGED メッセージ
‎‎‎アプリ バーのサイズと位置に影響を与える可能性があるイベントが発生したときに、アプリ バーに通知します。イベントには、タスク バーのサイズ、位置、および表示状態の変更、および画面の同じ側にある別のアプリ バーの追加、削除、またはサイズ変更が含まれます。‎‎‎
ABN_POSCHANGED

パラメータ

‎このメッセージにはパラメータがありません。‎

戻り値

‎‎‎戻り値がありません。‎

解説

‎‎アプリ バーは‎‎、ABM_QUERYPOS ‎‎および‎‎ ABM_SETPOS ‎‎メッセージを送信して、この通知メッセージに応答する必要があります。位置が変更された場合、アプリバーは‎‎ MoveWindow‎‎ 関数を呼び出して、新しい位置に移動する必要があります。‎‎

必要条件

ヘッダ: Shellapi.h

UpdateWindow 関数
UpdateWindow 関数は、ウィンドウの更新領域が空でない場合、ウィンドウに WM_PAINT メッセージを送信することによって、指定されたウィンドウのクライアント領域を更新します。この関数は、指定されたウィンドウのウィンドウ プロシージャに WM_PAINT メッセージを直接送信し、アプリケーションキューをバイパスします。更新領域が空の場合、メッセージは送信されません。
BOOL UpdateWindow(
HWND hWnd // ウィンドウのハンドル
);

パラメータ

hWnd

更新するウィンドウへのハンドル。

戻り値

関数が成功した場合、戻り値は 0 以外になります。

関数が失敗した場合、戻り値は 0 です。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

WM_CREATE メッセージ
アプリケーションが、CreateWindowEx または CreateWindow 関数を呼び出すことによって、ウィンドウを作成することを要求したときに送信されます。(メッセージは、関数が戻る前に送信されます。) 新しいウィンドウのウィンドウ プロシージャは、ウィンドウの作成、ウィンドウが表示される前にこのメッセージを受け取ります。

ウィンドウは、WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_CREATE                       0x0001

パラメータ

wParam

このパラメータは使用されません。

lParam

作成されるウィンドウに関する情報を含む CREATESTRUCT 構造体へのポインタ。

戻り値

アプリケーションがこのメッセージを処理する場合、ウィンドウの作成を続行するには、0 を返す必要があります。アプリケーションが -1 を返した場合、ウィンドウが破壊され、、CreateWindowEx または CreateWindow 関数は、NULL ハンドルを返します。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

DwmExtendFrameIntoClientArea 関数
ウィンドウフレームをクライアント領域に拡張します。
DWMAPI DwmExtendFrameIntoClientArea(
HWND hWnd,
const MARGINS *pMarInset
);

パラメータ

hWnd

フレームがクライアント領域に拡張されるウィンドウへのハンドル。

pMarInset

フレームをクライアント領域に拡張するときに使用する余白を記述する MARGINS 構造体へのポインタ。

戻り値

この関数が成功すると、S_OK 返します。それ以外の場合は、HRESULT エラー コードを返します。

解説

この関数は、デスクトップウィンドウマネージャ(DWM)の構成が切り替えられるたびに呼び出す必要があります。コンポジション変更通知の WM_DWMCOMPOSITIONCHANGED メッセージを処理します。

負の余白値を使用して、クライアント領域がウィンドウ境界のないソリッドサーフェスとしてレンダリングされる「ガラスシート」効果を作成します。



HRESULT ExtendIntoClientBottom(HWND hwnd)
{
// 余白を設定し、下余白を延長する
MARGINS margins = {0,0,0,25};
HRESULT hr = S_OK;

// クライアント領域の下部にフレームを拡張する
hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
if (SUCCEEDED(hr))
{
// ...
}
return hr;
}
次のサンプルは、ウィンドウの境界線なしでクライアント領域がレンダリングされる「ガラスシート」効果を示しています。
HRESULT ExtendIntoClientAll(HWND hwnd)
{
// 負のマージンは、DwmExtendFrameIntoClientArea に特別な意味を持ちます。
// 負のマージンは、「ガラスシート」効果を作成し、クライアント領域は、
// ウィンドウの境界線のないソリッドサーフェスとしてレンダリングされます。
MARGINS margins = {-1};
HRESULT hr = S_OK;

// ウィンドウ全体にフレームを拡張します。
hr = DwmExtendFrameIntoClientArea(hwnd,&margins);
if (SUCCEEDED(hr))
{
// ...
}
return hr;
}

必要条件

ヘッダ: dwmapi.h
ライブラリ: Dwmapi.lib

MARGINS 構造体
表示スタイルが適用されているウィンドウの余白を定義するために GetThemeMargins 関数によって返されます。
typedef struct _MARGINS {
int cxLeftWidth;
int cxRightWidth;
int cyTopHeight;
int cyBottomHeight;
} MARGINS, *PMARGINS;

メンバ

cxLeftWidth

サイズを保持する左の境界線の幅。

cxRightWidth

サイズを保持する右の境界線の幅。

cyTopHeight

サイズを保持する上部の境界線の高さ。

cyBottomHeight

サイズを保持する下部の境界線の高さ。

必要条件

ヘッダ: uxtheme.h

WM_NCLBUTTONDOWN メッセージ
カーソルがウィンドウの非クライアント領域内にあるときに、ユーザーがマウスの左ボタンを押したときにポストされます。このメッセージは、カーソルを含むウィンドウにポストされます。ウィンドウがマウスをキャプチャした場合、このメッセージはポストされません。

ウィンドウは、 WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_NCLBUTTONDOWN                  0x00A1

パラメータ

wParam

WM_NCHITTEST メッセージを処理した結果として DefWindowProc 関数によって返されるヒットテスト値。ヒットテスト値の一覧については、WM_NCHITTEST を参照してください。

lParam

カーソルの x 座標と y 座標を含む POINTS 構造体。座標は画面の左上隅を基準にしています。

戻り値

アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。

解説

DefWindowProc 関数は、指定されたポイントをテストしてカーソルの位置を見つけ、適切なアクションを実行します。必要に応じて、defWindowProc は、WM_SYSCOMMAND メッセージをウィンドウに送信します。また、GET_X_LPARAMGET_Y_LPARAM マクロを使用して、lParam から x 座標と y 座標の値を抽出することもできます。
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
ix 重要

これらのマクロは複数のモニターを持つシステムで誤った結果を返すため、LOWORD または HIWORD マクロを使用してカーソル位置の x 座標と y 座標を抽出しないでください。複数のモニタを搭載したシステムは負の x 座標と y 座標を持ち、LOWORDHIWORD は座標を符号なしの量として扱います。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

WM_NCHITTEST メッセージ
ウィンドウのどの部分が特定の画面座標に対応するかを決定するために、ウィンドウに送信されます。これは、カーソルが移動したとき、マウスボタンが押されたときまたは離されたとき、または WindowFromPoint などの関数への呼び出しに応答して発生する場合があります。マウスがキャプチャされていない場合、メッセージはカーソルの下のウィンドウに送信されます。それ以外の場合、メッセージはマウスをキャプチャしたウィンドウに送信されます。

ウィンドウは、 WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_ NCHITTEST                 0x0084

パラメータ

wParam

このパラメータは使用されません。

lParam

下位ワードは、カーソルの x 座標を指定します。座標は、クライアント領域の左上隅を基準とします。

上位ワードは、カーソルの y 座標を指定します。座標は、クライアント領域の左上隅を基準とします。

戻り値

DefWindowProc 関数の戻り値は、カーソルのホットスポットの位置を示す次のいずれかの値です。

戻りコード/値説明
HTBORDER
18
サイズ変更枠のないウィンドウの枠内。
HTBOTTOM
15
サイズ変更可能なウィンドウの下側の境界線(ユーザーはマウスをクリックしてウィンドウを垂直方向にサイズ変更できます)。
HTBOTTOMLEFT
16
サイズ変更可能なウィンドウの境界の左下隅(ユーザーはマウスをクリックしてウィンドウを斜めにサイズ変更できます)。
HTBOTTOMRIGHT
17
サイズ変更可能なウィンドウの境界の右下隅(ユーザーはマウスをクリックしてウィンドウを斜めにサイズ変更できます)。
HTCAPTION
2
タイトルバー。
HTCLIENT
1
クライアント領域。
HTCLOSE
20
閉じる ボタン。
HTERROR
-2
画面の背景上またはウィンドウ間の境界線上(HTNOWHERE と同じですが、DefWindowProc 関数がシステムのビープ音を発してエラーを示す点が異なります)。
HTGROWBOX
4
サイズボックス(HTSIZE と同じ)。
HTHELP
21
ヘルプ ボタン。
HTHSCROLL
6
水平スクロールバー。
HTLEFT
10
サイズ変更可能なウィンドウの左側の境界線(ユーザーはマウスをクリックしてウィンドウを水平方向にサイズ変更できます)。
HTMENU
メニュー。
HTMAXBUTTON
9
最大化 ボタン。
HTMINBUTTON
8
最小化 ボタン。
HTNOWHERE
0
画面の背景またはウィンドウ間の分割線上。
HTREDUCE
8
最小化 ボタン。
HTRIGHT
11
サイズ変更可能なウィンドウの右側の境界線(ユーザーはマウスをクリックしてウィンドウを水平方向にサイズ変更できます)。
HTSIZE
サイズボックス(HTGROWBOX と同じ)。
HTSYSMENU
ウィンドウメニューまたは子ウィンドウの 閉じる ボタン。
HTTOP
12
ウィンドウの水平方向の境界線。
HTTOPLEFT
13
ウィンドウ境界の左上隅。
HTTOPRIGHT
14
最大化ボタン。
HTTRANSPARENT
-1
同じスレッド内の別のウィンドウによって現在カバーされているウィンドウ内(メッセージの1つが HTTRANSPARENT ではないコードを返すまで、メッセージは同じスレッド内の基になるウィンドウに送信されます)。
HTVSCROLL
7
垂直スクロールバー。
HTZOOM
9
ウィンドウ境界の左上隅。

解説

水平位置と垂直位置を取得するには、次のコードを使用します。
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
上で説明したように、x 座標は戻り値の下位の short、y 座標は、上位の short(複数のモニターを持つシステムで負の値を取ることができるので、どちらも符号付きの値を表します)にあります。戻り値が変数に割り当てられている場合は、MAKEPOINTS マクロを使用して、戻り値から POINTS 構造体を取得できます。GET_X_LPARAM または GET_Y_LPARAM マクロを使用して、x 座標または y 座標を抽出することもできます。

ix 重要

これらのマクロは複数のモニターを持つシステムで誤った結果を返すため、LOWORD または HIWORD マクロを使用してカーソル位置の x 座標と y 座標を抽出しないでください。複数のモニタを搭載したシステムは負の x 座標と y 座標を持ち、LOWORDHIWORD は座標を符号なしの量として扱います。

Windows Vista: 標準のキャプションボタンを含むカスタムフレームを作成する場合、このメッセージはまず DwmDefWindowProc 関数に渡す必要があります。これにより、デスクトップウィンドウマネージャー(DWM)は、キャプションボタンのヒットテストを提供します。DwmDefWindowProc がメッセージを処理しない場合は、WM_NCHITTEST の処理が必要になる場合があります。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

WM_RBUTTONDOWN メッセージ
カーソルがウィンドウのクライアント領域にあるときに、ユーザーがマウスの右ボタンを押したときにポストされます。マウスがキャプチャされていない場合、メッセージはカーソルの下のウィンドウにポストされます。それ以外の場合は、メッセージがマウスをキャプチャしたウィンドウにポストされます。

ウィンドウは、その WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_RBUTTONDOWN                  0x0204

パラメータ

wParam

さまざまな仮想キーがダウンしているかどうかを示します。このパラメーターには、次の値の1つ以上を指定できます。

意味
MK_CONTROL
0x0008
Ctrlキーが押されています。
MK_LBUTTON
0x0001
マウスの左ボタンが押されています。
MK_MBUTTON
0x0010
マウスの中央ボタンが押されています。
MK_RBUTTON
0x0002
マウスの右ボタンが押されています。
MK_SHIFT
0x0004
Shiftキーが押されています。
MK_XBUTTON1
0x0020
1 番目の X ボタンが押されています。
MK_XBUTTON2
0x0040
2 番目の X ボタンが押されています。

lParam

下位ワードは、カーソルの x 座標を指定します。座標は、クライアント領域の左上隅を基準とします。

上位ワードは、カーソルの y 座標を指定します。座標は、クライアント領域の左上隅を基準とします。

戻り値

アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。

解説

水平方向と垂直方向の位置を取得するには、次のコードを使用します。
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
上で説明したように、x 座標は戻り値の下位の short、y 座標は、上位の short(複数のモニターを持つシステムで負の値を取ることができるので、どちらも符号付きの値を表します)にあります。戻り値が変数に割り当てられている場合は、MAKEPOINTS マクロを使用して、戻り値から POINTS 構造体を取得できます。GET_X_LPARAM または GET_Y_LPARAM マクロを使用して、x 座標または y 座標を抽出することもできます。

ix 重要

これらのマクロは複数のモニターを持つシステムで誤った結果を返すため、LOWORD または HIWORD マクロを使用してカーソル位置の x 座標と y 座標を抽出しないでください。複数のモニタを搭載したシステムは負の x 座標と y 座標を持ち、LOWORDHIWORD は座標を符号なしの量として扱います。

Alt キーが押されたことを検出するには、VK_MENU < 0 かどうかを GetKeyState で確認します。これは GetAsyncKeyState であってはならないことに注意してください。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

ClientToScreen 関数
ClientToScreen 関数は、指定したポイントのクライアント領域座標をスクリーン座標に変換します。
 BOOL ClientToScreen(
HWND hWnd,
LPPOINT lpPoint);

パラメータ

hWnd

変換に使用されるクライアント領域を持つウィンドウへのハンドル。

lpPoint

変換するクライアント座標を格納する POINT 構造体へのポインタ。関数が成功すると、新しいスクリーン座標がこの構造体にコピーされます。

戻り値

関数が成功した場合、戻り値は 0 以外になります。

関数が失敗した場合、戻り値は 0 です。

解説

ClientToScreen 関数は、POINT 構造体のクライアント領域座標をスクリーン座標に置き換えます。スクリーン座標は、画面の左上隅を基準にしています。ウィンドウのクライアント領域の上にあるスクリーン座標点は、負の y 座標です。同様に、クライアント領域の左側にあるスクリーン座標は負の x 座標です。

すべての座標はデバイス座標です。

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

LoadMenu 関数
アプリケーションインスタンスに関連付けられている実行可能(.exe)ファイルから、指定されたメニューリソースを読み込みます。
HMENU LoadMenu(
HINSTANCE hInstance,
LPCSTR lpMenuName
);

パラメータ

hInstance

読み込まれるメニュー リソースを含むモジュールへのハンドル。

lpMenuName

メニューリソースの名前。あるいは、このパラメータは、下位ワードのリソース ID と上位ワードの 0 で構成できます。この値を作成するには、MAKEINTRESOURCE マクロを使用します。

戻り値

関数が成功した場合、戻り値はメニューリソースへのハンドルになります。

関数が失敗した場合、戻り値は NULL です。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説

DestroyMenu 関数は、アプリケーションが終了する前に、読み込まれたメニューが占めるメニューと空きメモリを破棄するために使用されます。

! 注意

winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして LoadMenu を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

必要条件

ヘッダ: winuser.h ( Windowsx.h をインクルード )

GetSubMenu 関数
指定したメニュー項目によってアクティブ化されたドロップダウンメニューまたはサブメニューへのハンドルを取得します。
HMENU GetSubMenu(
HMENU hMenu,
int nPos
);

パラメータ

hMenu

メニューへのハンドル。

nPos

ドロップダウンメニューまたはサブメニューをアクティブにする項目の指定されたメニュー内の 0 から始まる相対位置。

戻り値

関数が成功した場合、戻り値はメニュー項目によってアクティブ化されたドロップダウンメニューまたはサブメニューへのハンドルになります。メニュー項目がドロップダウンメニューまたはサブメニューをアクティブにしていない場合、戻り値は NULL になります。

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

TrackPopupMenu 関数
指定した位置にショートカットメニューを表示し、メニュー上の項目の選択を追跡します。ショートカットメニューはスクリーン上の任意の場所に表示できます。
BOOL TrackPopupMenu(
HMENU hMenu,
UINT uFlags,
int x,
int y,
int nReserved,
HWND hWnd,
const RECT *prcRect
);

パラメータ

hMenu

表示するショートカットメニューへのハンドル。このハンドルは、CreatePopupMenu を呼び出して新しいショートカットメニューを作成するか、既存のメニュー項目に関連付けられたサブメニューへのハンドルを取得する GetSubMenu を呼び出すことによって取得できます。

uFlags

関数オプションを指定するには、これらのフラグの 0 以上を使用します。

次のフラグのいずれかを使用して、関数がショートカットメニューを水平方向に配置する方法を指定します。

意味
TPM_CENTERALIGN
0x0004L
x パラメータで指定した座標を基準に、ショートカットメニューを水平方向に中央揃えします。
TPM_LEFTALIGN
0x0000L
ショートカットメニューを、x パラメータで指定した座標に左揃えになるように配置します。
TPM_RIGHTALIGN
0x0008L
ショートカットメニューを、x パラメータで指定した座標に右揃えになるように配置します。

次のフラグのいずれかを使用して、ショートカット メニューを垂直方向に配置する方法を指定します。

意味
TPM_BOTTOMALIGN
0x0020L
ショートカットメニューを、y パラメータで指定した座標に下側が揃うように配置します。
TPM_TOPALIGN
0x0000L
ショートカットメニューを、y パラメータで指定した座標に上端が揃うように配置します。
TPM_VCENTERALIGN
0x0010L
y パラメータで指定した座標に対して、ショートカット メニューを垂直方向に中央揃えします。

メニューの親ウィンドウを設定せずに、ユーザー選択の検出を制御するには、次のフラグを使用します。

意味
TPM_NONOTIFY
0x0080L
ユーザーがメニュー項目をクリックしても、この関数は通知メッセージを送信しません。
TPM_RETURNCMD
0x0100L
この関数は、戻り値でユーザーが選択したメニュー項目識別子を返します。

ショートカットメニューで追跡するマウスボタンを指定するには、次のいずれかのフラグを使用します。

意味
TPM_LEFTBUTTON
0x0000L
ユーザーは、マウスの左ボタンだけでメニュー項目を選択できます。
TPM_RIGHTBUTTON
0x0002L
ユーザーは、マウスの左右の両方のボタンでメニュー項目を選択できます。

メニューのアニメーションを変更するには、次のフラグを適切に組み合わせて使用します。たとえば、水平フラグと垂直フラグを選択すると、斜めのアニメーションを作成できます。

意味
TPM_HORNEGANIMATION
0x0800L
メニューを右から左にアニメーション化します。
TPM_HORPOSANIMATION
0x0400L
メニューを左から右にアニメーション化します。
TPM_NOANIMATION
0x4000L
アニメーションなしでメニューを表示します。
TPM_VERNEGANIMATION
0x2000L
メニューを下から上にアニメーション化します。
TPM_VERPOSANIMATION
0x1000L
メニューを上から下にアニメーション化します。

アニメーションを発生させるには、SystemParametersInfo 関数で SPI_SETMENUANIMATION を設定する必要があります。 また、メニューフェードアニメーションがオンの場合、TPM_NOANIMATION を除くすべての TPM_ * ANIMATION フラグは無視されます。 詳細については、SystemParametersInfoSPI_GETMENUFADE フラグを参照してください。

TPM_RECURSE フラグを使用して、別のメニューがすでに表示されているときにメニューを表示します。 これは、メニュー内のコンテキストメニューをサポートすることを目的としています。

右から左へのテキストレイアウトの場合は、TPM_LAYOUTRTL を使用します。 デフォルトでは、テキストのレイアウトは左から右です。

x

ショートカットメニューの水平位置(スクリーン座標)。

y

ショートカットメニューの垂直位置(スクリーン座標)。

nReserved

予約済み。0 でなければなりません。

hWnd

ショートカットメニューを所有するウィンドウへのハンドル。このウィンドウは、メニューからすべてのメッセージを受信します。関数が戻るまで、ウィンドウはメニューから WM_COMMAND メッセージを受け取りません。uFlags パラメータに TPM_NONOTIFY を指定した場合、hWnd で識別されるウィンドウにメッセージは送信されません。ただし、hWnd でウィンドウハンドルを渡す必要があります。アプリケーションの任意のウィンドウハンドルを指定できます。

prcRect

無視。

戻り値

uFlags パラメータに TPM_RETURNCMD を指定した場合、戻り値はユーザーが選択した項目のメニュー項目識別子です。ユーザーが選択せずにメニューをキャンセルした場合、またはエラーが発生した場合は、戻り値は 0 になります。

uFlags パラメータに TPM_RETURNCMD を指定しない場合、関数が成功すると 0 以外の値が返され、失敗した場合は 0 になります。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説

SM_MENUDROPALIGNMENT を使用して GetSystemMetrics を呼び出して、正しい水平方向の配置フラグ(TPM_LEFTALIGN または TPM_RIGHTALIGN)および/または水平方向のアニメーション方向フラグ (TPM_HORPOSANIMATION または TPM_HORNEGANIMATION)を決定して、TrackPopupMenu または TrackPopupMenuEx に渡します。これは、特に Microsoft タブレット PC アプリケーションを開発する場合に、最適なユーザー エクスペリエンスを作成するために不可欠です。

メニューが重ならないスクリーン領域を指定するには、TrackPopupMenuEx 関数を使用します。

通知アイコンのコンテキストメニューを表示するには、アプリケーションが TrackPopupMenu または TrackPopupMenuEx を呼び出す前に、現在のウィンドウがフォアグラウンドウィンドウである必要があります。それ以外の場合、メニューの外側をクリックしても、メニューまたはメニューを作成したウィンドウ (表示されている場合)は表示されません。現在のウィンドウが子ウィンドウの場合は、(最上位レベルの)親ウィンドウをフォアグラウンドウィンドウとして設定する必要があります。

ただし、現在のウィンドウがフォアグラウンドウィンドの場合、このメニューが 2 回目に表示されると、そのウィンドウが表示され、すぐに消えます。これを修正するには、TrackPopupMenu を呼び出したアプリケーションにタスクを強制的に切り替える必要があります。これは、次のコード サンプルに示すように、問題のないメッセージをウィンドウまたはスレッドにポストすることによって行われます。

SetForegroundWindow(hDlg);

// メニューを表示する
TrackPopupMenu( hSubMenu,
TPM_RIGHTBUTTON,
pt.x,
pt.y,
0,
hDlg,
NULL);

PostMessage(hDlg, WM_NULL, 0, 0);

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

DestroyMenu 関数
指定されたメニューを破棄し、メニューが占有するメモリを解放します。
BOOL DestroyMenu(
HMENU hMenu
);

パラメータ

hMenu

破棄されるメニューへのハンドル。

戻り値

関数が成功した場合、戻り値は 0 以外になります。関数が失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説

終了する前に、アプリケーションは DestroyMenu 関数を使用して、ウィンドウに割り当てられていないメニューを破棄する必要があります。ウィンドウに割り当てられたメニューは、アプリケーションが閉じると自動的に破棄されます。

DestroyMenu は再帰的なものであり、メニューとそのサブメニューをすべて破壊します。

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

SetTimer 関数
指定されたタイムアウト値を持つタイマーを作成します。
UINT_PTR SetTimer(
HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);

パラメータ

hWnd

タイマーに関連付けるウィンドウへのハンドル。このウィンドウは、呼び出し元のスレッドが所有している必要があります。hWndNULL 値が既存のタイマーの nIDEvent と共に渡された場合、そのタイマーは既存の NULL 以外の hWnd タイマーと同じ方法で置き換えられます。

nIDEvent

0 以外のタイマ識別子。hWnd パラメータが NULL で、nIDEvent が既存のタイマーと一致しない場合は無視され、新しいタイマー ID が生成されます。hWnd パラメータが NULL で、hWnd で指定されたウィンドウに既に nIDEvent という値のタイマーがある場合、既存のタイマーは新しいタイマーに置き換えられます。SetTimer がタイマーを置き換える場合、タイマーはリセットされます。したがって、現在のタイムアウト値が経過した後にメッセージが送信されますが、以前に設定されたタイムアウト値は無視されます。呼び出しが既存のタイマーを置き換えることを意図していない場合、hWndNULL の場合、nIDEvent は 0 である必要があります。

uElapse

タイムアウト値(ミリ秒単位)。

uElapseUSER_TIMER_MINIMUM(0x0000000A)未満の場合、タイムアウトはUSER_TIMER_MINIMUM に設定されます。uElapseUSER_TIMER_MAXIMUM(0x7FFFFFFF)より大きい場合、タイムアウトはUSER_TIMER_MAXIMUM に設定されます。

lpTimerFunc

タイムアウト値が経過したときに通知される関数へのポインタ。関数の詳細については、TimerProc を参照してください。lpTimerFuncNULL の場合、システムは WM_TIMER メッセージをアプリケーションキューにポストします。メッセージの MSG 構造体の hwnd メンバには、hWnd パラメータの値が含まれています。

戻り値

関数が成功し、hWnd パラメータが NULL の場合、戻り値は新しいタイマーを識別する整数です。アプリケーションは、この値を KillTimer 関数に渡して、タイマーを破棄できます。

関数が成功し、hWnd パラメータが NULL でない場合、戻り値は 0 以外の整数になります。アプリケーションは、タイマーを破棄する KillTimer 関数に nIDEvent パラメータの値を渡すことができます。

関数がタイマーの作成に失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説

アプリケーションは、ウィンドウプロシージャに WM_TIMER case ステートメントを含めること、またはタイマーの作成時に TimerProc コールバック関数を指定することにより、WM_TIMER メッセージを処理できます。TimerProc コールバック関数を指定すると、既定のウィンドウプロシージャは、WM_TIMER を処理するときにコールバック関数を呼び出します。したがって、WM_TIMER を処理する代わりに TimerProc を使用する場合でも、呼び出し元のスレッドでメッセージをディスパッチする必要があります。

WM_TIMER メッセージの wParam パラメータには、nIDEvent パラメータの値が含まれています。

タイマー識別子 nIDEvent は、関連付けられているウィンドウに固有です。別のウィンドウは、別のウィンドウが所有するタイマーと同じ識別子を持つ独自のタイマーを持つことができます。タイマーは異なります。

設定タイマーは、hWndNULL の場合にタイマー ID を再利用できます。

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

KillTimer 関数
指定されたタイマーを破棄します。
BOOL KillTimer(
HWND hWnd,
UINT_PTR uIDEvent
);

パラメータ

hWnd

指定されたタイマーに関連付けられたウィンドウへのハンドル。この値は、タイマーを作成した SetTimer 関数に渡される hWnd 値と同じでなければなりません。

uIDEvent

破棄するタイマー。SetTimer に渡されたウィンドウ ハンドルが有効な場合、このパラメータは nIDEvent と同じである必要があります。

値が SetTimer に渡されます。アプリケーションが hWndNULL に設定して SetTimer を呼び出す場合、このパラメータは SetTimer によって返されるタイマー識別子である必要があります。

戻り値

関数が成功した場合、戻り値は 0 以外になります。関数が失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説

KillTimer 関数は、メッセージキューに既にポストされている WM_TIMER メッセージを削除しません。

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

WM_TIMER メッセージ
タイマーの期限が切れたときに、インストールスレッドのメッセージ キューにポストされます。メッセージは、GetMessage 関数または PeekMessage 関数によってポストされます。
#define WM_TIMER                        0x0113

パラメータ

wParam

タイマー識別子。

lParam

タイマーのインストール時に SetTimer 関数に渡されたアプリケーション定義のコールバック関数へのポインタ。

戻り値

アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。

解説

ウィンドウ プロシージャに WM_TIMER case を指定して、メッセージを処理できます。それ以外の場合、。DispatchMessage は、タイマーをインストールするために使用する SetTimer 関数の呼び出しで指定された TimerProc コールバック関数を呼び出します。WM_TIMER メッセージは、低優先度のメッセージです。GetMessage 関数と PeekMessage 関数は、スレッドのメッセージキューに他の優先度の高いメッセージがない場合にのみ、このメッセージをポストします。

必要条件

ヘッダ: Winbase.h ( Windows.h を含む )

WM_DISPLAYCHANGE メッセージ
WM_DISPLAYCHANGE メッセージは、ディスプレイの解像度が変更されるとすべてのウィンドウに送信されます。

ウィンドウは、、WindowProc 関数を通じてこのメッセージを受け取ります。
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

パラメータ

wParam

表示の新しいイメージの深さ(ピクセルあたりのビット数)。

lParam

下位ワードは、画面の水平解像度を指定します。

上位ワードは、画面の垂直方向の解像度を指定します。

解説

このメッセージは、最上位のウィンドウにのみ送信されます。他のすべてのウィンドウについては、それがポストされています。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

WM_PAINT メッセージ
WM_PAINT メッセージは、システムまたは他のアプリケーションがアプリケーションのウィンドウの一部を描画する要求を行ったときに送信されます。このメッセージは、UpdateWindow 関数または RedrawWindow 関数が呼び出された場合、またはアプリケーションが GetMessage 関数または PeekMessage 関数を使用してWM_PAINT メッセージを取得したときに DispatchMessage 関数によって送信されます。

ウィンドウは、WindowProc 関数を通じてこのメッセージを受け取ります。
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

パラメータ

wParam

このパラメータは使用されません。

lParam

このパラメータは使用されません。

戻り値

アプリケーションがこのメッセージを処理する場合は、0 を返します。


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);

// すべてのペイントは、BeginPaint と EndPaint の間でここで行われます。
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}

return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

GitHub の‎‎ Windows Classic Samples の例。

解説

‎WM_PAINT‎‎ メッセージはシステムによって生成され、アプリケーションによって送信されるべきではありません。特定のデバイス コンテキストに強制的に描画するウィンドウを WM_PRINT または ‎‎WM_PRINTCLIENT ‎‎メッセージを使用します。この場合、ターゲット ウィンドウが‎‎ WM_PRINTCLIENT ‎‎メッセージをサポートする必要があることに注意してください。一般的なコントロールのほとんどは‎‎、WM_PRINTCLIENT ‎‎メッセージをサポートします。

‎ ‎DefWindowProc 関数‎‎は‎‎、更新領域を検証します。ウィンドウフレームを描画する必要がある場合は、この関数はウィンドウプロシージャに ‎‎WM_NCPAINT ‎‎メッセージを送信し、ウィンドウの背景を消去する必要がある場合は ‎‎WM_ERASEBKGND ‎‎メッセージを送信することもできます。‎

‎ ‎アプリケーションのメッセージキューに他のメッセージがない場合、システムはこのメッセージを送信します。‎‎メッセージの‎‎送信先を決定します。‎‎どのメッセージ‎‎をディスパッチするかを決定します。‎‎GetMessage‎‎ は、アプリケーションのメッセージ キューに他のメッセージがない場合に‎‎ WM_PAINT ‎‎メッセージを返し‎‎、DispatchMessage ‎‎は適切なウィンドウプロシージャにメッセージを送信します。

‎‎ ‎ウィンドウは、RDW_INTERNALPAINT フラグを設定して ‎‎RedrawWindow ‎‎を呼び出した結果として、内部ペイント メッセージを受信することがあります。この場合、ウィンドウに更新領域がない可能性があります。アプリケーションは、ウィンドウに更新領域があるかどうかを判断する‎‎GetUpdateRect ‎‎関数を呼び出す場合があります。‎‎GetUpdateRect‎‎ が 0 を返す場合、アプリケーションは ‎‎BeginPaint‎‎ 関数と‎‎ EndPaint‎‎ 関数を呼び出す必要はありません。‎

‎ ‎WM_PAINT‎‎ メッセージは、非 NULL 更新領域と、RDW_INTERNALPAINT フラグが設定された‎‎ RedrawWindow‎‎ の呼び出しの両方によって発生している可能性があるため、アプリケーションは、各‎‎ WM_PAINT‎‎ メッセージの内部データ構造を調べて、必要な内部描画をチェックする必要があります。
‎‎
‎ ‎内部 ‎‎WM_PAINT‎‎ メッセージは 1 回だけ送信されます。内部‎‎ WM_PAINT ‎‎メッセージが‎‎ GetMessage‎‎ または ‎‎PeekMessage‎‎ から返されるか、または ‎‎UpdateWindow‎‎ によってウィンドウに送信された後、システムは、ウィンドウが無効になるまで、または RDW_INTERNALPAINT 再描画フラグが設定された‎‎再び呼‎‎び出されるまで、それ以降‎‎の WM_PAINT ‎‎メッセージを送信または送信しません。

‎‎ ‎一部のコモン コントロールでは、デフォルトの‎‎ WM_PAINT‎‎ メッセージ処理で‎‎ wParam‎‎ パラメータがチェックされます。‎‎wParam ‎‎が NULL 以外の場合、コントロールは値が HDC であると見なし、そのデバイス コンテキストを使用して描画します。

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

ValidateRect 関数
ValidateRect 関数は、指定したウィンドウの更新領域から四角形を削除することで、四角形内のクライアント領域を検証します。
BOOL ValidateRect(
HWND hWnd,
const RECT *lpRect
);

パラメータ

hWnd

更新領域を変更するウィンドウへのハンドル。このパラメータが NULL の場合、システムはすべてのウィンドウを無効にして再描画し、WM_ERASEBKGND および WM_NCPAINT メッセージをウィンドウプロシージャに送信してから関数が返ります。

lpRect
更新領域から削除する四角形のクライアント座標を格納する RECT 構造体へのポインタ。このパラメータが NULL の場合、クライアント領域全体が削除されます。

戻り値

関数が成功した場合、戻り値は 0 以外になります。

関数が失敗した場合、戻り値は 0 です。

解説

BeginPaint 関数は、クライアント領域全体を自動的に検証します。次の WM_PAINT メッセージが生成される前に更新領域の一部を検証する必要がある場合は、ValidateRect 関数も ValidateRgn 関数も呼び出す必要はありません。

現在の更新領域が検証されるまで、システムは WM_PAINT メッセージを生成し続けます。

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

WM_MOVE メッセージ
‎ウィンドウが移動された後に送信されます。‎

ウィンドウは、WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_MOVE                         0x0003

パラメータ

wParam

‎このパラメーターは使用されません。‎

lParam

‎ウィンドウのクライアント領域の左上隅の x 座標と y 座標。下位ワードには x 座標が含まれ、上位ワードには y 座標が含まれます。‎

戻り値

アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。

解説

‎パラメータは、オーバーラップウィンドウとポップアップウィンドウの画面座標で、子ウィンドウの親クライアント座標で指定されます。‎

‎次の例は‎‎、lParam ‎‎パラメータから位置を取得する方法を示しています。‎
xPos = (int)(short) LOWORD(lParam);   // 水平位置
yPos = (int)(short) HIWORD(lParam);   // 垂直位置
‎また‎‎、MAKEPOINTS‎‎ マクロを使用して‎‎、lParam ‎‎パラメータを‎‎ POINTS ‎‎構造体に変換することもできます。

‎ ‎DefWindowProc‎‎ 関数は‎‎、WM_WINDOWPOSCHANGED‎‎ メッセージを処理するときに‎‎、WM_SIZE‎‎ と‎‎ WM_MOVE ‎‎メッセージを送信します。アプリケーションが‎‎ DefWindowProc ‎‎を呼び出さずに‎‎ WM_WINDOWPOSCHANGED‎‎ メッセージを処理する場合‎‎、WM_SIZE ‎‎および ‎‎WM_MOVE‎‎ メッセージは送信されません。‎

必要条件

ヘッダ: Winuser.h ( Windows.h を含む )

DefWindowProc 関数
既定のウィンドウ プロシージャを呼び出して、アプリケーションが処理しないウィンドウ メッセージに対して既定の処理を提供します。この関数は、すべてのメッセージが処理されることを保証します。DefWindowProc は、ウィンドウ プロシージャが受け取るのと同じパラメータで呼び出されます。
LRESULT DefWindowProc(
HWND hWnd, // ウィンドウのハンドル
UINT Msg, // メッセージの識別子
WPARAM wParam, // メッセージの最初のパラメータ
LPARAM lParam // メッセージの 2 番目のパラメータ
);

パラメータ

hWnd

メッセージを受信したウィンドウプロシージャへのハンドル。

Msg
メッセージ。

wParam
追加のメッセージ情報。このパラメータの内容は、Msg パラメータの値によって異なります。

lParam

追加のメッセージ情報。このパラメータの内容は、Msg パラメータの値によって異なります。

戻り値

戻り値はメッセージ処理の結果であり、メッセージによって異なります。

解説

! 注意

winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして DefWindowProc を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

必要条件

ヘッダ: winuser.h ( Windows.h を含む )

RegDeleteValue関数
‎‎‎指定したレジストリ キーから名前付きの値を削除します。値名では大文字と小文字が区別されないことに注意してください。‎
LSTATUS RegDeleteValue(
  HKEY   hKey,
  LPCSTR lpValueName
);

パラメータ

hKey

‎‎‎開いているレジストリ キーへのハンドル。キーは、KEY_SET_VALUEアクセス権で開かれている必要があります。詳細については、Registry Key Security and Access Rights を参照してください。

‎このハンドル‎‎は、‎‎RegCreateKeyExRegCreateKeyTransactedRegOpenKeyEx、または RegOpenKeyTransacted 関数によって返されます。また、次の‎‎ predefined keys(定義済みキー) ‎‎の 1 つでも使用できます。‎
   HKEY_CLASSES_ROOT
   HKEY_CURRENT_CONFIG
   HKEY_CURRENT_USER
   HKEY_LOCAL_MACHINE
   HKEY_USERS

lpValueName

‎削除するレジストリ値。このパラメーターが‎‎ NULL‎‎ または空の文字列の場合は、RegSetValueEx ‎‎関数‎‎によって設定された値が削除されます。

‎詳細については、 Registry Element Size Limits を参照してください。

戻り値

‎関数が成功した場合、戻り値は ERROR_SUCCESS。‎

関数が失敗した場合、戻り値は Winerror.h で定義された 0 以外のエラーコードです。‎‎FormatMessage‎‎ 関数を FORMAT_MESSAGE_FROM_SYSTEM フラグと共に使用すると、エラーの一般的な説明を取得できます。

解説

! 注意

winreg.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして RegDeleteValue を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

必要条件

ヘッダ: winreg.h ( Windows.h を含む )

nullptr(C++/CLI および C++/CX)
nullptr キーワードは、null ポインタ値 を表します。null ポインタ値を使用して、オブジェクトハンドル、内部ポインタ、またはネイティブポインタ型がオブジェクトを指していないことを示します。

マネージコードまたはネイティブコードと共に nullptr を使用します。コンパイラは、マネージとネイティブの null ポインタ値に対して適切だが異なる命令を出力します。このキーワードの ISO 標準 C++ バージョンの使用については、nullptr を参照してください。

__nullptr キーワードは、nullptr と同じ意味を持つ Microsoft 固有のキーワードですが、ネイティブ コードにのみ適用されます。ネイティブ C/C++ コードで nullptr を使用し、 /clr コンパイラオプションを指定してコンパイルする場合、コンパイラは、nullptr がネイティブまたはマネージの null ポインター値を示すかどうかを判断できません。コンパイラに対して意図を明確にするために、nullptr を使用してマネージ値を指定するか、__nullptr を使用してネイティブ値を指定します。

使い方

nullptr キーワードは、ハンドル、ネイティブポインタ、または関数引数を使用できる場所であればどこでも使用できます。nullptr キーワードは型ではなく、次のキーワードでの使用はサポートされていません。
  • sizeof
  • typeid
  • throw nullptr(ただし throw (Object^)nullptr; は機能します)
nullptr キーワードは、次のポインタ型の初期化で使用できます。
  • ネイティブポインタ
  • Windows ランタイムハンドル
  • マネージハンドル
  • マネージ内部ポインタ
nullptr キーワードを使用すると、参照が使用される前に、ポインタまたはハンドル参照が null であるかどうかをテストできます。

エラー チェックに null ポインター値を使用する言語間の関数呼び出しは、正しく解釈される必要があります。

ハンドルを 0 に初期化することはできません。使用できるのは nullptr だけです。オブジェクトハンドルに定数 0 を代入すると、ボックス化された Int32 が生成され、Object^ にキャストされます。



ハンドル、ネイティブポインタ、または関数の引数を使用できる場所であれば、nullptr キーワードを使用できることを示すコード例を次に示します。この例では、nullptr キーワードを使用して、参照を使用する前に参照をチェックできることを示しています。
// mcpp_nullptr.cpp
// compile with: /clr
value class V {};
ref class G {};
void f(System::Object ^) {}

int main() {
// ネイティブポインタ。
int *pN = nullptr;
// マネージハンドル。
G ^pG = nullptr;
V ^pV1 = nullptr;
// マネージ内部ポインタ。
interior_ptr pV2 = nullptr;
// ポインタを使用する前の参照チェック。
if (pN == nullptr) {}
if (pG == nullptr) {}
if (pV1 == nullptr) {}
if (pV2 == nullptr) {}
// nullptr は関数の引数として使用できます。
f(nullptr); // 呼び出し f(System::Object ^)
}



次のコード例は、nullptr と 0 をネイティブポインタで同じ意味で使用できることを示しています。
// mcpp_nullptr_1.cpp
// compile with: /clr
class MyClass {
public:
int i;
};

int main() {
MyClass * pMyClass = nullptr;
if ( pMyClass == nullptr)
System::Console::WriteLine("pMyClass == nullptr");

if ( pMyClass == 0)
System::Console::WriteLine("pMyClass == 0");

pMyClass = 0;
if ( pMyClass == nullptr)
System::Console::WriteLine("pMyClass == nullptr");

if ( pMyClass == 0)
System::Console::WriteLine("pMyClass == 0");
}
出力
pMyClass == nullptr

pMyClass == 0

pMyClass == nullptr

pMyClass == 0



nullptr が任意の型へのハンドルまたは任意の型へのネイティブポインタとして解釈されるコード例を次に示します。異なる型へのハンドルを使用して関数をオーバーロードする場合は、あいまいさのエラーが生成されます。nullptr は型に明示的にキャストする必要があります。
// mcpp_nullptr_2.cpp
// compile with: /clr /LD
void f(int *){}
void f(int ^){}

void f_null() {
f(nullptr); // C2668
// 代わりに次の行のいずれかを試してください
f((int *) nullptr);
f((int ^) nullptr);
}



nullptr のキャストが許可され、nullptr 値を含むキャスト型へのポインタまたはハンドルを返すコード例を次に示します。
// mcpp_nullptr_3.cpp
// compile with: /clr /LD
using namespace System;
template <typename T>void f(T) {} // Nullptr は任意の型にできるため、C2036 はテンプレート型を推測できません

int main() {
f((Object ^) nullptr); // T = Object^, 呼び出し f(Object ^)

// 解決するには、次の行を削除します。
f(nullptr);

f(0); // T = int, 呼び出し f(int)
}



次のコード例は、nullptr を関数パラメータとして使用できることを示しています。
// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
Console::WriteLine("test");
}

int main() {
f(nullptr);
}
出力
test



次のコード例は、ハンドルが宣言され、明示的に初期化されていない場合、既定で nullptr に初期化されることを示しています。
// mcpp_nullptr_5.cpp
// compile with: /clr
using namespace System;
ref class MyClass {
public:
void Test() {
MyClass ^pMyClass; // gc type
if (pMyClass == nullptr)
Console::WriteLine("NULL");
}
};

int main() {
MyClass ^ x = gcnew MyClass();
x -> Test();
}
出力
NULL



次のコード例は、/clr を使用してコンパイルするときに、ネイティブポインタに nullptr を割り当てることができることを示しています。
// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
int * i = 0;
int * j = nullptr;
}

必要条件

コンパイラオプション: (必須ではありません。 /ZW/clr など、すべてのコード生成オプションでサポートされています。)

const(C++)
データ宣言を変更する場合、const キーワードは、オブジェクトまたは変数が変更可能でないことを指定します。
const declaration ;
member-function const ;

const 値

const キーワードは、変数の値が定数であることを指定し、プログラマが変数を変更できないようにコンパイラに指示します。
// constant_values1.cpp
int main() {
const int i = 5;
i = 10; // C3892
i++; // C2105
};
C++ では、#define プリプロセッサ ディレクティブの代わりに const キーワードを使用して定数値を定義できます。const で定義された値は型チェックの対象となり、定数式の代わりに使用できます。C++ では、次のように const 変数を使用して配列のサイズを指定できます。
// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray]; // C++ で許可されています。C では許可されていません
C では、定数値は既定で外部リンケージに設定されるため、ソースファイルにのみ表示されます。C++ では、定数値は既定で内部リンケージに設定され、ヘッダーファイルに表示されます。

const キーワードは、ポインタの宣言でも使用できます。
// constant_values3.cpp
int main() {
char *mybuf = 0, *yourbuf;
char *const aptr = mybuf;
*aptr = 'a'; // OK
aptr = yourbuf; // C3892
}
const として宣言された変数へのポインタは、const としても宣言されているポインタにのみ割り当てることができます。
// constant_values4.cpp
#include <stdio.h>
int main() {
const char *mybuf = "test";
char *yourbuf = "test2";
printf_s("%s\n", mybuf);

const char *bptr = mybuf; // 定数データへのポインタ
printf_s("%s\n", bptr);

// *bptr = 'a'; // エラー
}
定数データへのポインターを関数パラメータとして使用すると、関数がポインタを介して渡されるパラメータを変更するのを防ぐことができます。

const として宣言されたオブジェクトの場合、定数メンバ関数のみを呼び出すことができます。これにより、定数オブジェクトが変更されることはありません。
birthday.getMonth();    // 大丈夫
birthday.setMonth( 4 ); // エラー

const メンバ関数

const キーワードを使用してメンバ関数を宣言すると、その関数が呼び出されるオブジェクトを変更しない 「読み取り専用」 関数であることを指定します。定数メンバ関数は、非静的データメンバを変更したり、定数でないメンバ関数を呼び出したりすることはできません。定数メンバ関数を宣言するには、引数リストの右かっこの後に const キーワードを配置します。定数キーワードは、宣言と定義の両方で必要です。
// constant_member_function.cpp
class Date
{
public:
Date( int mn, int dy, int yr );
int getMonth() const; // 読み取り専用関数
void setMonth( int mn ); // 書き込み関数。定数にすることはできません
private:
int month;
};

int Date::getMonth() const
{
return month; // 何も変更しません
}
void Date::setMonth( int mn )
{
month = mn; // データメンバを変更

}
int main()
{
Date MyDate( 7, 4, 1998 );
const Date BirthDate( 1, 18, 1953 );
MyDate.setMonth( 4 ); // 大丈夫
BirthDate.getMonth(); // 大丈夫
BirthDate.setMonth( 4 ); // C2662 エラー
}

C とC++ const の相違点

変数を C ソース コード ファイルで const として宣言する場合は、次のようにします。
const int i = 2;
この変数は、次のように別のモジュールで使用できます。
extern const int i;
しかし、C++ で同じ動作を得るには、const 変数を次のように宣言する必要があります。
extern const int i = 2;
C++ ソース コード ファイルで使用する C++ ソース コード ファイルで extern 変数を宣言する場合は、次の値を使用します。
extern "C" const int x=10;
C++ コンパイラによる名前修飾を防ぐために使用します。

解説

メンバー関数のパラメータリストに従う場合、const キーワードは、関数が呼び出されるオブジェクトを変更しないことを指定します。

const の詳細については、次のトピックを参照してください。
  • const と volatile ポインタ

  • 型修飾子(C 言語リファレンス)

  • volatile

  • #define

スコープ解決演算子: ::
スコープ解決演算子 :: は、異なるスコープで使用される識別子を識別し、あいまいさを解消するために使用されます。スコープの詳細については、Scope を参照してください。
:: identifier
class-name :: identifier
namespace :: identifier
enum class :: identifier
enum struct :: identifier

解説

identifier には、変数、関数、または列挙値を指定できます。

クラスと名前空間の使用

次の例は、名前空間とクラスでスコープ解決演算子を使用する方法を示しています。
namespace NamespaceA{
int x;
class ClassA {
public:
int x;
};
}

int main() {

// あいまいさを解消するために使用される名前空間名
NamespaceA::x = 1;

// あいまいさを解消するために使用されるクラス名
NamespaceA::ClassA a1;
a1.x = 2;
}
スコープ修飾子のないスコープ解決演算子は、グローバル名前空間を参照します。
namespace NamespaceA{
int x;
}

int x;

int main() {
int x;

// main() の x
x = 0;
// グローバル名前空間の x
::x = 1;

// A 名前空間の x
NamespaceA::x = 2;
}
スコープ解決演算子を使用して、名前空間のメンバを識別したり、using ディレクティブでメンバの名前空間を指定する名前空間を識別したりできます。次の例では、名前空間 NamespaceBClassB が宣言された場合でも、NamespaceC を使用して ClassB を修飾できます。これは、NamespaceB は using ディレクティブによって NamespaceC に指定されているためです。
namespace NamespaceB {
class ClassB {
public:
int x;
};
}

namespace NamespaceC{
using namespace B;
}
int main() {
NamespaceB::ClassB c_b;
NamespaceC::ClassB c_c;

c_b.x = 3;
c_c.x = 4;
}
スコープ解決演算子のチェーンを使用できます。次の例では、NamespaceD::NamespaceD1 は入れ子になった名前空間 NamespaceD1 を識別し、NamespaceE::ClassE::ClassE1 は入れ子になったクラス ClassE1 を識別します。
namespace NamespaceD{
namespace NamespaceD1{
int x;
}
}

namespace NamespaceE{
class ClassE{
public:
class ClassE1{
public:
int x;
};
};
}

int main() {
NamespaceD:: NamespaceD1::x = 6;
NamespaceE::ClassE::ClassE1 e1;
e1.x = 7 ;
}

静的メンバの使用

クラスの静的メンバを呼び出す場合は、スコープ解決演算子を使用する必要があります。
class ClassG {
public:
static int get_x() { return x;}
static int x;
};

int ClassG::x = 6;

int main() {

int gx1 = ClassG::x;
int gx2 = ClassG::get_x();
}

スコープ付き列挙型の使用

スコープ付き解決演算子は、次の例のように、スコープ付き列挙型 列挙宣言 の値でも使用されます。
enum class EnumA{
First,
Second,
Third
};

int main() {
EnumA enum_value = EnumA::First;
}

reinterpret_cast 演算子
任意のポインタを他のポインタ型に変換できます。また、任意の整数型を任意のポインタ型に変換したり、その逆に変換することもできます。
reinterpret_cast < type-id > ( expression )

解説

reinterpret_cast オペレータの誤用は、簡単に安全ではありません。目的の変換が本質的に低レベルでない限り、他のキャスト演算子のいずれかを使用する必要があります。

reinterpret_cast 演算子は、char* から int* への変換、または本質的に安全でない One_class* から Unrelated_class* への変換に使用できます。

reinterpret_cast の結果は、元の型にキャストバックされる以外の目的では安全に使用できません。その他の用途は、せいぜいポータブルではない。

reinterpret_cast 演算子は、constvolatile、または __unaligned 属性をキャストすることはできません。これらの属性の削除については、const_cast 演算子 を参照してください。

reinterpret_cast 演算子は、null ポインタ値を変換先の型の null ポインタ値に変換します。

reinterpret_cast の実際的な使用法の 1 つはハッシュ関数で、2 つの異なる値が同じインデックスで終わることはほとんどありません方法で値をインデックスにマップします。
#include <iostream>
using namespace std;

// アドレスに基づいてハッシュ コードを返します。
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}

using namespace std;
int main() {
int a[20];
for ( int i = 0; i < 20; i++ )
cout << Hash( a + i ) << endl;
}

出力:
64641
64645
64889
64893
64881
64885
64873
64877
64865
64869
64857
64861
64849
64853
64841
64845
64833
64837
64825
64829
reinterpret_cast を使用すると、ポインタを整数型として扱うことができます。その結果、ビットシフトと XORed がそれ自体を使用して一意のインデックスを生成します(高い確率で一意)。次に、関数の戻り値の型に対して標準 C スタイルのキャストによって、インデックスが切り捨てられます。