画像を開いてウィンドウに表示するアプリケーションがあります。正確には、この画像をフォームクラスの内部フィールドに保存し、そのフォームに配置されたPaint
イベントに添付されたメソッドで描画します。Panel
こんな感じです:
private void pnlImage_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
if (image != null)
{
g.DrawImage(image, imageLocation);
}
}
変数は、開いた後の画像を含むimage
(型の) フォーム クラスのフィールドです。スクロールとスクロールバーに接続されていますが、この場合には関係ありません。Image
imageLocation
そのフォームToolStrip
の下部にも を配置しました。これToolStrip
にはToolStripLabels
、画像に関するいくつかの指標であるはずの がいくつかあります。たとえばToolStripLabel
、画像上のマウス カーソルの現在の位置、または別の観点からは、マウス カーソルの下の (画像上の) ピクセル位置を表示したい があります。MouseMove
したがって、次のように、イベントに添付されたメソッドでラベルの値を更新します。
private void pnlImage_MouseMove(object sender, MouseEventArgs e)
{
UpdateCursorAtLabel(e.X, e.Y); // <---- method of interest
UpdateColorLabel(e.X, e.Y); // other label, showing color of the pixel. It's an identical thing, so I did not mention it
}
UpdateCursorAtLabel(int, int)
また、「cursor at」ラベルの更新を直接担当するmethod の内容は次のとおりです。
void UpdateCursorAtLabel(int cursorX, int cursorY)
{
lblCursorAtValue.Text = image != null ?
String.Format("{0}, {1}", scbHorizontal.Value + cursorX, scbVertical.Value + cursorY) :
nullText;
lblCursorAtValue.Invalidate();
}
lblCursorAtValue
- これは、マウスの下のピクセルの位置を示すラベルです (例: "234, 117")。
scbHorizontal
、scbVertical
-関係のないスクロールバーだけです。位置を計算するために必要です。
nullText
- const string
、「---」に等しい。
そして、最初はInvalidate()
メソッドの使用はありませんでした。これをすべて作成したとき、カーソルをパネルの上に移動しても、ラベルの内容がまったく変化しないことに気付きました! カーソルの移動を停止したときにのみ、ラベルの新しい値が表示されます。そこでlblCursorAtValue.Invalidate()
、ラベルの再描画を強制するために追加しました。それでも同じ問題です。もう 1 つ確認しましたPaint
。このラベルのイベントにメソッドを追加し、それを埋めるのではなく、そこにブレークポイントを配置しました。ランタイム デバッガーは、カーソルの移動を停止した後、またはパネルの境界外に移動した後に停止しました。ToolStripLabel
asUpdate()
やにはそのようなメソッドがないRefresh()
ので、より強力なものは使えませんInvalidate()
。なぜこれが起こっているのか、どうすれば修正できるのか、私には本当にわかりません。