Windows Phoneアプリケーション開発入門

第16回 Windows Phoneでグラデーションのボタンを作ってみよう!(3)

この記事を読むのに必要な時間:およそ 5 分

Windows Phone Developer Tools Betaの公開

はじめの前にWindow Phone 7に関する新情報です。RC版のリリースが目前の7月12日にWindows Phone Developer ToolsのBeta版が公開されました。CTP(Community Technology Preview)版からBeta版への進化で,アプリケーションの構成も多少変更されており,今までCTP版で動いていたサンプルアプリケーションが動かなくなっている可能性があります。

「Windows Phone Developer Tools Beta」は,こちらからダウンロードできます。

  • Visual Studio 2010 Express for Windows Phone Beta
  • Windows Phone Emulator Beta
  • Silverlight for Windows Phone Beta
  • Microsoft Expression Blend for Windows Phone Beta
  • XNA Game Studio 4.0 Beta

Developer Toolsに同梱されているソフトウェアも当然ながらすべてBeta版にバージョンアップされています。心配していたExoression BlendもどうやらWindows Phone向けに機能制限をして,今後も無料で配布されるようです。Windows Phone向けのVisual Studio 2010 Expressも含まれていますので,完全にお金をかけずにWindows Phone 7アプリケーションの開発ができますね。

同時に今のWindows Mobileで言うところのActive Sync/Device Centerに代わる,Zune SoftwareのWindows Phone 7に対応したTechnical Preview版が一部に向けてリリースされています。あとは実機さえ届けばすぐにWindows Phone 7端末にて転送してテストすることができます。着々とWindows Phone 7の開発環境が整ってきています。

Windows Phone 7 開発者のサイトを開くと,大きく「Dream it. Build it.」のコピーが書かれており,⁠英語が不得意ですので訳を間違っていたら恥ずかしいのですが)⁠夢を見ろ。それをビルドしろ。」が,Beta版のリリース時から「Stop dreaming. Start building.」に代わっており,⁠夢見るのを止め,ビルドを始めろ。」と一つの転機であることを示唆しています。

まだ日本ではどのキャリアから発売されるか,そもそも日本でWindows Phone 7端末が出るのか判っておりません。Windows Mobile 6.5.3端末が発売され静電容量式の端末を使いつつ,本国からWindows Phone 7の情報が流れてくるのを首を長くして待っていましょう。

はじめに

前回は,任意の図形でグラデーションの描画を行いました。.NET Compact FrameworkのマネージコードからGradientFill関数を使い描画したグラデーションイメージの上に,マスクイメージを描画していました。今回はこの描画メソッドを利用して,グラデーションボタンのコントロールを作ってみましょう。

実際にコードを提示する前にボタンの状態について考えてみましょう。Windows Mobileのボタンには以下の4つの状態があります。

  • 通常の状態
  • フォーカスが当っている状態
  • ボタンが押されている状態
  • ボタンが無効(Disable)になっている状態

今回は通常の状態のボタンを表示させるまでを行います。手を加えないといけないソースコードが多くなってきましたので,こちらからサンプルプロジェクトをダウンロードして頂きまして,実行しながら以降の解説を読んで頂ければ幸いです。

グラデーションボタンコントロールを作る

名前はそのまま「GradientionButton」としましょう。フォームデザイナを使って表示位置を操作したいので,Controlクラスを継承してGradientionButtonクラスを作成します。独自描画を行う際に使用するOnPaintメソッドとOnPaintBackgroundメソッドをあらかじめオーバーライドしておきましょう。

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace GradientionSample
{
    public class GradientionButton : Control
    {
        private void DrawButton(Graphics g, bool pressed, bool focused)
        {
        }
        
        protected override void OnPaint(PaintEventArgs e)
        {
            // とりあえず通常の状態のボタンを表示する
            bool pressed = false;
            bool focused = false;

            DrawButton(e.Graphics, pressed, focused);
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
        }
    }
}

現在「ボタンがユーザーによって押されているか?」⁠コントロールにフォーカスが当たっているか?」を引数に取るDrawButtonメソッドをOnPaintメソッドからコールしています。このDrawButtonメソッドに描画用の処理を実装していきます。

角丸矩形を描画するための準備

角丸の矩形を表示するには,ネイティブのRoundRect関数を使用します。Win32.csにP/Invokeの定義を追加しましょう。

RoundRect関数は設定されたPenオブジェクトとSolidBrushオブジェクトにて描画を行いますので,描画オブジェクトであるCreateSolidBrush関数とCreatePen関数,デバイスコンテキストに描画オブジェクトを設定するSelectObject関数とDeleteObject関数も合わせて定義しておきます。

namespace GradientionSample
{
    public sealed class Win32
    {
        // ~ 省略 ~

        // 角丸の矩形を描画するのに使用
        [DllImport("coredll.dll")]
        public static extern bool RoundRect(IntPtr hdc, int nLeftRect, int nTopRect,
        int nRightRect, int nBottomRect, int nWidth, int nHeight);
        
        [DllImport("coredll.dll")]
        public static extern IntPtr CreateSolidBrush(uint crColor);
        
        [DllImport("coredll.dll")]
        public static extern IntPtr CreatePen(int fnPenStyle, int nWidth, uint crColor);
        
        [DllImport("coredll.dll")]
        public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
        
        [DllImport("coredll.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
        
        public static uint RGB(Color color)
        {
            return 0x00000000 | ((uint)(color.B) << 16) | ((uint)(color.G) << 8) | (uint)(color.R);
        }

    }
}

これでマネージコードからネイティブ関数を使うためのP/Invokeの定義は終わりです。次にこれらの関数を呼び出してグラデーションボタンを描画するGraphicsExtensionクラスに手を入れていきましょう。

著者プロフィール

和田健司(わだけんじ)

1982年10月12日生まれ。大阪で働くプログラマ。Microsoft MVP for Device Application Development(Jul 2010 - Jun 2011)。Windows Mobileに傾倒し今に至る。Windows Mobile向けのTipsを書いています。iPhoneアプリ開発を始めました。嫌いな食べ物はカレー。

URL: http://ch3cooh.jp/
Blog: http://d.hatena.ne.jp/ch3cooh393/

コメント

コメントの記入