フォーマットを調べずに .cur ファイルの高さと幅を取得したい。
LoadCursorFromFile() を使用して HCURSOR を取得しようとしました。HCURSOR 情報を取得するための API 関数があると思いますが、GetCursorInfo() はまったく必要ないことがわかりました。
HCURSOR オブジェクトの高さと幅を取得する方法はありますか?
フォーマットを調べずに .cur ファイルの高さと幅を取得したい。
LoadCursorFromFile() を使用して HCURSOR を取得しようとしました。HCURSOR 情報を取得するための API 関数があると思いますが、GetCursorInfo() はまったく必要ないことがわかりました。
HCURSOR オブジェクトの高さと幅を取得する方法はありますか?
この回答は古くなっています
代わりに23Wの回答を参照してください。それは私には正しいように見えます。
Raymond Chen は、システム メトリックがディスプレイ アダプターによって実装されたハードウェア カーソルのサイズであったことを説明するブログ投稿を行っています。カーソルは最新のディスプレイ ハードウェアの機能ではなくなったため、これらの値は廃止されていますが、OS は下位互換性のために値を報告しています。SM_CXCURSOR
SM_CYCURSOR
これを私の注意に向けてくれた@SO_fix_the_vote_sorting_bugのコメントに感謝します。
歴史的背景に対する独自の回答
Windows のアイコンとカーソルの間の API には重複があります。GetIconInfoEx
HCURSOR と HICON を使用して呼び出すことができます。返される構造には、ホットスポットに関する情報が含まれています。
実際のサイズを取得する方法がわかりません。技術的には、すべてのカーソル アイコンは固定サイズであり、システムに ( を使用してGetSystemMetrics
)SM_CXCURSOR
およびを要求することで取得できますSM_CYCURSOR
。小さく見えるものは実際にはそのサイズであり、透明なピクセルがたくさんあるだけです。見かけのサイズを知る必要がある場合は、マスクを抽出し、ビットをスキャンして境界の四角形を把握する必要があります。
任意のカーソル用のユニバーサル C++ コード:
SIZE GetSize(HCURSOR ico)
{
SIZE res = {0};
if (ico)
{
ICONINFO info = {0};
if ( ::GetIconInfo(ico, &info)!=0 )
{
bool bBWCursor = (info.hbmColor==NULL);
BITMAP bmpinfo = {0};
if (::GetObject( info.hbmMask, sizeof(BITMAP), &bmpinfo)!=0)
{
res.cx = bmpinfo.bmWidth;
res.cy = abs(bmpinfo.bmHeight) / (bBWCursor ? 2 : 1);
}
::DeleteObject(info.hbmColor);
::DeleteObject(info.hbmMask);
}
}
return res;
}
MSDNから:
システムは他のサイズのカーソルを作成できないため、nWidth パラメーターと nHeight パラメーターは、現在のディスプレイ ドライバーでサポートされている幅と高さを指定する必要があります。ディスプレイ ドライバーでサポートされている幅と高さを確認するには、GetSystemMetrics 関数を使用して、SM_CXCURSOR または SM_CYCURSOR の値を指定します。