5

私は VB.NET 2005 で Windows フォームに取り組んでおり、画像付きのボタンがいくつか必要です (プレーンなバニラ System.Windows.Forms.Button について話しています)。すべてを希望どおりに設定しましたが、アイコンの下部がボタンの下部のほぼ真下にあり、画像の上に多くのスペースがあるなど、ボタンの画像が低すぎます。

ここにスクリーンショットがあります:
ボタンのスクリーンショット http://www.freeimagehosting.net/uploads/b28a5c63b8.jpg

アイコンの角がボタンの下部に押し付けられているのがわかりますか?

ボタンの高さは 23 ピクセルで、画像は 16 x 16 のアイコンです (ボタンの Image プロパティに割り当てることができるようにビットマップに変換されます)。

ボタンの Margin.All プロパティを 0 に設定しようとしましたが、Padding.All プロパティが 0 であることを確認しました。また、ボタンの ImageAlign を TopLeft、MiddleLeft、および BottomLeft に変更しようとしましたが、これらの設定のいずれも持っていないようですあらゆる影響。

ボタンの上端と下端から等距離になるように画像を配置する方法を知っている人はいますか? 必要に応じてボタンや画像のサイズを変更できますが、好みのサイズであり、可能であればそのままにしておきたいです。

4

3 に答える 3

9

同様の問題に遭遇しましたが、一生懸命考えて解決することができました。(そんなシチュエーションいいでしょ?)

説明

最初に、ImageAlign はボタン上のどこに画像を配置するかを意味するものではないことを理解することが重要です。これは、画像上のどのポイント (ピクセル) を配置に使用する必要があるかを意味します。したがって、「TopLeft」を選択すると、画像の左上端のピクセルがボタンの垂直方向の中央に配置されます。

ImageAlign が垂直方向に「中央」に設定され、サイズが偶数のピクセルである、画像が中央に配置されたボタンがある場合に問題が発生します。画像は 16x16 ピクセルです。16 は偶数です。中央のピクセルは、理論的にはピクセル 8 とピクセル 9 の間のどこかにあります。ピクセル 8.5 がないため、VB は 8 に切り捨てられ、ピクセル 8 がポジショニング ピクセルとして使用されます。これが、不要な上部マージンの根本的な原因です。

ボタンの高さは奇数ピクセル (23px) です。これは、真の中心ピクセル - ピクセル 12 があることを意味します。VB は、画像の中心ピクセル (8) をボタンの中心ピクセル (12) の上に配置しようとします。これにより、画像の 8 ピクセルが中央より下に配置され、7 ピクセルが中央より上に配置されます。均一にするために、画像の上に 1 ピクセルの余白が表示されます。

ソリューション

画像の下部に 1 行のピクセルを追加してパディングします。画像の高さが奇数 (17 ピクセル) になり、ボタンの中央ピクセルと完全に一致する真の中央ピクセルが画像に与えられます。

それが私が自分で問題を解決した方法です。ただし、より簡単な解決策が思い浮かびました。画像に 1px の下部余白を割り当てることで、おそらく同じ結果を得ることができます。この解決策はテストしていませんが、理論的には最初の解決策と同等のようです。

追記: 偶数次元の 2 つのオブジェクトは、理論的には完全に中心を揃えることができるはずです。しかし、奇妙なことに、ボタンと画像の両方の寸法が偶数であっても、配置の問題が発生します。(明らかに、コンパイラは、あるコントロールと別のコントロールの中心ピクセルを決定する方法に一貫性がありません。) それでも、この場合、同じ解決策が適用されます。

于 2010-08-30T00:22:20.287 に答える
2

通常、次のプロパティを設定します(たとえば、右側の画像の場合)。

ImageAlign: MiddleRight
TextAlign: MiddleLeft

同様の方法でテキストと画像の両方を揃える必要があります。それ以外では、BackgroundImageプロパティではなくImageプロパティを設定していることを確認し、アイコンからプレーンビットマップへの変換を適切に行っていることを確認してください。プレーンなビットマップファイルを試しましたか?

于 2009-02-03T15:06:18.177 に答える
0

質問: ビットマップにはメモ画像の上部に情報が含まれていないと確信していますか? Photoshop ではクロップが正しく表示され、ライブ コードでは正しく表示されなかったことが何度もありました... :)

その場合、あなたのコードは完璧かもしれません;)

于 2009-03-20T14:54:05.787 に答える