2

フォーマットを調べずに .cur ファイルの高さと幅を取得したい。

LoadCursorFromFile() を使用して HCURSOR を取得しようとしました。HCURSOR 情報を取得するための API 関数があると思いますが、GetCursorInfo() はまったく必要ないことがわかりました。

HCURSOR オブジェクトの高さと幅を取得する方法はありますか?

4

3 に答える 3

6

この回答は古くなっています

代わりに23Wの回答を参照してください。それは私には正しいように見えます。

Raymond Chen は、システム メトリックがディスプレイ アダプターによって実装されたハードウェア カーソルのサイズであったことを説明するブログ投稿を行っています。カーソルは最新のディスプレイ ハードウェアの機能ではなくなったため、これらの値は廃止されていますが、OS は下位互換性のために値を報告しています。SM_CXCURSORSM_CYCURSOR

これを私の注意に向けてくれた@SO_fix_the_vote_sorting_bugのコメントに感謝します。


歴史的背景に対する独自の回答

Windows のアイコンとカーソルの間の API には重複があります。GetIconInfoExHCURSOR と HICON を使用して呼び出すことができます。返される構造には、ホットスポットに関する情報が含まれています。

実際のサイズを取得する方法がわかりません。技術的には、すべてのカーソル アイコンは固定サイズであり、システムに ( を使用してGetSystemMetrics)SM_CXCURSORおよびを要求することで取得できますSM_CYCURSOR。小さく見えるものは実際にはそのサイズであり、透明なピクセルがたくさんあるだけです。見かけのサイズを知る必要がある場合は、マスクを抽出し、ビットをスキャンして境界の四角形を把握する必要があります。

于 2010-03-16T15:17:32.667 に答える
6

任意のカーソル用のユニバーサル 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;
}
于 2012-11-08T18:22:00.683 に答える
1

MSDNから:

システムは他のサイズのカーソルを作成できないため、nWidth パラメーターと nHeight パラメーターは、現在のディスプレイ ドライバーでサポートされている幅と高さを指定する必要があります。ディスプレイ ドライバーでサポートされている幅と高さを確認するには、GetSystemMetrics 関数を使用して、SM_CXCURSOR または SM_CYCURSOR の値を指定します。

于 2009-11-09T17:30:59.047 に答える