こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ソフトの組み方は文法書を読んでもなかなか理解できない C#

C#でクラスの事と、組み立て方がまだ理解できていないのですが

class Dousa{ }
class Form1
の2つのクラスがあります。

プログラムを実行するとForm1から動作します。(まだこの仕組みが理解できていないですが)
そして、フォームが表示され、ボタンが配置されているのでそのボタンをクリックすると、
Dousaのオブジェクトがインスタンスされて実行されるようにしているのですが、
そのDousaクラスの中で、円を描くメソッドを動かすとForm1上で円が描かれるといったことをしたいのですが、
円を描くメソッドは、Form1のこと(メソッド)を知らないと描けないと思う(?)

class Form1 : Dousa;の場合は Dousaの中身がForm1に継承されるのですが、
逆のことがしたいです。

class Dousa : Form1とした場合、最初に実行されるエントリ?はどこからになるのでしょうか?

Form1から動作しても、DousaクラスからForm1をいじれるようにする仕組みは作れるのでしょうか?

このようにソフトの組み方は文法書を読んでもなかなか
理解できないところですが、C#を使ったのソフトの組み方を解説している本などご存知の方教えていただきたいです。

投稿日時 - 2006-03-17 17:48:34

QNo.2035140

暇なときに回答ください

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

>プログラムを実行するとForm1から動作します。(まだこの仕組みが理解できていないですが)

プロジェクト内で'Application.Run'を検索すると見つかるはずです。Application.Run(new Form1);
実際は、Run()の中で無限ループしています。その途中、ボタン操作などのユーザー入力を検知し、ButtonClickedイベント等が呼ばれます。


>そのDousaクラスの中で、円を描くメソッドを動かすとForm1上で円が描かれるといったことをしたいのですが、
>円を描くメソッドは、Form1のこと(メソッド)を知らないと描けないと思う(?)

正確には、Form1のGraphicsオブジェクトが円を描くのですが。
きちんと描画するなら、Form1.OnPaint()イベントを定義し、OnPaintの引数にあるGraphicsオブジェクトを、そのイベント内で生成したDousaオブジェクトに渡しましょう。
ボタンは、描画する/しないを切り替えます。

コード
#ボタンは適当に配置して下さい。ボタンのClickedイベント、フォームのPaintイベントを以下のように定義します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
private bool draw = false;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
draw = !draw;
Invalidate();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
if (draw)
{
Dousa d = new Dousa();
d.Draw(e.Graphics);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace WindowsApplication1
{
public class Dousa
{
public void Draw(Graphics g)
{
Pen p = new Pen(Color.Black);
g.DrawEllipse(p, 30, 30, 100, 100);
}
}
}

後は、参考サイトなどを読んで多くのサンプルを読みましょう。

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/index/index.html

投稿日時 - 2006-03-17 23:21:10

お礼

参考になるソースありがとうございます。

手書きで
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (draw)
{
Dousa d = new Dousa();
d.Draw(e.Graphics);
}
}
}
とすると、無反応でしたが、


Form1.csに以下のように記述すると動作しました。
Form1_Paintは手書きだけでは動作しないのでしょうか?


protected override void OnPaint(PaintEventArgs e)
{
if (draw)
{
Dousa d = new Dousa();
d.Draw(e.Graphics);
}
}

投稿日時 - 2006-03-18 17:56:38

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#2です。

>Form1_Paintは手書きだけでは動作しないのでしょうか?

掲載したコードだけでは足りないのです。VisualStudioが自動生成しているコードが必要です。
VisualStudioのバージョンによって場所が変わるのですが、仮にVisualStudio2005かVisualC# 2005 ExpressEditionなら、Form1.Designer.csに

this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);

というコードがあるはずです。(普段は隠されているので、"Windows フォーム デザイナで生成されたコード"という部分をダブルクリックするか、左側の+マークをクリックして下さい)

これが、フォームがPaint処理を呼ぶ時に呼び出されるイベントの定義です。
Application.Run()の中でForm1の画面が再描画されるとき、Paint()が処理されます。この時、イベントが割り当てられていればそのコードを呼び出します。


こういうイベントを割り当てるコードを自分で書けば、「手書きだけで動作する」プログラムも作れます。
C#は、必要な事は基本的に生成されたコード内に書いてありますから、自動生成された.csファイルに全部目を通してみましょう。

投稿日時 - 2006-03-18 22:05:07

ANo.1

コンピュータやプログラミングの本の専門書は結構値段が高いものが多いので、私は県や市の図書館で見たり借りたりしています。最新でない場合もありますが、基本的な事は同じなので、私は十分だと思いますがどうでしょうか?

投稿日時 - 2006-03-17 18:30:44

あなたにオススメの質問