電子書籍の厳選無料作品が豊富!

例えば
using System;
using System.Drawing;
using System.Windows.Forms;

class SeparateMain
{
public static void Main()
{
Application.Run(new AnotherHelloWorld());
}
}
class AnotherHelloWorld : Form
{
public AnotherHelloWorld()
{
Text = "Another Hello World";
BackColor = Color.White;

}
protected override void OnPaint(PaintEventArgs pea)
{
Graphics grfx = pea.Graphics;

grfx.DrawString("Hello, windows Forms!", Font, Brushes.Black, 0, 0);
}
}
の中の Graphics grfx = pea.Graphics;

という部分なのですが、この部分はなぜ必要で、何をしてるのでしょう。
GDI+というのでしょうか
System.Drawing.Graphicsというクラスのインスタンス、grfxを定義して、
PaintEventArgsのインスタンスpeaのGraphicsプロパティを代入

この処理が必要な理由がわかりません。お願いします。

A 回答 (11件中1~10件)

> この文の「グラフィックス」というのはペンだのフォントだのブラシだの、といった画材、と考えてよいでしょうか。



いや、むしろ「キャンバス」ですね。
    • good
    • 0
この回答へのお礼

この一言が欲しかったです ありがとうございます。確信に触れられました。
またよろしくお願いします。

お礼日時:2014/01/18 19:17

> 腑に落ちないのはSystem.Drawing.Graphicsのインスタンスgrfxに


> System.Windows.Forms.PaintEventArgs.Graphicsプロパティを代入する、という部分です。
> 型も違うのにどこのメソッドにどのメソッドが入るとかはわかるのでしょうか?
System.Windows.Forms.PaintEventArgs の Graphics プロパティの型は System.Drawing.Graphics です。
http://msdn.microsoft.com/ja-jp/library/system.w …
ある型の変数に全く同じ型の値を代入可能であることに何の不思議もありません。

> コンソールアプリをたくさん作ってもイベントドリブンはわからないと思います。
> ましてデバイスコンテキストなど
あなたのおっしゃる通り、イベントドリブンやデバイスコンテキストなどの知識はコンソールアプリでは身に着けるのは困難でしょう。

しかし、逆にイベントドリブンやデバイスコンテキストなどの知識だけがあってもプログラムは組めません。
それらは単に部品に過ぎず、それらを意図したとおりに配置し処理をさせる必要があります。
そのような組み立てのスキルを磨くうえでは、GUIプログラミングでは動かすのに必要なコードの量が多すぎ、本質的な部分がその他の部分に紛れてしまいます。

だから、基本的な構文をマスターする上では、動かすのに必要なコード量が少ないコンソールアプリが最適なのです。
    • good
    • 0
この回答へのお礼

なるほどコンソールアプリのソースも手を動かしていこうと思います。
ありがとうございました。

お礼日時:2014/01/18 19:18

> このプロパティはディスプレイデバイスを指していて、だからgetしかできない??



OnPaintは「さあ描け」というフレームワークからの指令です。
そのとき、画材はEventArgs内のGraphicsを使え、とフレームワークが用意してくれたもの。
setすることに意味がないのでsetできないよう定義されています。

この回答への補足

http://msdn.microsoft.com/ja-jp/library/system.w …

描画に使用するグラフィックスを取得します。

この文の「グラフィックス」というのはペンだのフォントだのブラシだの、といった画材、と考えてよいでしょうか。
腑に落ちないのはSystem.Drawing.Graphicsのインスタンスgrfxに

System.Windows.Forms.PaintEventArgs.Graphicsプロパティを代入する、という部分です。

型も違うのにどこのメソッドにどのメソッドが入るとかはわかるのでしょうか? 

補足日時:2014/01/17 23:04
    • good
    • 0

> 基本の本に書いてある、ということなのですが、もうちょっと具体的に


> なんとか~という本の何ページ目を読め、とか
> URLなどご紹介願えないでしょうか
「情報源を探す」のも技術のうちです。
厳しいことを言うようですが、
何でもかんでも他人に聞かないと進まないようではプログラミングは向いていません。
ここで聞こうが、2chで聞こうが答えは同じでしょう。

この姿勢を改めることがあなたにとっての「最初の壁」かもしれません。

この回答への補足

コンソールアプリをたくさん作ってもイベントドリブンはわからないと思います。
ましてデバイスコンテキストなど

