世界のWindows Mobile開発者へテクニカルプレビュー端末を提供
本年度のホリデーシーズンにWindows Phone 7が製品リリースされるというのは以前から変わらない話題なのですが、
そのニュースとほぼ同時に、
世界中のWindows Phone開発者には、
Windows Phone 7アプリケーション開発には、
はじめに
さて、

これでは寂しいので、
ボタンには以下のような状態があります。
- フォーカスが当っている状態
- ボタンが押されている状態
今回は、
ボタンの描画メソッドを修正する
まず、
private void DrawButton(Graphics g, bool pressed, bool focused)
{
// ボタンの背景を描画
Pen backLinePen;
if (!focused)
{
backLinePen = new Pen(Color.Black);
}
else
{
// フォーカスが当たっている場合は、枠線を太く描画する
backLinePen = new Pen(Color.Black, 2.5f);
}
// DrawRectangleメソッドで線を描画するが
// 線の太さを考慮して幅と高さから引く
Rectangle lineRect = new Rectangle();
lineRect.X = ClientRectangle.X + (int)backLinePen.Width;
lineRect.Y = ClientRectangle.Y + (int)backLinePen.Width;
lineRect.Width = ClientRectangle.Width - (int)backLinePen.Width * 2;
lineRect.Height = ClientRectangle.Height - (int)backLinePen.Width * 2;
g.FillRectangle(new SolidBrush(Color.DimGray), ClientRectangle);
g.DrawRectangle(backLinePen, lineRect);
// ボタンの表示領域
Rectangle btnRect = ClientRectangle;
btnRect.X += 2;
btnRect.Y += 2;
btnRect.Width -= 4;
btnRect.Height -= 4;
Color stColor, edColor;
if (!pressed)
{
stColor = Color.Red;
edColor = Color.Black;
}
else
{
// タップされている場合は、色を反転させて描画する
stColor = Color.Black;
edColor = Color.Red;
}
// 角丸グラデーションボタンの描画
GraphicsExtension.DrawGradientRoundRectButton(
g, btnRect, stColor, edColor, Color.Black, FillDirection.TopToBottom);
// ボタンに表示するテキストの表示(テキストは中央に表示)
StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
g.DrawString(Text, Font, new SolidBrush(Color.White), btnRect, sf);
}
フォーカスが当たっている状態を描画する
フォーカスが当たっている状態を描画します。フォーカスの当たった当たっていないを変化させるのには、
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
// 再描画要求
Invalidate();
}
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
// 再描画要求
Invalidate();
}
GotFocusイベントが発生すると、
描画更新が行われると、
protected override void OnPaint(PaintEventArgs e)
{
bool pressed = false;
bool focused = Focused;
DrawButton(e.Graphics, pressed, focused);
}
これでボタンにフォーカスが当たっているのが分かるでしょうか。

ボタンが押されている状態を描画する
次にボタンが押されている状態を描画します。ボタンが押されている押されていないを変化させるには、
マウス
protected override void OnMouseDown(MouseEventArgs e)
{
Capture = true;
Focus();
// 再描画要求
Invalidate();
}
protected override void OnMouseUp(MouseEventArgs e)
{
Capture = false;
// 再描画要求
Invalidate();
}
キーが押された場合は、
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Capture = true;
Focus();
// 再描画要求
Invalidate();
}
}
protected override void OnKeyUp(KeyEventArgs e)
{
Capture = false;
// 再描画要求
Invalidate();
}
描画更新要求が行われると、

いかがでしょうか? 少し押されているような印象になっていませんでしょうか。これでボタンの描画ができました。
押されたような効果を与えるために、
さいごに
画面上のタップや、
今回までボタンコントロールを、
Buttonクラスを継承する場合は、
以上で今回は終わりです。ありがとうございました。