1

CStatic コントロールに次の問題があります。

関数を呼び出すとSetIcon:

    m_CStatic.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));

サイズが 14x14 ピクセルのアイコンをロードしますが、コントロールの実際のサイズは 21x20 になり、変更できません。

私は電話しようとしました:

    m_CStatic.SetWindowPos(NULL,0 , 0, 14, 14, SWP_NOMOVE);

ただし、アイコンのサイズを変更せずにサイズをカットするだけです。その結果、ズームされた画像の一部があります。

ロードするアイコンのサイズを設定する方法はありますか?

編集

の実際のサイズIDI_ICON114x14ピクセルです。

また、CStaticコントロールのサイズは21x20で、デザイナーで変更できません。

アイコンをロードすると、アイコンが引き伸ばされます。理由がわかりません。

4

2 に答える 2

1

の実際のサイズIDI_ICON1は14x14ピクセルです。

また、CStaticコントロールのサイズは21x20で、デザイナーで変更することはできません。

デザイナでコントロールのサイズを確認している場合、ここではリンゴとリンゴを比較していません。設計者は、ピクセルではなく、 DLU(ダイアログボックス単位)でコントロールのサイズを報告しています。

DLUとピクセルの間には必ずしも1対1のマッピングがあるとは限りません。実際、DLUの要点は、ピクセルに依存しないということです。1つのDLUで表される実際のピクセル数は、アプリケーションを実行しているコンピューターのフォントとDPIによって異なります。

ですから、あなたが見ている行動は私には完全に理にかなっています。

このDLUとピクセルの愚かさが信じられない場合は、デバッガーでアプリケーションを実行し、Spy ++を使用して静的コントロールの実際のサイズ(ピクセル単位)を調べてみてください。14x14だと思います。

いいえ、アイコンを表示するように設定されている場合、デザイナで静的コントロールのサイズを変更することはできません。コントロールは、表示しているアイコンに合わせて自動的にサイズ変更されます。これも仕様によるものです。なぜあなたがしたいのか想像できません。あなたの要点は、アイコンがクリップされたくないということのようです。

しかし、コメントで述べたように、静的コントロールはアイコンを自動的に拡大縮小しません。アイコンを自分でスケーリングするコードを作成する必要があります(おそらくDrawIconEx関数を呼び出すことによって)。静的コントロールにそれ自体のサイズを強制的に変更すると、アイコンがトリミングされるか、アイコンの周囲に境界線が追加されます。duDEが提案しSS_CENTERIMAGEたように、スタイルを追加すると、アイコンが静的コントロールの中央に配置されるようにこの動作が変更され、トリミングの方法が微妙に変わります。ただし、静的コントロールのサイズに合わせてトリミングされます。

ただし、注意してください。実際にあるアイコンに関するコメントでの私の質問の全体的なポイントはIDI_ICON1LoadIcon関数にはいくつかの重要な制限があるということです。つまり、SM_CXICONSM_CYICONサイズのアイコンのみをロードするように設計されています(ほとんどのシステムでは、32x32になります)。アイコンリソースにアイコンが1つしか定義されていない場合は期待どおりに機能しますが、そうでない場合は機能しなくなります。それがストレッチの説明だったのかもしれません。LoadImage代わりに、関数を使用することをお勧めします。コードはかなり冗長ですが、より強力な関数です。

HICON hIcon = static_cast<HICON>(AfxGetInstanceHandle(),
                                 MAKEINTRESOURCE(IDI_ICON1),
                                 IMAGE_ICON,
                                 14,   /* width (x dimension) */
                                 14,   /* height (y dimension) */
                                 LR_DEFAULTCOLOR));
// (make sure to call DestroyIcon() on hIcon when you're done with it!)
于 2013-03-10T12:03:35.450 に答える
0

これを試して:

CStatic m_CStatic;

// Create a child icon static control
m_CStatic.Create(_T("my static"), 
   WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE, CRect(0 , 0, 14, 14), pParentWnd);

// Set the icon
m_CStatic.SetIcon(::LoadIcon(IDI_ICON1));

ポイントはSS_CENTERIMAGEです。

ビットマップは、それを含む静的コントロールの中央に配置されます。コントロールのサイズは変更されないため、コントロールに対して大きすぎるビットマップはクリップされます。

于 2013-03-10T11:29:10.397 に答える