【VB2008】.MouseEnter時にe.Graphics.DrawString~をする方法

このQ&Aのポイント
  • ボタンのMouseEnterイベントで文字の色を変える方法について質問しています。
  • 質問者はボタンのテキストを影付きにしており、MouseEnter時に影の色も変えたいと考えています。
  • 既に試した方法ではエラーが発生し、他の方法を探しています。
回答を見る
  • ベストアンサー

【VB2008】 .MouseEnter時にe.Graphics.DrawString~をする方法

 今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  ボタンの文字を見やすくするため影付き文字にいたしておりますが (下のコード1になります),このボタンにMouseEnterした際に, クリックできることが分かりやすいよう影の色を変えようと思ったのですが やり方が見つけられません...  <コード1>  Private Sub Button1_Paint(ByVal sender As   Object, ByVal e As System.Windows.Forms.PaintEventArgs) _   Handles Button1.Paint     e.Graphics.DrawString("TEST", _     New Font("MS Pゴシック", 10), Brushes.Black, 81, 11)     e.Graphics.DrawString("TEST", _     New Font("MS Pゴシック", 10), Brushes.Red, 80, 10) End Sub  <トライしたコード>  Private Sub Button1_MouseEnter(ByVal sender As   Object, ByVal e As System.EventArgs) _   Handles Button1.MouseEnter     e.Graphics.DrawString("Test", _     New Font("MS Pゴシック", 10), Brushes.White, 81, 11)     e.Graphics.DrawString("Test", _     New Font("MS Pゴシック", 10), Brushes.Red, 80, 10)  End Sub  エラー「'Graphics'は'System.EventArgs'のメンバではありません」と なるのは当然だと思うのでございますが,引数「e As ~」を書き直すなどいたしましても 通りませんorz  別の方法で「.Paint時に描いた文字色はそのままで,.MouseEnter時に .ForeColorを変えれば...」などと考えましたが,ButtonのTextが .Paintで描いた文字より上にくるのでうまくできませんでした...  もしとんちんかんなご質問でしたら申し訳ございません.何かよさそうな 方法がございましたらご紹介いただけないでしょうか.  もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたく お願い申し上げます.

  • MKT_
  • お礼率99% (329/330)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> トライしたコード 気持ちは解りますけどね・・・。 なぜ出来ないか、というと、MouseEnterイベントとPaintイベントでは、与えられるEventArgsの内容が違うからです。これは、引数の型がどうのこうの、ではなくコントロールから渡される段階でもはや別物です。e.Graphicを渡してくれるのは基本的にPaintイベントのみです。 MouseEnter内だけで書き換える方法もありますが、まずは正攻法を覚えておきましょう。 1. コントロールへの描画はすべてPaintイベント内のみで行う。(※) 2. 任意のタイミングで画像を更新したい場合は、自力でPaintイベントを発生させる。(Paintイベントが発生すれば1.が実行されて再描画されるという理屈。) まず、1.を行うためにボタンの状態をどこかに記憶しておく必要があります。ノーマル・無効状態・フォーカス・ボタンダウンなど、MouseEnter/MouseLeaveなどで切り替えてください。 Paintイベントではこれらの状態に合わせて描画内容を切り替えます。 次に2.については、各コントロールの Invalidateメソッド がそれに当たります。コントロールの全域を無効(再描画が必要な状態)にすることで、強制的にPaintイベントを発生させます。 Sub ****_Paint(...) のメソッドを直接呼び出しても効果はありませんのでご注意を。 このような設計にすることで、描画処理を一カ所に集めるだけでなく、コントロールに飛んできたすべてのPaintイベントをその時点のボタン状態で処理できるのですっきりします。 ※ Paintイベントですべてを描画する際に、描画内容が多いと画面がちらつく原因になることがあります。この対策として、コントロールに描画する内容を、事前に下書き用のBITMAPへ描画しておく手法があります。 この場合でも、下書きした画像をコントロールに描画するタイミングはPaintイベントなので「すべてPaintイベントで」という書き方をしました。描画関係は全部がPaintイベントじゃないといけない、という意味ではございませぬ。

