┏弟2号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー ■ご挨拶 ■.NET Tips ・画像を拡大、縮小して表示する ■VBユーザーのためのC# ・C#でLike演算子と同じことをするには? ■.NET質問箱 ・数字以外の文字をテキストボックスに表示したくない ■ピンポイントリンク ・.NETでCoolbar(Rebar)を使いたい 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ─────────────────────────────── ■ご挨拶 ─────────────────────────────── 前回の「.NETプログラミング研究 創刊号」は私が生まれて始めて作成 したメールマガジンでした。失敗しなかったかと不安でいっぱいでし たが、幸い苦情はなく、大成功とは行かないまでも、無難にはできた かなと胸をなでおろしています。 さて今回から試しにVB.NETだけでなくC#でのサンプルコードも載せる ことにしました。果たしてこの方がいいか、あるいはどちらかのコー ドだけで十分かご意見がありましたらお聞かせください。 ─────────────────────────────── ■.NET Tips ─────────────────────────────── ●画像を拡大、縮小して表示する 画像を拡大、縮小して表示する方法(スケーリング)を紹介します。 Graphicsクラス(System.Drawing名前空間)のDrawImageメソッドで表 示するサイズを指定することにより、簡単にできます。次の例ではも との画像("C:\サンプル.jpg")を1.5倍に拡大してPictureBox1に表示し ています。ここではGraphics.DrawImage(Image, Single, Single, Single, Single)を使いましたが、他のDrawImageのオーバーロードを 使用する方法も考えられます。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ '画像を拡大、縮小して表示する(スケーリング) 'Bitmapオブジェクトの作成 Dim image = New Bitmap("C:\サンプル.jpg") 'PictureBox1のGraphicsオブジェクトの作成 Dim g As Graphics = PictureBox1.CreateGraphics() '元の画像の大きさを1.5倍にして表示する Dim rect As New RectangleF(0, 0, 1.5F * image.Width, _ 1.5F * image.Height) g.DrawImage(image, rect) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //画像を拡大、縮小して表示する(スケーリング) //Bitmapオブジェクトの作成 Bitmap image = new Bitmap(@"C:\サンプル.jpg"); //PictureBox1のGraphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //元の画像の大きさを1.5倍にして表示する RectangleF rect = new RectangleF(0, 0, 1.5F * image.Width, 1.5F * image.Height); g.DrawImage(image, rect); //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ さらにGraphics.InterpolationModeプロパティにより、画像を拡大、 縮小表示する時の補間方法を変更することができます。この InterpolationMode列挙体のメンバにはBicubic(双三次補間)、 Bilinear(双一次補間)、Default(既定のモード)、High(高品質補 間)、HighQualityBicubic(高品質双三次補間)、 HighQualityBilinear(高品質双一次補間)、Invalid(QualityMode列 挙体の要素Invalidと等価)、Low(低品質補間)、NearestNeighbor(最 近傍補間)があります。当たり前のことですが、一般的に高品質の補 間方法を指定したときのほうが表示に時間がかかります。 「アスキーデジタル用語辞典」(http://yougo.ascii24.com)によると、 「ニアレストネイバー法はその名の通り、単純に元の画像を水増し(拡 大)、間引き(縮小)する方式。ジャギーが目立ちやすく階調のある 画像のリサイズにはむいていない。バイリニア法、バイキュービック 法は元の画像の周辺の複数の画像を数学的に算出して拡大、縮小する。 バイキュービック法のほうが計算が複雑で精度が高く階調のある画像 のリサイズにむいている。」とのことです。 アスキーデジタル用語辞典 - 補間 http://yougo.ascii24.com/gh/68/006843.html アスキーデジタル用語辞典 - バイキュービック法 http://yougo.ascii24.com/gh/65/006570.html '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ '補間方法を指定して画像を縮小して表示する 'Bitmapオブジェクトの作成 Dim image = New Bitmap("C:\サンプル.jpg") 'PictureBox1のGraphicsオブジェクトの作成 Dim g As Graphics = PictureBox1.CreateGraphics() '補間方法として最近傍補間を指定する g.InterpolationMode = _ System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor '画像を縮小表示 g.DrawImage(image, 0, 0, 150, 120) '補間方法として高品質双三次補間を指定する g.InterpolationMode = _ System.Drawing.Drawing2D.InterpolationMode. HighQualityBicubic '画像を縮小表示 g.DrawImage(image, 160, 0, 150, 120) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //補間方法を指定して画像を縮小して表示する //Bitmapオブジェクトの作成 Bitmap image = new Bitmap(@"C:\サンプル.jpg"); //PictureBox1のGraphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //補間方法として最近傍補間を指定する g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; //画像を縮小表示 g.DrawImage(image, 0, 0, 150, 120); //補間方法として高品質双三次補間を指定する g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode. HighQualityBicubic; //画像を縮小表示 g.DrawImage(image, 160, 0, 150, 120); //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 最後にサムネールイメージ(縮小イメージ)の作成方法を紹介します。 サムネールイメージを作成するにはImage.GetThumbnailImageメソッド 使用します。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'サムネールイメージを作成 'Bitmapオブジェクトの作成 Dim myBitmap = New Bitmap("C:\納屋.jpg") 'PictureBox1のGraphicsオブジェクトの作成 Dim g As Graphics = PictureBox1.CreateGraphics() 'サムネールイメージを作成大きさを100x100ピクセルにする Dim myThumbnail As Image = _ myBitmap.GetThumbnailImage(100, 100, Nothing, IntPtr.Zero) '表示 g.DrawImage(myThumbnail, 0, 0) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //サムネールイメージを作成 //Bitmapオブジェクトの作成 Bitmap myBitmap = new Bitmap(@"C:\納屋.jpg"); //PictureBox1のGraphicsオブジェクトの作成 Graphics g = PictureBox1.CreateGraphics(); //サムネールイメージを作成大きさを100x100ピクセルにする Image myThumbnail = myBitmap.GetThumbnailImage(100, 100, null, IntPtr.Zero); //表示 g.DrawImage(myThumbnail, 0, 0); //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 画像の拡大、縮小表示とはあまり関係のないことかもしれませんが、 最後の最後に自動スケーリングについて触れておきます。 元の画像と同じ大きさで表示するには g.DrawImage(image, 10, 20) のように表示する左上の座標を指定するだけでDrawImageメソッドを使 用できますが、この時「自動スケーリング」が行われる可能性があり、 パフォーマンスは低下します。「自動スケーリング」を解除するため には g.DrawImage(image, 10, 20, image.Width, image.Height) のように幅と高さをちゃんと指定してあげます。詳しくはヘルプの「自 動スケーリングの解除によるパフォーマンスの向上」をご覧ください。 ・画像を拡大、縮小して表示する http://dobon.net/vb/dotnet/graphics/scaling.html ・補間方法を指定して画像を拡大、縮小表示する http://dobon.net/vb/dotnet/graphics/interpolationmode.html ・サムネールイメージの作成 http://dobon.net/vb/dotnet/graphics/thumbnail.html ・自動スケーリングの解除によるパフォーマンスの向上 ms-help://MS.VSCC/MS.MSDNVS.1041/cpguide/html/_gdiplus_improving_performance_by_avoiding_automatic_scaling_usecsharp.htm ─────────────────────────────── ■VBユーザーのためのC# ─────────────────────────────── ●C#でLike演算子と同じことをするには? C#にVBのLike演算子はありません。これと同等の事を行うには、 Regexクラス(System.Text.RegularExpression名前空間)のIsMatchメ ソッドを使う方法(つまり正規表現を使う方法)があります。Like演 算子の"*"、"?"、"#"はそれぞれ正規表現では".*"、"."、"\d"に置き 換えることが出来ます(ただし正規表現の".*"、"."は改行文字以外の 文字となります)。Like演算子の"[]"は正規表現でも"[]"で、Like演 算子の"[!]"は正規表現では"[^]"と表現できます。 正規表現の"."は改行文字以外の文字を表すため、改行文字を含む文字 列の比較では同一の結果とならないかもしれません。このような時は 一致オプションにRegexOptions.Singlelineを指定し、単一行モードと します。このことにより、"."はすべての文字と一致するようになりま す。 さらに、Like演算子は2つの文字列が完全に一致するかを調べるのに対 して、IsMatchメソッドは一致する箇所があるが調べるものです。よっ て、IsMatchメソッドでは検索パターン文字列の前後に"^"と"$"を付け る必要がありそうです。 当然ですが、検索パターン文字列に正規表現で使われるメタ文字が含 まれているときは、これをエスケープしておかなければいけません。 (これはRegex.Escapeメソッドを使うことにより行えます。) 実際にこの変換を使用した例を下に示します。この例ではVBのLike演 算子のヘルプでのサンプルをC#に変換してみました。 //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //using System.Text.RegularExpressions; //が宣言されているものとする bool myCheck; //myCheck = "F" Like "F" myCheck = Regex.IsMatch("F", "^F$", RegexOptions.Singleline); //myCheck: true //myCheck = "F" Like "f" myCheck = Regex.IsMatch("F", "^f$", RegexOptions.Singleline); //myCheck: false //myCheck = "F" Like "FFF" myCheck = Regex.IsMatch("F", "^FFF$", RegexOptions.Singleline); //myCheck: false //myCheck = "aBBBa" Like "a*a" myCheck = Regex.IsMatch("aBBBa", "^a.*a$", RegexOptions.Singleline); //myCheck: true //myCheck = "F" Like "[A-Z]" myCheck = Regex.IsMatch("F", "^[A-Z]$", RegexOptions.Singleline); //myCheck: true //myCheck = "F" Like "[!A-Z]" myCheck = Regex.IsMatch("F", "^[^A-Z]$", RegexOptions.Singleline); //myCheck: false //myCheck = "a2a" Like "a#a" myCheck = Regex.IsMatch("a2a", "^a\\da$", RegexOptions.Singleline); //myCheck: true //myCheck = "aM5b" Like "a[L-P]#[!c-e]" myCheck = Regex.IsMatch( "aM5b", "^a[L-P]\\d[^c-e]$", RegexOptions.Singleline); //myCheck: true //myCheck = "BAT123khg" Like "B?T*" myCheck = Regex.IsMatch( "BAT123khg", "^B.T.*$", RegexOptions.Singleline); //myCheck: true //myCheck = "CAT123khg" Like "B?T*" myCheck = Regex.IsMatch( "CAT123khg", "^B.T.*$", RegexOptions.Singleline); //myCheck: false //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・C#でLike演算子と同じことをするには? http://dobon.net/vb/csharp/vb2cs1.html#like ─────────────────────────────── ■.NET質問箱 ─────────────────────────────── Q:数字以外の文字をテキストボックスに表示したくないのですが、 どうすでばよいでしょうか? A:テキストボックス(ここではTextBox1)に数字以外の文字が入力 できないようにするためにはテキストボックスのKeyPressイベントハ ンドラで数字以外のキー入力をキャンセルする次のようなコードを書 きます。ここでは数字だけでなくバックスペースの入力も許可するよ うにしています(そうしないとバックスペースが効かなくなります)。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub TextBox1_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles TextBox1.KeyPress If e.KeyChar <> vbBack And _ (e.KeyChar < "0"c Or e.KeyChar > "9"c) Then e.Handled = True End If End Sub '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ private void TextBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { if (e.KeyChar != '\b' && (e.KeyChar < '0' || e.KeyChar > '9')) e.Handled = true; } //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ しかしこれだけではIMEがオンになっている時は数字以外の文字が入力 されてしまいます。これを出来ないようにするにはテキストボックス のImeModeプロパティをDisableにしておきます。 またテキストボックスを使わずにNumericUpDownコントロールを使うと いう手も考えられますが、この場合もIMEが効かないようにImeModeプ ロパティをDisableにする必要があります。 ・「どぼん!のVB道掲示板」の下記URLのスレッドを基にしました。 http://www.sky-j.com/view.php?arg_forum_id=38&arg_message_id=528 ・テキストボックスに数字しか入力できないようにする http://dobon.net/vb/dotnet/control/numerictextbox.html ─────────────────────────────── ■ピンポイントリンク ─────────────────────────────── ●.NETでCoolbar(Rebar)を使いたい Coolbar(またはRebar)とは、エクスプローラやインターネットエクス プローラの上部についているようなツールバー等の配置が自由に変え られるコントロールのことです。このCoolbarはたとえばVB6では「 Windows Common Control-3」として提供されていましたが、.NETにな りなぜか完全に消えてしまいました。ヘルプでCoolbarの代わりのもの を調べても、ほとんど触れられていないような状況です。 そこで、.NETでこのCoolbarを簡単に使用できるようにしてくれるコン ポーネントを探すことにしました。ここでは無料で使用できるものし か紹介しませんが、これらはまったくの無保証ですので、会社で使う などきちんとしたものを作る必要がある場合は高くても有料のものを 使うべきでしょう(あればですが)。また、実際に使用する際にはそ れぞれのライセンスを必ず確認してください。さらに、私が使い方を 完全に理解していないために間違ったことを書いているかもしれませ んので、必ずご自分でご確認ください(間違いがあったときはご連絡 ください。)。 まずVBのCoolbarコントロールにかなり近いのが Anthony Baraff さん の「RebarWrapper Control」です。これはVBのCoolbarコントロールと 同様にフォームのデザイン画面でバンドを追加でき、そのバンドに標 準のコントロール(ツールバーやテキストボックス、コンボボックス など)を入れることができます。VBのCoolbarコントロールを使い慣れ ており、それ以上の機能を期待しない方にはお勧めです。 ・The Code Project - Rebar Control Wrapper in C# http://www.codeproject.com/cs/menu/rebarcontrol.asp 上に紹介したRebarWrapper Controlでは「Windows Common Control-3」 と同様、エクスプローラのようにメインメニューをCoolbarのバンドに 加えるということができません。これを可能にするのが Lutz Roeder さんの「CommandBar for .NET」です。これはその名の通りMS Office で使われているコマンドバーの機能を実現するものらしく、Rebarとツー ルバー、メインメニュー、ポップアップメニュー(コンテキストメニ ュー)といった独自のコントロールが用意されており、Rebarに追加で きるコントロールはこの用意されたツールバーとメインメニューだけ のようです。(TextBoxやComboBoxをそのままバンドに追加すると明ら かに不都合が生じます。これらをPanelに乗せたものをバンドに追加す ると、まだまともになります。また、ツールバーにアイテムとして追 加することはできないようです。)しかし、シェブロンの表示や、簡 単にメニューにアイコンを表示することができるなど、全体的にはか なり使えると思います。 ・Lutz Roeder's PROGRAMMING.NET http://www.aisto.com/roeder 最後に紹介する Carlos H. Perez さんの「VSNetToolbar」はこの CommandBar for .NET を拡張したものです。かなり大幅に拡張されて おり、CommandBar for .NETを使って「こうできたらな」と思えること がかなりできるようになっています。多くの有用なコントロールが追 加されており、ReBarとMenu Control以外にBorder Label, Button Ex, Color Combo Box Ex, Color List Box Ex, Image Combo Box Ex, Numeric Text Box Ex, Outlook Bar Ex, Progress Bar Ex, Tree View Exといったものが用意されています。Rebarのバンドに追加でき るのはやはりメニューとツールバーのみですが、ツールバーにImage Combo Box Exなどのコントロールを乗せることができますので、これ を使えばMS OfficeやVS.NETのツールバーに近いものを作れそうです。 ・The Code Project - VSNetToolbar (flat toolbar with embedded combo boxes) written in C# http://www.codeproject.com/cs/menu/vsnettoolbar.asp =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  http://dobon.net  dobon@bigfoot.com ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/bbs ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 DOBON! All rights reserved. ===============================