- PR -

描画に関するWebユーザーコントロールについて

投稿者投稿内容
alf
常連さん
会議室デビュー日: 2005/11/15
投稿数: 22
お住まい・勤務地: 岐阜県・愛知県
投稿日時: 2005-11-15 10:32

初投稿になります。

Webユーザーコントロールに下記のようなコードを実装しています。

private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

Bitmap bitmap = new Bitmap(100,100);
Graphics g = Graphics.FromImage(bitmap);
g.DrawRectangle(Pens.Red,0,0,100,100);
// Send the bitmap to the output stream
bitmap.Save(Response.OutputStream,ImageFormat.Jpeg);
// Cleanup
g.Dispose();
bitmap.Dispose();
}

問題点が二つあります。
・このユーザーコントロールを実装側のFormのどこに配置しても必ず左上から描画
 されてしまう
・このユーザーコントロールを実装すると他のコントロールが全て消えてしまう

これらを解決するにはどうしたらよろしいでしょうか?

なにぶんWebユーザーコントロールに描画を用いた例が書籍やWebで調べても、殆
ど見かけないだけに今回この場を借りて質問させて頂いた次第です。
今まで仕事では主にVC++で開発を行っていて今回初めてASP.NET+C#をやることに
なりましたが、想像以上に勝手が違うので悪戦苦闘しています。

ASP.NETというよりもどちらかというとC#寄りの質問かもしれませんが、何卒ご教
授の方願います。

[開発環境] ASP.NET+C#(.NET2003)
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-15 11:27
こんにちは。

Response.OutputStream
レスポンスのストリームですので、こいつに書き出してしまうと、他の全てが消えてしまうようですね。(タイミングによっては動作が変わるのかな?)

代案は、どっかにテンポラリファイルとして書き出して、Image コントロールの URL がそこを指すようなコントロールにする、とかですかね。
画像がページの一部になっているならば、ブラウザに画像を取りに行かせないと駄目なような気がします。(ファイルにする必要は必ずしもないかもしれません。)
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-11-15 11:31
Webでは、一度の返信(レスポンス)に画面の全ての情報が入っているわけではありません。
初めの要求でHTMLを取得して、その中に<img>タグなどの別のリソース(ファイル等)への参照があれば、それを取得するための別の要求をサーバーへ出して画面を作っていきます。

ユーザーコントロールが画面に張ってある場合は、画面とユーザーコントロールをひとつの返信としてクライアントに返します。
つまり、alfさんのソースはHTMLと画像のデータを一度に返そうとしているということですので、それは無理です。

ちなみに、InitializeComponent()にコードを書いても、デザイナで変更を加えたら消えませんか?
「このメソッドの内容をコード エディタで変更しないでください」って書いてありますけど。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-11-15 11:37
HTML寄りの質問でしょうね。

> Webユーザーコントロールに下記のようなコードを実装しています。

Web Formで実装する。

> このユーザーコントロールを実装側のFormのどこに配置しても必ず左上から描画
> されてしまう

実装側のFormには、imgタグ(またはImageコントロール)で配置する。



動的にイメージを作成してみよう
http://www.ailight.jp/ASPGraph.aspx
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-11-15 11:43
引用:

囚人さんの書き込み (2005-11-15 11:27) より:
Response.OutputStream
レスポンスのストリームですので、こいつに書き出してしまうと、他の全てが消えてしまうようですね。(タイミングによっては動作が変わるのかな?)



表示された画像を保存して、テキストエディタで見ると、画像データの後に<HTML><HEAD>とか書いてありますね。
通常のHTMLの前に画像のデータが書き出されてしまっているという状態だと思います。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-15 11:51
引用:

通常のHTMLの前に画像のデータが書き出されてしまっているという状態だと思います。


お〜、なるほど。
「他の全てが消えている」ではなく、「他の全てが書き出される前に書く、他の全てはその後に書く」んですね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-15 21:36
 あ〜、AI Light さん ところのその例は、一点だけ要注意です。

 Response.End をコールすると、その時点で実行が中断します。これ以降の行は実行されません。したがって、graphics と bitmap は(明示的には)解放されていません。
# 指摘済み
# 暗黙的に、いつかは解放されます

 解放については、じゃんぬさんのところを参照。→オブジェクトの破棄を保証する
___________________________________________________________________
□ written by Jitta on 2005/11/15
□ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
alf
常連さん
会議室デビュー日: 2005/11/15
投稿数: 22
お住まい・勤務地: 岐阜県・愛知県
投稿日時: 2005-11-17 11:19
スレッドを立てたalfです。
数々のレスポンス有難うございます。
早速皆さんのご指摘どおり、Webユーザーコントロールは止めてWebフォーム上の
Imageコントロールに画像を張りつけるように変更しました。

ボタンが押された時に描画オブジェクト上の指定された位置に矩形を描画/削除す
るのが本来の目的で、イベントハンドラ内に次のコードを記述しました。

投稿後も色々調べたり、ここで紹介されたサイトやレスを何度も読み返したりし
たのですが、どこか根本的に間違っているのか相変わらず他のコントロールが消
える&Imageが左上から表示・・・という当初の状況に陥ってしまいます。

何卒お力添えの程願います。

private void Button1_Click(object sender, System.EventArgs e)
{
// ■座席表に対する描画
string image = "zaseki.jpeg";
Bitmap bitmap = new Bitmap(Server.MapPath(image));
MemoryStream memStream = new MemoryStream();

Graphics g = Graphics.FromImage(bitmap);
g.SmoothingMode = SmoothingMode.AntiAlias;

int width = bitmap.Width;
int height = bitmap.Height;
g.DrawRectangle(Pens.Red,width / 3,height / 3,width * 2 / 3,height * 2 / 3);

// Set the content type
Response.ClearContent();
Response.ContentType="image/jpeg";

// Send the bitmap to the output stream
bitmap.Save(memStream, ImageFormat.Jpeg);
Response.BinaryWrite(memStream.ToArray());

memStream.Close();
Response.End();

// Cleanup
g.Dispose();
bitmap.Dispose();
}

スキルアップ/キャリアアップ(JOB@IT)