MKT_
質問者

お礼

 うぃず先生`ー´ゞ  どうもありがとうございます!!! .Tagに状態を記憶させて.Invalidate後の.Paintで分岐して 成功いたしました^^ゞ   Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) _    Handles Button1.MouseEnter    Button1.Tag = 2 'Enabled=true:1 MouseEnter:2    Button1.Invalidate()   End Sub   Private Sub Button1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) _    Handles Button1.MouseLeave    Button1.Tag = 1 'Enabled=true:1 MouseEnter:2    Button1.Invalidate()   End Sub >ボタンの状態をどこかに記憶しておく必要が~  .Tagを以前教えていただいておりましたので,すぐにピンときました^^ >事前に下書き用のBITMAPへ描画しておく  はい.やってみました^^;ただボタン数が多く,これらのResourcesサイズが 単純に倍になるといたしますと,これを全て記憶するExeファイルはどんどんサイズが 大きくなるのでは,などと懸念いたしまして・・・.Paintでどうにかしようと 考えるにいたった次第でございます. >Sub ****_Paint(...) のメソッドを直接呼び出しても効果はありませんのでご注意を  はい.テスト時にやってみて失敗いたしました^^; orz  ご説明いただきましたとおり,コード全体がかなり奇麗になりますねー. VBを始める前はずっと計算プログラムを作成いたしておりましたので, こういった全体が奇麗になる手法は大好きでございます.  本日は1日,.Invalidateと.Tagで遊んでみます.ご閲覧・アドバイス いただきまして,どうもありがとうございました!!

関連するQ&A

  • グラフィックスの読み取りについて。

    Option Strict On 'VisualBasic2008(無料版) Imports System.Drawing.Drawing2D Public Class Form1 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint Dim myFont As New Font("Arial", 20, FontStyle.Bold) e.Graphics.DrawString("7", myFont, Brushes.Red, 0, 0) End Sub End Class 例えば、こんな感じのプログラムがあるとします。 PictureBox1のサイズは25*25です。 PictureBox1内のグラフィックスの読み取りがしたいのです。 質問__1 ドット単位で625のデータをARGBで読み取り配列に格納したいです。 質問__2 グラフィックスが表示されてる場合は1を代入、表示されてない場合は0を代入、配列に入れたいです。イチゼロデータを作りたいです。 よろしくお願いします。

  • VB2010 でのPictureboxのフォント指定

    VB2010 でのPictureboxのフォント指定 現在 Pictureboxのフォントをプログラムの先頭で定義しているのですが、 '------------------------------------------------------------------------- Dim fnt As New Font("MS ゴシック", 9) With PictureBox1 .Image = New Bitmap(.Size.Width, .Size.Height) g1 = Graphics.FromImage(.Image) g1.Clear(.BackColor) End With g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) '------------------------------------------------------------------------- 下記のようにループ内で指定したいのですが、どう定義すればいいでしょうか。 For i=1 to 10 <------------------------ここでfont指定したい g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) next

  • VB6とVB.NETでは同じフォントでも違う文字になる?

    VB6とVB.NETでは同じフォントでも違う文字になる? VB.NETで文字を印刷しているのですが、VB6で印刷したものと、VB.NETで印刷したものは 同じフォントを指定しているのに、明らかに文字が違います。 このようなことはあるのでしょうか。 あるいはロジックに問題があるのでしょうか。 VB6 Printer.FontName = "MS ゴシック" Printer.CurrentY = YY Printer.CurrentX = XX Printer.FontSize = 10 Printer.Print(TITLE) VB.NET Dim PrtFont1 As New Font("MS ゴジック", 10) e.Graphics.DrawString(TITLE, PrtFont1, Brushes.Black, XX,YY) Windows XP VisualBasic 6.0, Visualbasic2010 Express

  • drawStringの座標について

    paintメソッド内で、drawStringで文字列を、 drawImageで画像をそれぞれ表示しています。 drawStringとdrawImageの両方で、同じ座標を 指定しても表示位置がずれます。x座標は ぴったり一致するのですがy座標が7から8ポイント ほどずれます。この二つのメソッドによる座標 と表示位置を一致させたいのですが、よい方法は ありませんでしょうか。どうぞよろしくお願い いたします。 public void paint(Graphics g) { g.drawImage(image,20,20,100,20); Font fnt=new Font("HGゴシックM",Font.PLAIN,12); g.setFont(fnt); g.drawString("Hello",20,20);//座標値はおなじで               も表示位置がずれる }

    • ベストアンサー
    • Java
  • VB2010DataGridView複数ページ印刷

    VB2010のDataGridViewで複数ページの印刷を試みています。 改ページに悩んでいます。「e.HasMorePages=True」で改ページは可能ですが、1ページ目も2ページ目も同じ内容が印刷されます。 1ページに30行を印刷する予定ですので、2ページ目には31行目から印刷をしたいのです。 現在、いろいろ参考にしまして、コーディングは進んでいますが、30行の指定がページ目いっぱいまで印刷される点と、2ページ目以降の印刷ができない点に悩んでいます。 書き上げたコードを記述しますので、ご存知の方が居られましたら、ご教授ください。 Dim reader As IO.StreamReader Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PrintPreviewDialog1.ShowDialog() PrintPreviewDialog1.Document = PrintDocument1 'file() ' 印刷処理を実行 'PrintDocument1.Print() 'PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.FullWindow) 'PrintDocumentオブジェクトの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'PrintPageイベントハンドラの追加 AddHandler pd.PrintPage, AddressOf pd_PrintPage 'PrintDialogクラスの作成 Dim pdlg As New PrintDialog 'PrintDocumentを指定 pdlg.Document = pd '印刷の選択ダイアログを表示する If pdlg.ShowDialog() = DialogResult.OK Then 'OKがクリックされた時は印刷する pd.Print() End If End Sub Dim page As Integer = 0 '現在のページ Private Const MaxLine As Integer = 30 '1ページ30行 Private Sub pd_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) page += 1 'グラフィックの定義 Dim g As Graphics = e.Graphics '総行数をallrowとする Dim allrow As Integer = DataGridView1.Rows.Count - 1 '文字列を描く 'g.DrawString(DataGridView1(0, 0).Value, _ ' New Font("MS Pゴシック", 9), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top) Dim X As Integer Dim Y As Integer Y = e.MarginBounds.Top For i As Integer = 0 To DataGridView1.Rows.Count - 1 X = e.MarginBounds.Left For j As Integer = 0 To DataGridView1.Columns.Count - 1 Dim s As String If DataGridView1(j, i).Value Is Nothing Then s = "" Else s = DataGridView1(j, i).Value End If g.DrawString(s, New Font("MS Pゴシック", 9), Brushes.Black, X, Y) 'g.DrawString(DataGridView1(j, i).Value.ToString, _ ' New Font("MS Pゴシック", 9), Brushes.Black, X, Y) X += DataGridView1.Columns(j).Width Next j Y += DataGridView1.Rows(i).Height Next i '現在のページが総ページ数より少ない場合は、次ページへ If page < (allrow \ MaxLine + 1) Then e.HasMorePages = True Else 'このページで終了 e.HasMorePages = False End If End Sub

  • フォントの使用方法

    次のプログラムでフォントを変更できるはずなのですが・・・。 ※import文省略 public class StringDisplay extends Applet{  public void paint(Graphics g) {   g.drawString("文字が書けました",100, 50);   g.setFont(new Font("MS 明朝", Font.PLAIN, 25));   g.drawString("文字が書けました",100,100);   g.setFont(new Font("MS ゴシック", Font.BOLD, 30));   g.drawString("文字が書けました",100,150);  } } --実行結果-- ・MS明朝及びMSゴシックにならない ・「文字が書けました」は3つとも出ている ・3つとも初期設定フォントの「dialog」らしい ・文字の大きさは変更されている ・3つ目に太字は適用されている ・他のアプリケーション(キューブペイントなど)で文字を書くときにはMS明朝・MSゴシックは使用できる こんな感じなのですが、なぜフォントが変更できないのかが分かりません。 全く同じプログラムではありませんが、以前はちゃんと変更できました。 どなたかお分かりになる方はいませんでしょうか?

    • ベストアンサー
    • Java
  • Imports 文についての疑問!(VB2008)

    約40日余りのVB.NET 初学者です。 そこで、この間の学習で疑問に思った諸点について質問します。 疑問: Imports 文についての疑問! Imports System.Windows.Forms ' ================================================== ' グラフィックス・メソッドで "hello, world" と描画 ' ================================================== Public Class frmMain   Private Sub frmMain_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint     Dim msg As String = "hello, world"     Dim aFont As New Font("Arial", 12)     e.Graphics.DrawString(msg, aFont, Brushes.Black, 0, 0)   End Sub End Class Imports 文でインポートした場合の EXE は 16384 バイト。 e As System.Windows.Forms.PaintEventArgs と書いても EXE は 16384 バイト。 「ならば、Imports 文を書けばいいじゃないか?」と思います。 この辺りの事情が判りません。 私の推測は、次のようです。 ・インポート文は名前空間やクラスに置換されるとは限らない。 ・置換は全体のテキストをチェックした後に必要な限りで行われる。 しかし、真相は不明。 自分なりのスタイルとか作法とかを確立する上で多少喉に刺が刺さった感があります。 この疑問の解消に手を貸して頂ければ幸いです。

  • Visual Studio .NET 2003:右揃え印刷の設定(その2)

    フォーム上に表示されている各項目を印刷したいのですが、左揃えの文字は普通に座標指定するだけで問題ないのですが、桁数の違う数字を右揃えで統一して印刷したい場合の方法を教えていただきたく、よろしくお願いいたします。 以前、上記の内容の質問をさせていただきましたところ、String.Formatを使えばよいとのご回答をいただきました。いろいろと調べてみたのですが、実際にどのようにコードに記述すればよいのかがわからずにおります。現在、フォーム上の項目のうち、数値が入力されている項目を印刷するためのコードを次のように記述しています。 '数値の印刷位置 e.Graphics.DrawString(Suuchi1.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 100) e.Graphics.DrawString(Suuchi2.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 150) e.Graphics.DrawString(Suuchi3.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 200) e.Graphics.DrawString(Suuchi4.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 250) e.Graphics.DrawString(Suuchi5.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 300) 'ここまで これらの数値を右揃えで印刷したい場合、どのようにコードを記述したらよいのか、アドバイスを願います。上記のコードよりももっとスマートなコード記述で、私が望んでいる様な印刷結果を実現できるようでしたら、ご教授のほどよろしくお願いいたします。

  • paint()以外でサブ関数を作りたい

     今晩は、java初心者です、宜しくお願いします。  下の様なウインドウに文字を書くサブ関数を作りましたが、うまく実行出来ません。  しかし、public void paint( Graphics g){ }の中に書いてやるとうまく文字が表示されます。  何故か理由が分かりません。  public void paint( Graphics g ){ }は、Componentクラスのメッソドをオーバーライドしている だけなので、別名のサブ関数で「Graphics g」を引数にとれば同じ考えだと思うのですが、 実行出来ない理由が理解できません。  public void drawLetter( Graphics g )としても、エラーが出るばかりです。  その原因が分かりません、宜しくお願いします。 ==================================================================== public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } ============================================================= public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; drawLetter( ) ; } public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; /* g.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; g.setColor( Color.BLUE ) ; g.drawString( "Orbit" , 50 , 50 ) ; */ } } =======================================================================

    • ベストアンサー
    • Java
  • VB.netで印刷

    プリンターにA4サイズより5mm内側に四角形を書いて印刷したいのですが ずれてしまいます。おそらく余白の設定ではないかとおもうのですが 用紙を横向き、余白0,指定はどう指定すればよいでしょうか あるいは、参考になるサイトをお教えください。 Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim f As New Font("MS 明朝", 64, FontStyle.Bold) e.Graphics.PageUnit = GraphicsUnit.Millimeter e.Graphics.DrawRectangle(New Pen(Color.Red), 5, 5, 287, 200) End Sub

専門家に質問してみよう