次のページ >
アナログ時計の作成
今回は、Direct2D および Windows Imaging Component(WIC)を使用した PNG をリソースに組み込む方法でアナログ時計の作成をします。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 関数を呼び出す前に、このメンバを設定してください。
この構造体のサイズ(バイト単位)。このメンバを sizeof (WNDCLASSEX) に設定します。GetClassInfoEx 関数を呼び出す前に、このメンバを設定してください。
lpfnWndProc
ウィンドウプロシージャへのポインタ。ウィンドウプロシージャを呼び出すために、CallWindowProc 関数を使用する必要があります。詳細については、WindowProc を参照してください。
ウィンドウプロシージャへのポインタ。ウィンドウプロシージャを呼び出すために、CallWindowProc 関数を使用する必要があります。詳細については、WindowProc を参照してください。
cbClsExtra
ウィンドウクラス構造体の後に割り当てる追加のバイト数。システムはバイトを 0 に初期化します。
ウィンドウクラス構造体の後に割り当てる追加のバイト数。システムはバイトを 0 に初期化します。
cbWndExtra
ウィンドウインスタンスの後に割り当てる追加バイト数。システムはバイトを 0 に初期化します。アプリケーションが WNDCLASSEX を使用して、リソース ファイル内の CLASS ディレクティブを使用して作成されたダイアログ ボックスを登録する場合は、このメンバを DLGWINDOWEXTRA に設定する必要があります。
ウィンドウインスタンスの後に割り当てる追加バイト数。システムはバイトを 0 に初期化します。アプリケーションが WNDCLASSEX を使用して、リソース ファイル内の CLASS ディレクティブを使用して作成されたダイアログ ボックスを登録する場合は、このメンバを DLGWINDOWEXTRA に設定する必要があります。
hInstance
クラスのウィンドウプロシージャを含むインスタンスへのハンドル。
クラスのウィンドウプロシージャを含むインスタンスへのハンドル。
hIcon
クラスアイコンへのハンドル。このメンバは、アイコンリソースへのハンドルである必要があります。このメンバが NULL の場合、システムは既定のアイコンを提供します。
クラスアイコンへのハンドル。このメンバは、アイコンリソースへのハンドルである必要があります。このメンバが NULL の場合、システムは既定のアイコンを提供します。
hCursor
クラスカーソルへのハンドル。このメンバは、カーソルリソースへのハンドルでなければなりません。このメンバが NULL の場合、アプリケーションは、マウスがアプリケーションのウィンドウに移動するたびに、カーソルの形状を明示的に設定する必要があります。
クラスカーソルへのハンドル。このメンバは、カーソルリソースへのハンドルでなければなりません。このメンバが NULL の場合、アプリケーションは、マウスがアプリケーションのウィンドウに移動するたびに、カーソルの形状を明示的に設定する必要があります。
hbrBackground
クラスの背景ブラシへのハンドル。このメンバは、背景の描画に使用するブラシへのハンドルを指定することも、カラー値にすることもできます。色の値は、次の標準システムカラーのいずれかである必要があります(値 1 を選択した色に追加する必要があります)。カラー値を指定する場合は、次の HBRUSH 型のいずれかに変換する必要があります。
このメンバが NULL の場合、アプリケーションは、クライアント領域で描画を要求されたときに、独自の背景を描画する必要があります。背景を描画する必要があるかどうかを判断するには、アプリケーションは、WM_ERASEBKGND メッセージを処理するか、BeginPaint 関数で埋め込まれた PAINTSTRUCT 構造体の fErase メンバをテストします。
クラスの背景ブラシへのハンドル。このメンバは、背景の描画に使用するブラシへのハンドルを指定することも、カラー値にすることもできます。色の値は、次の標準システムカラーのいずれかである必要があります(値 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
このメンバが NULL の場合、アプリケーションは、クライアント領域で描画を要求されたときに、独自の背景を描画する必要があります。背景を描画する必要があるかどうかを判断するには、アプリケーションは、WM_ERASEBKGND メッセージを処理するか、BeginPaint 関数で埋め込まれた PAINTSTRUCT 構造体の fErase メンバをテストします。
lpszMenuName
名前がリソースファイルに表示されるクラスメニューのリソース名を指定する、null で終わる文字列へのポインタ。整数を使用してメニューを識別する場合は、MAKEINTRESOURCE マクロを使用します。このメンバが NULL の場合、このクラスに属するウィンドウには既定のメニューはありません。
名前がリソースファイルに表示されるクラスメニューのリソース名を指定する、null で終わる文字列へのポインタ。整数を使用してメニューを識別する場合は、MAKEINTRESOURCE マクロを使用します。このメンバが NULL の場合、このクラスに属するウィンドウには既定のメニューはありません。
lpszClassName
null で終わる文字列へのポインタ、またはアトムです。このパラメータがアトムである場合は、RegisterClass 関数または RegisterClassEx 関数の前の呼び出しによって作成されたクラスアトムである必要があります。アトムは、下位ワードの中にある必要があります。上位ワードは 0 でなければなりません。
lpszClassName が文字列の場合は、ウィンドウ クラス名を指定します。クラス名は、RegisterClass または RegisterClassEx に登録された任意の名前、または定義済みのコントロールクラス名のいずれかです。
lpszClassName の最大長は 256 です。lpszClassName が最大長より大きい場合、RegisterClassEx 関数は失敗します。
null で終わる文字列へのポインタ、またはアトムです。このパラメータがアトムである場合は、RegisterClass 関数または RegisterClassEx 関数の前の呼び出しによって作成されたクラスアトムである必要があります。アトムは、下位ワードの中にある必要があります。上位ワードは 0 でなければなりません。
lpszClassName が文字列の場合は、ウィンドウ クラス名を指定します。クラス名は、RegisterClass または RegisterClassEx に登録された任意の名前、または定義済みのコントロールクラス名のいずれかです。
lpszClassName の最大長は 256 です。lpszClassName が最大長より大きい場合、RegisterClassEx 関数は失敗します。
hIconSm
ウィンドウクラスに関連付けられている小さいアイコンへのハンドル。このメンバが NULL の場合、システムは、小さいアイコンとして使用する適切なサイズのアイコンを hIcon メンバによって指定されたアイコンリソースを検索します。
ウィンドウクラスに関連付けられている小さいアイコンへのハンドル。このメンバが NULL の場合、システムは、小さいアイコンとして使用する適切なサイズのアイコンを hIcon メンバによって指定されたアイコンリソースを検索します。
解説
! 注意
winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして WNDCLASSEX を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして WNDCLASSEX を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: Winuser.h ( Windows.h を含む )
RegisterClassEx 関数
CreateWindow 関数または CreateWindowEx 関数の呼び出しで後で使用するウィンドウクラスを登録します。ATOM RegisterClassEx(
const WNDCLASSEX *Arg1 // クラスデータ
);
パラメータ
戻り値
関数が成功した場合、戻り値は登録されるクラスを一意に識別するクラスアトムです。このアトムは、CreateWindow、CreateWindowEx、GetClassInfo、GetClassInfoEx、FindWindow、FindWindowEx、および UnregisterClass 関数と IActiveIMMap::FilterClientWindows メソッドでのみ使用できます。
関数が失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、GetLastError を呼び出します。
関数が成功した場合、戻り値は登録されるクラスを一意に識別するクラスアトムです。このアトムは、CreateWindow、CreateWindowEx、GetClassInfo、GetClassInfoEx、FindWindow、FindWindowEx、および UnregisterClass 関数と IActiveIMMap::FilterClientWindows メソッドでのみ使用できます。
関数が失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、GetLastError を呼び出します。
解説
RegisterClassExA を使用してウィンドウ クラスを登録すると、作成されたクラスのウィンドウが ANSI 文字セットを使用するテキストまたは文字パラメーターを持つメッセージを期待していることをシステムに通知します。RegisterClassExW を使用して登録すると、アプリケーションは、システムがメッセージのテキスト パラメータを Unicode として渡すように要求します。IsWindowUnicode 関数を使用すると、アプリケーションは各ウィンドウの性質を照会できます。ANSI 関数と Unicode 関数の詳細については、Conventions for Function Prototypes を参照してください。
アプリケーションが登録するすべてのウィンドウ クラスは、終了時に登録解除されます。
DLL がアンロードされるときに、DLL によって登録されたウィンドウ クラスは登録解除されません。DLL は、アンロード時に明示的にクラスの登録を解除する必要があります。
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 ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして RegisterClassEx を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: 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 ) に設定します。これにより、関数は、渡す構造体の型を決定できます。
この構造体のサイズ(バイト単位)。
GetMonitorInfo 関数を呼び出す前に、このメンバを sizeof ( MONITORINFO ) に設定します。これにより、関数は、渡す構造体の型を決定できます。
dwFlags
表示モニターの属性を表すフラグのセット。
次のフラグが定義されています。
表示モニターの属性を表すフラグのセット。
次のフラグが定義されています。
値 | 意味 |
MONITORINFOF_PRIMARY | これがプライマリディスプレイモニタです。 |
必要条件
ヘッダ: winuser.h( Windows.h を含む )
ヘッダ: winuser.h( Windows.h を含む )
MonitorFromPoint 関数
MonitorFromPoint 関数は、指定したポイントを含むディスプレイ モニターへのハンドルを取得します。HMONITOR MonitorFromPoint(
POINT pt,
DWORD dwFlags
);
パラメータ
dwFlags
ポイントがディスプレイモニタ内に含まれていない場合に、関数の戻り値を決定します。
このパラメータは、次のいずれかの値になります。
このパラメータは、次のいずれかの値になります。
値 | 意味 |
MONITOR_DEFAULTTONEAREST | ポイントに最も近いディスプレイ モニタへのハンドルを返します。 |
MONITOR_DEFAULTTONULL | NULL を返します。 |
MONITOR_DEFAULTTOPRIMARY | プライマリディスプレイモニタへのハンドルを返します。 |
戻り値
ポイントがディスプレイモニターに含まれている場合、戻り値はそのディスプレイモニターに対する HMONITOR ハンドルです。
ポイントがディスプレイモニタに含まれていない場合、戻り値は dwFlags の値によって異なります。
ポイントがディスプレイモニターに含まれている場合、戻り値はそのディスプレイモニターに対する HMONITOR ハンドルです。
ポイントがディスプレイモニタに含まれていない場合、戻り値は dwFlags の値によって異なります。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: 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 構造体を使用して一部のバイトを節約できます。
GetMonitorInfo 関数を呼び出す前に、構造体の cbSize メンバを sizeof (MONITORINFO) または sizeof (MONITORINFOEX) に設定する必要があります。これにより、関数は、渡す構造体の型を決定できます。
MONITORINFOEX 構造体は、MONITORINFO 構造体のスーパーセットです。このメンバには、ディスプレイ モニタの名前を含む文字列という 1 つの追加メンバがあります。ほとんどのアプリケーションはディスプレイモニター名を使用しないので、MONITORINFO 構造体を使用して一部のバイトを節約できます。
戻り値
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
解説
! 注意
winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetMonitorInfo を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetMonitorInfo を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: 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 値を指定する必要があるかどうかを確認するには、個々のメッセージ ページを参照してください。
アプリバーウィンドウへのハンドル。すべてのメッセージがこのメンバを使用しているわけではありません。hWind 値を指定する必要があるかどうかを確認するには、個々のメッセージ ページを参照してください。
uCallbackMessage
アプリケーション定義のメッセージ識別子。アプリケーションは、hWnd メンバによって識別されるアプリバーに送信する通知メッセージに対して、指定された識別子を使用します。このメンバは、ABM_NEW メッセージを送信するときに使用されます。
アプリケーション定義のメッセージ識別子。アプリケーションは、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 構造体。
メッセージによって使用が異なる RECT 構造体。
- ABM_GETTASKBARPOS、 ABM_QUERYPOS、 ABM_SETPOS: アプリバーまたは Windows タスクバーの外接する四角形(画面座標)です。
- ABM_GETAUTOHIDEBAREX、 ABM_SETAUTOHIDEBAREX: 操作を実行するモニタ。この情報は、GetMonitorInfo 関数を使用して取得できます。
lParam
メッセージに依存する値。このメンバは、次のメッセージで使用されます。
メッセージに依存する値。このメンバは、次のメッセージで使用されます。
- ABM_SETAUTOHIDEBAR
- ABM_SETAUTOHIDEBAREX
- ABM_SETSTATE
必要条件
ヘッダ: shellapi.h( Windows.h を含む )
ヘッダ: 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 のドキュメントを参照してください。これらのドキュメントへのリンクは、[参照] セクションにあります。
この関数は、メッセージに依存する値を返します。詳細については、特定のアプリバーメッセージが送信される Windows SDK のドキュメントを参照してください。これらのドキュメントへのリンクは、[参照] セクションにあります。
必要条件
ヘッダ: shellapi.h
ヘッダ: shellapi.h
ABM_NEW メッセージ
新しいアプリバーを登録し、通知メッセージの送信にシステムが使用するメッセージ識別子を指定します。アプリバーは、他のアプリバーメッセージを送信する前に、このメッセージを送信する必要があります。fRegistered = (BOOL) SHAppBarMessage(ABM_NEW, pabd);
パラメータ
pabd
新しいアプリバーのウィンドウハンドルとメッセージ識別子を含む APPBARDATA 構造体へのポインタ。このメッセージを送信する場合は、cbSize、hWnd、および uCallbackMessage メンバを指定する必要があります。他のメンバーはすべて無視されます。
戻り値
正常に終了した場合は TRUE を返し、エラーが発生した場合、またはアプリ バーが既に登録されている場合はFALSE を返します。
正常に終了した場合は TRUE を返し、エラーが発生した場合、またはアプリ バーが既に登録されている場合はFALSE を返します。
必要条件
ヘッダ: Shellapi.h
ヘッダ: Shellapi.h
ABM_REMOVE メッセージ
アプリバーをシステムの内部リストから削除して登録を解除します。システムがアプリバーに通知メッセージを送信したり、他のアプリケーションがアプリバーで使用する画面領域を使用できないようにするようになりました。SHAppBarMessage(ABM_REMOVE, pabd);
パラメータ
pabd
登録を解除するアプリバーへのハンドルを含む APPBARDATA 構造体へのポインタ。このメッセージを送信する場合は、cbSize および hWnd メンバを指定する必要があります。他のメンバはすべて無視されます。
戻り値
常に TRUE を返します。
常に TRUE を返します。
必要条件
ヘッダ: Shellapi.h
ヘッダ: Shellapi.h
ABN_POSCHANGED メッセージ
アプリ バーのサイズと位置に影響を与える可能性があるイベントが発生したときに、アプリ バーに通知します。イベントには、タスク バーのサイズ、位置、および表示状態の変更、および画面の同じ側にある別のアプリ バーの追加、削除、またはサイズ変更が含まれます。ABN_POSCHANGED
パラメータ
このメッセージにはパラメータがありません。
このメッセージにはパラメータがありません。
戻り値
戻り値がありません。
戻り値がありません。
解説
アプリ バーは、ABM_QUERYPOS および ABM_SETPOS メッセージを送信して、この通知メッセージに応答する必要があります。位置が変更された場合、アプリバーは MoveWindow 関数を呼び出して、新しい位置に移動する必要があります。
アプリ バーは、ABM_QUERYPOS および ABM_SETPOS メッセージを送信して、この通知メッセージに応答する必要があります。位置が変更された場合、アプリバーは MoveWindow 関数を呼び出して、新しい位置に移動する必要があります。
必要条件
ヘッダ: Shellapi.h
ヘッダ: Shellapi.h
UpdateWindow 関数
UpdateWindow 関数は、ウィンドウの更新領域が空でない場合、ウィンドウに WM_PAINT メッセージを送信することによって、指定されたウィンドウのクライアント領域を更新します。この関数は、指定されたウィンドウのウィンドウ プロシージャに WM_PAINT メッセージを直接送信し、アプリケーションキューをバイパスします。更新領域が空の場合、メッセージは送信されません。BOOL UpdateWindow(
HWND hWnd // ウィンドウのハンドル
);
パラメータ
hWnd
更新するウィンドウへのハンドル。
戻り値
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: Winuser.h ( Windows.h を含む )
WM_CREATE メッセージ
アプリケーションが、CreateWindowEx または CreateWindow 関数を呼び出すことによって、ウィンドウを作成することを要求したときに送信されます。(メッセージは、関数が戻る前に送信されます。) 新しいウィンドウのウィンドウ プロシージャは、ウィンドウの作成、ウィンドウが表示される前にこのメッセージを受け取ります。ウィンドウは、WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_CREATE 0x0001
パラメータ
wParam
このパラメータは使用されません。
lParam
作成されるウィンドウに関する情報を含む CREATESTRUCT 構造体へのポインタ。
戻り値
アプリケーションがこのメッセージを処理する場合、ウィンドウの作成を続行するには、0 を返す必要があります。アプリケーションが -1 を返した場合、ウィンドウが破壊され、、CreateWindowEx または CreateWindow 関数は、NULL ハンドルを返します。
アプリケーションがこのメッセージを処理する場合、ウィンドウの作成を続行するには、0 を返す必要があります。アプリケーションが -1 を返した場合、ウィンドウが破壊され、、CreateWindowEx または CreateWindow 関数は、NULL ハンドルを返します。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: Winuser.h ( Windows.h を含む )
DwmExtendFrameIntoClientArea 関数
ウィンドウフレームをクライアント領域に拡張します。DWMAPI DwmExtendFrameIntoClientArea(
HWND hWnd,
const MARGINS *pMarInset
);
パラメータ
hWnd
フレームがクライアント領域に拡張されるウィンドウへのハンドル。
戻り値
この関数が成功すると、S_OK 返します。それ以外の場合は、HRESULT エラー コードを返します。
この関数が成功すると、S_OK 返します。それ以外の場合は、HRESULT エラー コードを返します。
解説
この関数は、デスクトップウィンドウマネージャ(DWM)の構成が切り替えられるたびに呼び出す必要があります。コンポジション変更通知の WM_DWMCOMPOSITIONCHANGED メッセージを処理します。
負の余白値を使用して、クライアント領域がウィンドウ境界のないソリッドサーフェスとしてレンダリングされる「ガラスシート」効果を作成します。
この関数は、デスクトップウィンドウマネージャ(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
ヘッダ: 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
ヘッダ: uxtheme.h
WM_NCLBUTTONDOWN メッセージ
カーソルがウィンドウの非クライアント領域内にあるときに、ユーザーがマウスの左ボタンを押したときにポストされます。このメッセージは、カーソルを含むウィンドウにポストされます。ウィンドウがマウスをキャプチャした場合、このメッセージはポストされません。ウィンドウは、 WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_NCLBUTTONDOWN 0x00A1
パラメータ
wParam
WM_NCHITTEST メッセージを処理した結果として DefWindowProc 関数によって返されるヒットテスト値。ヒットテスト値の一覧については、WM_NCHITTEST を参照してください。
戻り値
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
解説
DefWindowProc 関数は、指定されたポイントをテストしてカーソルの位置を見つけ、適切なアクションを実行します。必要に応じて、defWindowProc は、WM_SYSCOMMAND メッセージをウィンドウに送信します。また、GET_X_LPARAM と GET_Y_LPARAM マクロを使用して、lParam から x 座標と y 座標の値を抽出することもできます。
DefWindowProc 関数は、指定されたポイントをテストしてカーソルの位置を見つけ、適切なアクションを実行します。必要に応じて、defWindowProc は、WM_SYSCOMMAND メッセージをウィンドウに送信します。また、GET_X_LPARAM と GET_Y_LPARAM マクロを使用して、lParam から x 座標と y 座標の値を抽出することもできます。
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: Winuser.h ( Windows.h を含む )
WM_NCHITTEST メッセージ
ウィンドウのどの部分が特定の画面座標に対応するかを決定するために、ウィンドウに送信されます。これは、カーソルが移動したとき、マウスボタンが押されたときまたは離されたとき、または WindowFromPoint などの関数への呼び出しに応答して発生する場合があります。マウスがキャプチャされていない場合、メッセージはカーソルの下のウィンドウに送信されます。それ以外の場合、メッセージはマウスをキャプチャしたウィンドウに送信されます。ウィンドウは、 WindowProc 関数を介してこのメッセージを受け取ります。
#define WM_ NCHITTEST 0x0084
パラメータ
wParam
このパラメータは使用されません。
lParam
下位ワードは、カーソルの x 座標を指定します。座標は、クライアント領域の左上隅を基準とします。
上位ワードは、カーソルの y 座標を指定します。座標は、クライアント領域の左上隅を基準とします。
上位ワードは、カーソルの y 座標を指定します。座標は、クライアント領域の左上隅を基準とします。
戻り値
DefWindowProc 関数の戻り値は、カーソルのホットスポットの位置を示す次のいずれかの値です。
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 5 | メニュー。 |
HTMAXBUTTON 9 | 最大化 ボタン。 |
HTMINBUTTON 8 | 最小化 ボタン。 |
HTNOWHERE 0 | 画面の背景またはウィンドウ間の分割線上。 |
HTREDUCE 8 | 最小化 ボタン。 |
HTRIGHT 11 | サイズ変更可能なウィンドウの右側の境界線(ユーザーはマウスをクリックしてウィンドウを水平方向にサイズ変更できます)。 |
HTSIZE 4 | サイズボックス(HTGROWBOX と同じ)。 |
HTSYSMENU 3 | ウィンドウメニューまたは子ウィンドウの 閉じる ボタン。 |
HTTOP 12 | ウィンドウの水平方向の境界線。 |
HTTOPLEFT 13 | ウィンドウ境界の左上隅。 |
HTTOPRIGHT 14 | 最大化ボタン。 |
HTTRANSPARENT -1 | 同じスレッド内の別のウィンドウによって現在カバーされているウィンドウ内(メッセージの1つが HTTRANSPARENT ではないコードを返すまで、メッセージは同じスレッド内の基になるウィンドウに送信されます)。 |
HTVSCROLL 7 | 垂直スクロールバー。 |
HTZOOM 9 | ウィンドウ境界の左上隅。 |
解説
水平位置と垂直位置を取得するには、次のコードを使用します。
Windows Vista: 標準のキャプションボタンを含むカスタムフレームを作成する場合、このメッセージはまず DwmDefWindowProc 関数に渡す必要があります。これにより、デスクトップウィンドウマネージャー(DWM)は、キャプションボタンのヒットテストを提供します。DwmDefWindowProc がメッセージを処理しない場合は、WM_NCHITTEST の処理が必要になる場合があります。
水平位置と垂直位置を取得するには、次のコードを使用します。
xPos = GET_X_LPARAM(lParam);上で説明したように、x 座標は戻り値の下位の short、y 座標は、上位の short(複数のモニターを持つシステムで負の値を取ることができるので、どちらも符号付きの値を表します)にあります。戻り値が変数に割り当てられている場合は、MAKEPOINTS マクロを使用して、戻り値から POINTS 構造体を取得できます。GET_X_LPARAM または GET_Y_LPARAM マクロを使用して、x 座標または y 座標を抽出することもできます。
yPos = GET_Y_LPARAM(lParam);
重要
これらのマクロは複数のモニターを持つシステムで誤った結果を返すため、LOWORD または HIWORD マクロを使用してカーソル位置の x 座標と y 座標を抽出しないでください。複数のモニタを搭載したシステムは負の x 座標と y 座標を持ち、LOWORD と HIWORD は座標を符号なしの量として扱います。
これらのマクロは複数のモニターを持つシステムで誤った結果を返すため、LOWORD または HIWORD マクロを使用してカーソル位置の x 座標と y 座標を抽出しないでください。複数のモニタを搭載したシステムは負の x 座標と y 座標を持ち、LOWORD と HIWORD は座標を符号なしの量として扱います。
Windows Vista: 標準のキャプションボタンを含むカスタムフレームを作成する場合、このメッセージはまず DwmDefWindowProc 関数に渡す必要があります。これにより、デスクトップウィンドウマネージャー(DWM)は、キャプションボタンのヒットテストを提供します。DwmDefWindowProc がメッセージを処理しない場合は、WM_NCHITTEST の処理が必要になる場合があります。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: 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 座標を指定します。座標は、クライアント領域の左上隅を基準とします。
上位ワードは、カーソルの y 座標を指定します。座標は、クライアント領域の左上隅を基準とします。
戻り値
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
解説
水平方向と垂直方向の位置を取得するには、次のコードを使用します。
Alt キーが押されたことを検出するには、VK_MENU < 0 かどうかを GetKeyState で確認します。これは GetAsyncKeyState であってはならないことに注意してください。
水平方向と垂直方向の位置を取得するには、次のコードを使用します。
xPos = GET_X_LPARAM(lParam);上で説明したように、x 座標は戻り値の下位の short、y 座標は、上位の short(複数のモニターを持つシステムで負の値を取ることができるので、どちらも符号付きの値を表します)にあります。戻り値が変数に割り当てられている場合は、MAKEPOINTS マクロを使用して、戻り値から POINTS 構造体を取得できます。GET_X_LPARAM または GET_Y_LPARAM マクロを使用して、x 座標または y 座標を抽出することもできます。
yPos = GET_Y_LPARAM(lParam);
重要
これらのマクロは複数のモニターを持つシステムで誤った結果を返すため、LOWORD または HIWORD マクロを使用してカーソル位置の x 座標と y 座標を抽出しないでください。複数のモニタを搭載したシステムは負の x 座標と y 座標を持ち、LOWORD と HIWORD は座標を符号なしの量として扱います。
これらのマクロは複数のモニターを持つシステムで誤った結果を返すため、LOWORD または HIWORD マクロを使用してカーソル位置の x 座標と y 座標を抽出しないでください。複数のモニタを搭載したシステムは負の x 座標と y 座標を持ち、LOWORD と HIWORD は座標を符号なしの量として扱います。
Alt キーが押されたことを検出するには、VK_MENU < 0 かどうかを GetKeyState で確認します。これは GetAsyncKeyState であってはならないことに注意してください。
必要条件
ヘッダ: Winuser.h ( Windows.h を含む )
ヘッダ: Winuser.h ( Windows.h を含む )
ClientToScreen 関数
ClientToScreen 関数は、指定したポイントのクライアント領域座標をスクリーン座標に変換します。BOOL ClientToScreen(
HWND hWnd,
LPPOINT lpPoint);
パラメータ
hWnd
変換に使用されるクライアント領域を持つウィンドウへのハンドル。
戻り値
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
解説
ClientToScreen 関数は、POINT 構造体のクライアント領域座標をスクリーン座標に置き換えます。スクリーン座標は、画面の左上隅を基準にしています。ウィンドウのクライアント領域の上にあるスクリーン座標点は、負の y 座標です。同様に、クライアント領域の左側にあるスクリーン座標は負の x 座標です。
すべての座標はデバイス座標です。
ClientToScreen 関数は、POINT 構造体のクライアント領域座標をスクリーン座標に置き換えます。スクリーン座標は、画面の左上隅を基準にしています。ウィンドウのクライアント領域の上にあるスクリーン座標点は、負の y 座標です。同様に、クライアント領域の左側にあるスクリーン座標は負の x 座標です。
すべての座標はデバイス座標です。
必要条件
ヘッダ: winuser.h ( Windows.h を含む )
ヘッダ: winuser.h ( Windows.h を含む )
LoadMenu 関数
アプリケーションインスタンスに関連付けられている実行可能(.exe)ファイルから、指定されたメニューリソースを読み込みます。HMENU LoadMenu(
HINSTANCE hInstance,
LPCSTR lpMenuName
);
パラメータ
hInstance
読み込まれるメニュー リソースを含むモジュールへのハンドル。
lpMenuName
メニューリソースの名前。あるいは、このパラメータは、下位ワードのリソース ID と上位ワードの 0 で構成できます。この値を作成するには、MAKEINTRESOURCE マクロを使用します。
解説
DestroyMenu 関数は、アプリケーションが終了する前に、読み込まれたメニューが占めるメニューと空きメモリを破棄するために使用されます。
DestroyMenu 関数は、アプリケーションが終了する前に、読み込まれたメニューが占めるメニューと空きメモリを破棄するために使用されます。
! 注意
winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして LoadMenu を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
winuser.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして LoadMenu を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
必要条件
ヘッダ: winuser.h ( Windowsx.h をインクルード )
ヘッダ: winuser.h ( Windowsx.h をインクルード )
GetSubMenu 関数
指定したメニュー項目によってアクティブ化されたドロップダウンメニューまたはサブメニューへのハンドルを取得します。HMENU GetSubMenu(
HMENU hMenu,
int nPos
);
パラメータ
hMenu
メニューへのハンドル。
nPos
ドロップダウンメニューまたはサブメニューをアクティブにする項目の指定されたメニュー内の 0 から始まる相対位置。
戻り値
関数が成功した場合、戻り値はメニュー項目によってアクティブ化されたドロップダウンメニューまたはサブメニューへのハンドルになります。メニュー項目がドロップダウンメニューまたはサブメニューをアクティブにしていない場合、戻り値は NULL になります。
関数が成功した場合、戻り値はメニュー項目によってアクティブ化されたドロップダウンメニューまたはサブメニューへのハンドルになります。メニュー項目がドロップダウンメニューまたはサブメニューをアクティブにしていない場合、戻り値は NULL になります。
必要条件
ヘッダ: winuser.h ( Windows.h を含む )
ヘッダ: 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 フラグは無視されます。 詳細については、SystemParametersInfo の SPI_GETMENUFADE フラグを参照してください。
TPM_RECURSE フラグを使用して、別のメニューがすでに表示されているときにメニューを表示します。 これは、メニュー内のコンテキストメニューをサポートすることを目的としています。
右から左へのテキストレイアウトの場合は、TPM_LAYOUTRTL を使用します。 デフォルトでは、テキストのレイアウトは左から右です。
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 を呼び出します。
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 を呼び出したアプリケーションにタスクを強制的に切り替える必要があります。これは、次のコード サンプルに示すように、問題のないメッセージをウィンドウまたはスレッドにポストすることによって行われます。
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 を含む )
ヘッダ: winuser.h ( Windows.h を含む )
パラメータ
hMenu
破棄されるメニューへのハンドル。
解説
終了する前に、アプリケーションは DestroyMenu 関数を使用して、ウィンドウに割り当てられていないメニューを破棄する必要があります。ウィンドウに割り当てられたメニューは、アプリケーションが閉じると自動的に破棄されます。
DestroyMenu は再帰的なものであり、メニューとそのサブメニューをすべて破壊します。
終了する前に、アプリケーションは DestroyMenu 関数を使用して、ウィンドウに割り当てられていないメニューを破棄する必要があります。ウィンドウに割り当てられたメニューは、アプリケーションが閉じると自動的に破棄されます。
DestroyMenu は再帰的なものであり、メニューとそのサブメニューをすべて破壊します。
必要条件
ヘッダ: winuser.h ( Windows.h を含む )
ヘッダ: winuser.h ( Windows.h を含む )
SetTimer 関数
指定されたタイムアウト値を持つタイマーを作成します。UINT_PTR SetTimer(
HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
パラメータ
hWnd
タイマーに関連付けるウィンドウへのハンドル。このウィンドウは、呼び出し元のスレッドが所有している必要があります。hWnd の NULL 値が既存のタイマーの nIDEvent と共に渡された場合、そのタイマーは既存の NULL 以外の hWnd タイマーと同じ方法で置き換えられます。
nIDEvent
0 以外のタイマ識別子。hWnd パラメータが NULL で、nIDEvent が既存のタイマーと一致しない場合は無視され、新しいタイマー ID が生成されます。hWnd パラメータが NULL で、hWnd で指定されたウィンドウに既に nIDEvent という値のタイマーがある場合、既存のタイマーは新しいタイマーに置き換えられます。SetTimer がタイマーを置き換える場合、タイマーはリセットされます。したがって、現在のタイムアウト値が経過した後にメッセージが送信されますが、以前に設定されたタイムアウト値は無視されます。呼び出しが既存のタイマーを置き換えることを意図していない場合、hWnd が NULL の場合、nIDEvent は 0 である必要があります。
uElapse
タイムアウト値(ミリ秒単位)。
uElapse が USER_TIMER_MINIMUM(0x0000000A)未満の場合、タイムアウトはUSER_TIMER_MINIMUM に設定されます。uElapse が USER_TIMER_MAXIMUM(0x7FFFFFFF)より大きい場合、タイムアウトはUSER_TIMER_MAXIMUM に設定されます。
uElapse が USER_TIMER_MINIMUM(0x0000000A)未満の場合、タイムアウトはUSER_TIMER_MINIMUM に設定されます。uElapse が USER_TIMER_MAXIMUM(0x7FFFFFFF)より大きい場合、タイムアウトはUSER_TIMER_MAXIMUM に設定されます。
lpTimerFunc
戻り値
関数が成功し、hWnd パラメータが NULL の場合、戻り値は新しいタイマーを識別する整数です。アプリケーションは、この値を KillTimer 関数に渡して、タイマーを破棄できます。
関数が成功し、hWnd パラメータが NULL でない場合、戻り値は 0 以外の整数になります。アプリケーションは、タイマーを破棄する KillTimer 関数に nIDEvent パラメータの値を渡すことができます。
関数がタイマーの作成に失敗した場合、戻り値は 0 です。拡張エラー情報を取得するには、GetLastError を呼び出します。
関数が成功し、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 は、関連付けられているウィンドウに固有です。別のウィンドウは、別のウィンドウが所有するタイマーと同じ識別子を持つ独自のタイマーを持つことができます。タイマーは異なります。
設定タイマーは、hWnd が NULL の場合にタイマー ID を再利用できます。
アプリケーションは、ウィンドウプロシージャに WM_TIMER case ステートメントを含めること、またはタイマーの作成時に TimerProc コールバック関数を指定することにより、WM_TIMER メッセージを処理できます。TimerProc コールバック関数を指定すると、既定のウィンドウプロシージャは、WM_TIMER を処理するときにコールバック関数を呼び出します。したがって、WM_TIMER を処理する代わりに TimerProc を使用する場合でも、呼び出し元のスレッドでメッセージをディスパッチする必要があります。
WM_TIMER メッセージの wParam パラメータには、nIDEvent パラメータの値が含まれています。
タイマー識別子 nIDEvent は、関連付けられているウィンドウに固有です。別のウィンドウは、別のウィンドウが所有するタイマーと同じ識別子を持つ独自のタイマーを持つことができます。タイマーは異なります。
設定タイマーは、hWnd が NULL の場合にタイマー ID を再利用できます。
必要条件
ヘッダ: winuser.h ( Windows.h を含む )
ヘッダ: winuser.h ( Windows.h を含む )
パラメータ
uIDEvent
破棄するタイマー。SetTimer に渡されたウィンドウ ハンドルが有効な場合、このパラメータは nIDEvent と同じである必要があります。
値が SetTimer に渡されます。アプリケーションが hWnd を NULL に設定して SetTimer を呼び出す場合、このパラメータは SetTimer によって返されるタイマー識別子である必要があります。
値が SetTimer に渡されます。アプリケーションが hWnd を NULL に設定して SetTimer を呼び出す場合、このパラメータは SetTimer によって返されるタイマー識別子である必要があります。
必要条件
ヘッダ: winuser.h ( Windows.h を含む )
ヘッダ: winuser.h ( Windows.h を含む )
WM_TIMER メッセージ
タイマーの期限が切れたときに、インストールスレッドのメッセージ キューにポストされます。メッセージは、GetMessage 関数または PeekMessage 関数によってポストされます。#define WM_TIMER 0x0113
パラメータ
wParam
タイマー識別子。
戻り値
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
解説
ウィンドウ プロシージャに WM_TIMER case を指定して、メッセージを処理できます。それ以外の場合、。DispatchMessage は、タイマーをインストールするために使用する SetTimer 関数の呼び出しで指定された TimerProc コールバック関数を呼び出します。WM_TIMER メッセージは、低優先度のメッセージです。GetMessage 関数と PeekMessage 関数は、スレッドのメッセージキューに他の優先度の高いメッセージがない場合にのみ、このメッセージをポストします。
ウィンドウ プロシージャに WM_TIMER case を指定して、メッセージを処理できます。それ以外の場合、。DispatchMessage は、タイマーをインストールするために使用する SetTimer 関数の呼び出しで指定された TimerProc コールバック関数を呼び出します。WM_TIMER メッセージは、低優先度のメッセージです。GetMessage 関数と PeekMessage 関数は、スレッドのメッセージキューに他の優先度の高いメッセージがない場合にのみ、このメッセージをポストします。
必要条件
ヘッダ: Winbase.h ( Windows.h を含む )
ヘッダ: 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 を含む )
ヘッダ: 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 を返します。
アプリケーションがこのメッセージを処理する場合は、0 を返します。
例
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)GitHub の Windows Classic Samples の例。
{
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);
}
解説
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 であると見なし、そのデバイス コンテキストを使用して描画します。
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 を含む )
ヘッダ: Winuser.h ( Windows.h を含む )
ValidateRect 関数
ValidateRect 関数は、指定したウィンドウの更新領域から四角形を削除することで、四角形内のクライアント領域を検証します。BOOL ValidateRect(
HWND hWnd,
const RECT *lpRect
);
パラメータ
hWnd
更新領域を変更するウィンドウへのハンドル。このパラメータが NULL の場合、システムはすべてのウィンドウを無効にして再描画し、WM_ERASEBKGND および WM_NCPAINT メッセージをウィンドウプロシージャに送信してから関数が返ります。
lpRect
更新領域から削除する四角形のクライアント座標を格納する RECT 構造体へのポインタ。このパラメータが NULL の場合、クライアント領域全体が削除されます。
戻り値
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
関数が成功した場合、戻り値は 0 以外になります。
関数が失敗した場合、戻り値は 0 です。
解説
BeginPaint 関数は、クライアント領域全体を自動的に検証します。次の WM_PAINT メッセージが生成される前に更新領域の一部を検証する必要がある場合は、ValidateRect 関数も ValidateRgn 関数も呼び出す必要はありません。
現在の更新領域が検証されるまで、システムは WM_PAINT メッセージを生成し続けます。
BeginPaint 関数は、クライアント領域全体を自動的に検証します。次の WM_PAINT メッセージが生成される前に更新領域の一部を検証する必要がある場合は、ValidateRect 関数も ValidateRgn 関数も呼び出す必要はありません。
現在の更新領域が検証されるまで、システムは WM_PAINT メッセージを生成し続けます。
必要条件
ヘッダ: winuser.h ( Windows.h を含む )
ヘッダ: winuser.h ( Windows.h を含む )
パラメータ
wParam
このパラメーターは使用されません。
lParam
ウィンドウのクライアント領域の左上隅の x 座標と y 座標。下位ワードには x 座標が含まれ、上位ワードには y 座標が含まれます。
戻り値
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
アプリケーションがこのメッセージを処理する場合は、0 を返す必要があります。
解説
パラメータは、オーバーラップウィンドウとポップアップウィンドウの画面座標で、子ウィンドウの親クライアント座標で指定されます。
次の例は、lParam パラメータから位置を取得する方法を示しています。
DefWindowProc 関数は、WM_WINDOWPOSCHANGED メッセージを処理するときに、WM_SIZE と WM_MOVE メッセージを送信します。アプリケーションが DefWindowProc を呼び出さずに WM_WINDOWPOSCHANGED メッセージを処理する場合、WM_SIZE および WM_MOVE メッセージは送信されません。
パラメータは、オーバーラップウィンドウとポップアップウィンドウの画面座標で、子ウィンドウの親クライアント座標で指定されます。
次の例は、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 を含む )
ヘッダ: 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 ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして DefWindowProc を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
必要条件
ヘッダ: winuser.h ( Windows.h を含む )
ヘッダ: winuser.h ( Windows.h を含む )
RegDeleteValue関数
指定したレジストリ キーから名前付きの値を削除します。値名では大文字と小文字が区別されないことに注意してください。LSTATUS RegDeleteValue(
HKEY hKey,
LPCSTR lpValueName
);
パラメータ
hKey
開いているレジストリ キーへのハンドル。キーは、KEY_SET_VALUEアクセス権で開かれている必要があります。詳細については、Registry Key Security and Access Rights を参照してください。
このハンドルは、RegCreateKeyEx、RegCreateKeyTransacted、RegOpenKeyEx、または RegOpenKeyTransacted 関数によって返されます。また、次の predefined keys(定義済みキー) の 1 つでも使用できます。
このハンドルは、RegCreateKeyEx、RegCreateKeyTransacted、RegOpenKeyEx、または 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 を参照してください。
詳細については、 Registry Element Size Limits を参照してください。
戻り値
関数が成功した場合、戻り値は ERROR_SUCCESS。
関数が失敗した場合、戻り値は Winerror.h で定義された 0 以外のエラーコードです。FormatMessage 関数を FORMAT_MESSAGE_FROM_SYSTEM フラグと共に使用すると、エラーの一般的な説明を取得できます。
関数が成功した場合、戻り値は ERROR_SUCCESS。
関数が失敗した場合、戻り値は Winerror.h で定義された 0 以外のエラーコードです。FormatMessage 関数を FORMAT_MESSAGE_FROM_SYSTEM フラグと共に使用すると、エラーの一般的な説明を取得できます。
解説
! 注意
winreg.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして RegDeleteValue を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
winreg.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして RegDeleteValue を定義します。エンコーディングに依存しないエイリアスとエンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーが発生する不一致が発生する可能性があります。詳細については、Conventions for Function Prototypes を参照してください。
必要条件
ヘッダ: winreg.h ( Windows.h を含む )
ヘッダ: 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 キーワードは型ではなく、次のキーワードでの使用はサポートされていません。
エラー チェックに null ポインター値を使用する言語間の関数呼び出しは、正しく解釈される必要があります。
ハンドルを 0 に初期化することはできません。使用できるのは nullptr だけです。オブジェクトハンドルに定数 0 を代入すると、ボックス化された Int32 が生成され、Object^ にキャストされます。
nullptr キーワードは、ハンドル、ネイティブポインタ、または関数引数を使用できる場所であればどこでも使用できます。nullptr キーワードは型ではなく、次のキーワードでの使用はサポートされていません。
- sizeof
- typeid
- throw nullptr(ただし throw (Object^)nullptr; は機能します)
- ネイティブポインタ
- Windows ランタイムハンドル
- マネージハンドル
- マネージ内部ポインタ
エラー チェックに null ポインター値を使用する言語間の関数呼び出しは、正しく解釈される必要があります。
ハンドルを 0 に初期化することはできません。使用できるのは nullptr だけです。オブジェクトハンドルに定数 0 を代入すると、ボックス化された Int32 が生成され、Object^ にキャストされます。
例
ハンドル、ネイティブポインタ、または関数の引数を使用できる場所であれば、nullptr キーワードを使用できることを示すコード例を次に示します。この例では、nullptr キーワードを使用して、参照を使用する前に参照をチェックできることを示しています。
ハンドル、ネイティブポインタ、または関数の引数を使用できる場所であれば、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_ptrpV2 = nullptr;
// ポインタを使用する前の参照チェック。
if (pN == nullptr) {}
if (pG == nullptr) {}
if (pV1 == nullptr) {}
if (pV2 == nullptr) {}
// nullptr は関数の引数として使用できます。
f(nullptr); // 呼び出し f(System::Object ^)
}
例
次のコード例は、nullptr と 0 をネイティブポインタで同じ意味で使用できることを示しています。
次のコード例は、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 は型に明示的にキャストする必要があります。
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 値を含むキャスト型へのポインタまたはハンドルを返すコード例を次に示します。
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 を関数パラメータとして使用できることを示しています。
次のコード例は、nullptr を関数パラメータとして使用できることを示しています。
// mcpp_nullptr_4.cpp出力
// compile with: /clr
using namespace System;
void f(Object ^ x) {
Console::WriteLine("test");
}
int main() {
f(nullptr);
}
test
例
次のコード例は、ハンドルが宣言され、明示的に初期化されていない場合、既定で nullptr に初期化されることを示しています。
次のコード例は、ハンドルが宣言され、明示的に初期化されていない場合、既定で 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 を割り当てることができることを示しています。
次のコード例は、/clr を使用してコンパイルするときに、ネイティブポインタに nullptr を割り当てることができることを示しています。
// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
int * i = 0;
int * j = nullptr;
}
必要条件
コンパイラオプション: (必須ではありません。 /ZW や /clr など、すべてのコード生成オプションでサポートされています。)
コンパイラオプション: (必須ではありません。 /ZW や /clr など、すべてのコード生成オプションでサポートされています。)
const(C++)
データ宣言を変更する場合、const キーワードは、オブジェクトまたは変数が変更可能でないことを指定します。const declaration ;
member-function const ;
const 値
const キーワードは、変数の値が定数であることを指定し、プログラマが変数を変更できないようにコンパイラに指示します。
const キーワードは、ポインタの宣言でも使用できます。
const として宣言されたオブジェクトの場合、定数メンバ関数のみを呼び出すことができます。これにより、定数オブジェクトが変更されることはありません。
const キーワードは、変数の値が定数であることを指定し、プログラマが変数を変更できないようにコンパイラに指示します。
// constant_values1.cppC++ では、#define プリプロセッサ ディレクティブの代わりに const キーワードを使用して定数値を定義できます。const で定義された値は型チェックの対象となり、定数式の代わりに使用できます。C++ では、次のように const 変数を使用して配列のサイズを指定できます。
int main() {
const int i = 5;
i = 10; // C3892
i++; // C2105
};
// constant_values2.cppC では、定数値は既定で外部リンケージに設定されるため、ソースファイルにのみ表示されます。C++ では、定数値は既定で内部リンケージに設定され、ヘッダーファイルに表示されます。
// compile with: /c
const int maxarray = 255;
char store_char[maxarray]; // C++ で許可されています。C では許可されていません
const キーワードは、ポインタの宣言でも使用できます。
// constant_values3.cppconst として宣言された変数へのポインタは、const としても宣言されているポインタにのみ割り当てることができます。
int main() {
char *mybuf = 0, *yourbuf;
char *const aptr = mybuf;
*aptr = 'a'; // OK
aptr = yourbuf; // C3892
}
// 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 キーワードを配置します。定数キーワードは、宣言と定義の両方で必要です。
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 として宣言する場合は、次のようにします。
変数を 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 キーワードは、関数が呼び出されるオブジェクトを変更しないことを指定します。
const の詳細については、次のトピックを参照してください。
- const と volatile ポインタ
- 型修飾子(C 言語リファレンス)
- volatile
- #define
スコープ解決演算子: ::
スコープ解決演算子 :: は、異なるスコープで使用される識別子を識別し、あいまいさを解消するために使用されます。スコープの詳細については、Scope を参照してください。:: identifier
class-name :: identifier
namespace :: identifier
enum class :: identifier
enum struct :: identifier
解説
identifier には、変数、関数、または列挙値を指定できます。
クラスと名前空間の使用
次の例は、名前空間とクラスでスコープ解決演算子を使用する方法を示しています。
identifier には、変数、関数、または列挙値を指定できます。
クラスと名前空間の使用
次の例は、名前空間とクラスでスコープ解決演算子を使用する方法を示しています。
namespace NamespaceA{スコープ修飾子のないスコープ解決演算子は、グローバル名前空間を参照します。
int x;
class ClassA {
public:
int x;
};
}
int main() {
// あいまいさを解消するために使用される名前空間名
NamespaceA::x = 1;
// あいまいさを解消するために使用されるクラス名
NamespaceA::ClassA a1;
a1.x = 2;
}
namespace NamespaceA{スコープ解決演算子を使用して、名前空間のメンバを識別したり、using ディレクティブでメンバの名前空間を指定する名前空間を識別したりできます。次の例では、名前空間 NamespaceB で ClassB が宣言された場合でも、NamespaceC を使用して ClassB を修飾できます。これは、NamespaceB は using ディレクティブによって NamespaceC に指定されているためです。
int x;
}
int x;
int main() {
int x;
// main() の x
x = 0;
// グローバル名前空間の x
::x = 1;
// A 名前空間の x
NamespaceA::x = 2;
}
namespace NamespaceB {スコープ解決演算子のチェーンを使用できます。次の例では、NamespaceD::NamespaceD1 は入れ子になった名前空間 NamespaceD1 を識別し、NamespaceE::ClassE::ClassE1 は入れ子になったクラス ClassE1 を識別します。
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;
}
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 演算子は、const、volatile、または __unaligned 属性をキャストすることはできません。これらの属性の削除については、const_cast 演算子 を参照してください。
reinterpret_cast 演算子は、null ポインタ値を変換先の型の null ポインタ値に変換します。
reinterpret_cast の実際的な使用法の 1 つはハッシュ関数で、2 つの異なる値が同じインデックスで終わることはほとんどありません方法で値をインデックスにマップします。
reinterpret_cast オペレータの誤用は、簡単に安全ではありません。目的の変換が本質的に低レベルでない限り、他のキャスト演算子のいずれかを使用する必要があります。
reinterpret_cast 演算子は、char* から int* への変換、または本質的に安全でない One_class* から Unrelated_class* への変換に使用できます。
reinterpret_cast の結果は、元の型にキャストバックされる以外の目的では安全に使用できません。その他の用途は、せいぜいポータブルではない。
reinterpret_cast 演算子は、const、volatile、または __unaligned 属性をキャストすることはできません。これらの属性の削除については、const_cast 演算子 を参照してください。
reinterpret_cast 演算子は、null ポインタ値を変換先の型の null ポインタ値に変換します。
reinterpret_cast の実際的な使用法の 1 つはハッシュ関数で、2 つの異なる値が同じインデックスで終わることはほとんどありません方法で値をインデックスにマップします。
#include <iostream>reinterpret_cast を使用すると、ポインタを整数型として扱うことができます。その結果、ビットシフトと XORed がそれ自体を使用して一意のインデックスを生成します(高い確率で一意)。次に、関数の戻り値の型に対して標準 C スタイルのキャストによって、インデックスが切り捨てられます。
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
次のページ >
コメント