windowの後ろにまわっても消えない図 – プログラミング – Home

windowの後ろにまわっても消えない...
 
通知
すべてクリア

windowの後ろにまわっても消えない図


T
 T
(@T)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

こんにちは。お世話になります。環境は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( 因数 );として呼び出す必要がありますよね?


引用解決済
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 21年前
投稿: 1467
 

FormのPaintイベントで描写するようにすればいいのではないでしょうか?

タイミング的にあるボタンを押すと特定のイメージを描画していると少し工夫がいると
思いますが。
(描画データをどのように持つかですがねぇ。ここら辺得意じゃない(汗))


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

出来れば、Managedかどうか位は断ってほしいと思いますけれど。

Windowsの描画はOSから送られてくるWM_PAINTを受けた時にその時点で描画すべき内容を
いつでも再現できるようにしておくのが基本です。
Managedでどの部分がWM_PAINTを受けた時に動く部分なのかは分からないですが、
この辺の仕組みは同じだと思うのでWM_PAINTを受けた時に動くのがどの関数なのかを
ご自分で調べてみてはどうでしょう?
この辺の仕組みに関してはいきなりManagedでやるよりも普通にMFCでやってみた方が
まだ分かりやすそうです。
さらに言うとWin32APIのみでやった方が掴めるけれど。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

訂正。
>この辺の仕組みに関してはいきなりManagedでやるよりも普通にMFCでやってみた方が
>まだ分かりやすそうです。

これは、私がMFCに慣れているからと言うだけでした。
と言うわけで撤回しておきます。

>さらに言うとWin32APIのみでやった方が掴めるけれど。
これに関しては多分正解だと思う。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 59
 

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++がデフォルトだと思ってしまうのかも。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 59
 

またURL間違えた。。。orz

Formのイベントは
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfsystemstringclasstopic.asp

# System::Stringになっているのは、ググル時にやりやすかったからです。
# 結局ツリーをたどらないと目的のところまでいけないので。。。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 59
 

ゴメソ。。。

正)
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsFormEventsTopic.as
p

# フレームだと、なんだかわかんなくなる。


返信引用
T
 T
(@T)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

皆さん返信ありがとうございます。上手くいくかどうかはもうちょっと時間かけて試し
てみます。また更新の際にはのぞいてください。

PATIOさん失礼しました。Managedと明記するように心がけます。自分はManagedとMFCは
ほぼ同時に始めたのでMFCもある程度知識はあるんですけど、Managedのほうがどちらか
と言うと分かりやすいですね(これは両方同時に始めてみないと分からないかもで
す…)。さらに__gcの機能は魅力的(どれだけすごいか実感するほど深い知識はないで
すが…)。MFCはコードをどこに追加すれば良いか、とても迷います。Managedはオート
マ限定で車の免許を取ってるみたいな感じですかね。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 59
 

色々調べたところ簡単な方法がありましたので紹介しておきます。

(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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました