こんにちは。お世話になります。環境はWinXP VC++.NET 2003です。
フォームの上に図を描いていたんですが、他のウィンドウの後ろに一旦隠れると消えて
しまいます。そこでPaintEnventArgsを使って描写すると良いらしいので(C#の例をまね
してみました)、下のように(かなり適当ですけど…)変えてやってみました。もちろ
ん失敗です。
元の定義
private: void DrawGrid(void)
{
Graphics *gf = this->CreateGraphics();
Pen* myPen = new Pen(Color::Black);
int width = 20;
for(int i = 0; i <= 10; i++)//x方向の線
{
gf->DrawLine(myPen, 100, 300 + width * i, 100 + width * 31, 300 + width *
i);
}
}
PaintEventArgsをこんな感じで因数として使えばいいでしょうか?
private: void DrawGrid(System::Windows::Forms::PaintEventArgs * e)
{
Graphics *gf = this->CreateGraphics();
Pen* myPen = new Pen(Color::Black);
int width = 20;
for(int i = 0; i <= 10; i++)//x方向の線
{
gf->DrawLine(myPen, 100, 300 + width * i, 100 + width * 31, 300 + width *
i);
}
}
だとするとDrawGrid( 因数 );として呼び出す必要がありますよね?
FormのPaintイベントで描写するようにすればいいのではないでしょうか?
タイミング的にあるボタンを押すと特定のイメージを描画していると少し工夫がいると
思いますが。
(描画データをどのように持つかですがねぇ。ここら辺得意じゃない(汗))
出来れば、Managedかどうか位は断ってほしいと思いますけれど。
Windowsの描画はOSから送られてくるWM_PAINTを受けた時にその時点で描画すべき内容を
いつでも再現できるようにしておくのが基本です。
Managedでどの部分がWM_PAINTを受けた時に動く部分なのかは分からないですが、
この辺の仕組みは同じだと思うのでWM_PAINTを受けた時に動くのがどの関数なのかを
ご自分で調べてみてはどうでしょう?
この辺の仕組みに関してはいきなりManagedでやるよりも普通にMFCでやってみた方が
まだ分かりやすそうです。
さらに言うとWin32APIのみでやった方が掴めるけれど。
訂正。
>この辺の仕組みに関してはいきなりManagedでやるよりも普通にMFCでやってみた方が
>まだ分かりやすそうです。
これは、私がMFCに慣れているからと言うだけでした。
と言うわけで撤回しておきます。
>さらに言うとWin32APIのみでやった方が掴めるけれど。
これに関しては多分正解だと思う。
Formのイベントは
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfsystemstringclasstopic.asp
FormのPaintイベントは
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclasspaintt
opic.asp
です。
VC++.NET 2003 上では、デザインモードで イベント用の関数を入力すれば、
自動的にコードが生成されると思われます。
> 出来れば、Managedかどうか位は断ってほしいと思いますけれど。
今回の場合は、System:: とか C#の例をまね で大体見当つきますね。
明示的に、プロジェクトの種類を書いてくれたことに超したことはないですが。
# 初めてがVC++.NETだと、MC++がデフォルトだと思ってしまうのかも。
またURL間違えた。。。orz
Formのイベントは
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfsystemstringclasstopic.asp
# System::Stringになっているのは、ググル時にやりやすかったからです。
# 結局ツリーをたどらないと目的のところまでいけないので。。。
ゴメソ。。。
正)
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsFormEventsTopic.as
p
# フレームだと、なんだかわかんなくなる。
皆さん返信ありがとうございます。上手くいくかどうかはもうちょっと時間かけて試し
てみます。また更新の際にはのぞいてください。
PATIOさん失礼しました。Managedと明記するように心がけます。自分はManagedとMFCは
ほぼ同時に始めたのでMFCもある程度知識はあるんですけど、Managedのほうがどちらか
と言うと分かりやすいですね(これは両方同時に始めてみないと分からないかもで
す…)。さらに__gcの機能は魅力的(どれだけすごいか実感するほど深い知識はないで
すが…)。MFCはコードをどこに追加すれば良いか、とても迷います。Managedはオート
マ限定で車の免許を取ってるみたいな感じですかね。
色々調べたところ簡単な方法がありましたので紹介しておきます。
(1)Form上に PictureBox と Button コントロールを配置。
PictureBox は pictureBox1, Button は button1 という変数名にします。
(2)Formのメンバ変数に Graphics*型 の変数を追加します。
System::Drawing::Graphics* grfx;
とでもしておきます。
(3)Form1のLoadイベントに Form1_Loadとでも入力し、実装します。
で、Form1_Load関数の中に下記の2行を追加します。
pictureBox1->Image = new Bitmap( pictureBox1->Width, pictureBox1->Height );
grfx = Graphics::FromImage( pictureBox1->Image );
(4)button1のClickイベントに Button1_Click とでも入力し、実装します。
で、Button1_Click関数の中に、
Pen* myPen = new Pen( Color::Black );
int width = 20;
for ( int i = 0; i <= 10; i++ )//x方向の線
{
grfx ->DrawLine( myPen, 100, 300 + width * i,
100 + width * 31, 300 + width * i);
}
pictureBox1->Refresh();
を記述します。そうすると、PictureBoxのペイントイベントで、Imageプロパティの
Imageを
再描画する処理が走るため、消えないで表示します。
参考にしたサイト
http://homepage3.nifty.com/midori_no_bike/CS/graphics.html