私の手持ちの資料の説明ではGraphics grfx = pea.Graphics;
という一行を
「OnPaintメソッド内でこのGraphicsオブジェクトに対しての描画を行う」

とあります。

あなたがただの初心者叩き趣味でやってるのでないのなら
この文章の説明をしてみてもらえますか?

ネットではさんざん検索しました。私はこの相談箱が信頼性の高い情報源と思っています。

補足日時:2014/01/17 23:12
    • good
    • 0

> コンソールのプラグラムですと変数とか繰り返し


> とか本当に基本だけしかのってない本ばかり
> なので良書などご紹介していただけると助かります
……。

はっきり言います。
あなたの今回の質問は、
「基本だけしかのってない本」には必ず書いてあることで、
その内容をきちんと理解しているならば出てこない質問です。

つまり、そのようなセリフが出てくること自体、
 『言語の基礎を全く理解していません』
と宣言しているのと同じです。

まずあなたの言う「基本だけしかのってない本」をしっかり読んで、
演習や例題を実際に入力して動かしなさい。
そして、その本に書いてあることを他人にきちんと説明できるようになりなさい。
他の本やGUIプログラミングに手を出すのはそれからです。ූ

この回答への補足

ご指摘ありがとうございます。
基本の本に書いてある、ということなのですが、もうちょっと具体的に
なんとか~という本の何ページ目を読め、とか

URLなどご紹介願えないでしょうか 

プログラミングは最初の壁を乗り越えるまでは難しいと思います。2chねるに質問してるのと
同じ回答ではどうにも

補足日時:2014/01/17 07:50
    • good
    • 0

> pea.Graphics.DrawString("");


> というのがPaintEventArgsクラスのDrawStringメソッドを
> 呼び出してそれによって文字が描画される、
> ということでしょうか。

NO.

1. peaのプロパティ Graphics を取得し、
2. それのメソッド:DrawStringを呼び出しています。

1,2を分けて書いたのが元のコード。それだけのこと。
    • good
    • 0
この回答へのお礼

http://msdn.microsoft.com/ja-jp/library/system.w …

grfx は System.Drawing.Graphicsクラスのインスタンス(newがないので違う?)

、 それにPaintEventArgsクラスのGraphicsプロパティを代入し、

確信に触れられそうです このプロパティはディスプレイデバイスを指していて、だからgetしかできない??

お礼日時:2014/01/16 22:03

基礎が足りていません。



まずはコンソールアプリケーションでC#やオブジェクト指向の基礎を固めてください。
GUIはその後です。

この回答への補足

ご指摘ありがとうございます
コンソールのプラグラムですと変数とか繰り返し
とか本当に基本だけしかのってない本ばかり
なので良書などご紹介していただけると助かります

補足日時:2014/01/16 16:22
    • good
    • 0

おっと失礼、 . がひとつ余分です。

    • good
    • 0

protected override void OnPaint(PaintEventArgs pea)


{
pea.Graphics..DrawString("Hello, windows Forms!", Font, Brushes.Black, 0, 0);
}

これ↑でもちゃんと動きますか?
動くなら、この文脈に限って言えばgfxは不要です。

この回答への補足

動きました。これは、.NetFrameworksのバージョンに関係あるのでしょうか。現在2.0でコンパイルしています。
Graphics grfx = pea.Graphics;

がない方がなんとなくこういうことなんだろうなと思えます。つまり
pea.Graphics.DrawString("");

というのがPaintEventArgsクラスのDrawStringメソッドを呼び出してそれによって文字が描画される、
ということでしょうか。

pea.Graphics.DrawString("");はなくても問題ないのでしょうか

同じようなものにBase.OnPaint()と記述されているものもありこちらもコメントアウトしてもOnPaintイベントは発生します。

補足日時:2014/01/16 20:23
    • good
    • 0

> この処理を行うことによってどういう結びつきなどが生まれるのでしょう


この処理をコメントアウトした時のエラーメッセージを読みなさい。
それがこの処理が必要な理由を説明しています。

この回答への補足

コンテキストがありません・・のようなメッセージが出ました。

もっともgrfxの宣言を消してしまってるのでエラーが出るのは想像つくのですが・・・

考えてはいるのですがなかなかこれだと思う発想になりません。もう少しヒントを・・・

補足日時:2014/01/16 20:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!