- PR -

フォームとビットマップのピクセル

1
投稿者投稿内容
はぎ丸
常連さん
会議室デビュー日: 2005/02/02
投稿数: 36
投稿日時: 2005-04-14 16:38
お世話になっています。

VB.NETを使用してデスクトップキャラクターみたいなものを
作成しようと思っておりますが、
ビットマップのサイズについてつまづいております。

やりたいことは下記の通りです。
1.枠なしフォームに画像を表示し、指定された色を透明にしたい。
2.表示する画像はユーザが指定できる。(大きさもまちまち)

1番に関しては解決済みです。
(フォームのPaintイベントでの描画、TransparencyKeyプロパティの指定)
2番なのですが、フォームロード時にユーザ指定のビットマップを
読み込み、ビットマップのサイズに合わせて
自フォームのサイズを変更しているのですが、
画像の右、下が切れてしまいます。
(つまり、フォームの大きさが足りていない)

デバッグで停止させて、画像のサイズが間違っていないかを確認したのですが、
正しい値を取得できることは確認しました。
(Explorerのプロパティを表示し、概要タブで確認したものと比較)

フォームのサイズで使用されている単位と、
Explorerのプロパティで表示されている単位が異なるのかと思い、
フォームのサイズ単位を調べてみましたが、共にピクセルとのこと。

同じピクセルを単位とするならばぴったりのサイズになると考えているのですが、
うまくいきません。
ビットマップの解像度にも依存するのかとも考えています。

どなたかご存知の方がいらっしゃいましたら
ご教授お願いいたします。

#暫定対応で縦横共に100ピクセルずつ加えて表示していますが、
#あまりにもみっともないので^^;

--------------------------------------------------------
'イメージの保存領域
Private _frmBackImage As Bitmap

'コンストラクタ
Public Sub New()
 MyBase.New()
 ' この呼び出しは Windows フォーム デザイナで必要です。
 InitializeComponent()

 ' InitializeComponent() 呼び出しの後に初期化を追加します。
 Me._frmBackImage = New Bitmap("c:\img.bmp")
End Sub

'フォームのペイントイベント
Private Sub frm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
 e.Graphics.DrawImage(_frmBackImage, 0, 0)
End Sub

'フォームロードイベント
Private Sub frm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 '画像の大きさに合わせてフォームのサイズを変更する。
 Me.Width = Me._frmBackImage.Width
 Me.Height = Me._frmBackImage.Height
End Sub
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-04-14 16:44
SizeやWidth、Heightプロパティは枠やタイトルバーも含んだサイズを表します。
ClientSizeプロパティをイメージのサイズと同じにすれば良いんではないでしょうか。
はぎ丸
常連さん
会議室デビュー日: 2005/02/02
投稿数: 36
投稿日時: 2005-04-14 17:08
Hongliangさん
早速のご回答、ありがとうございました。
引用:

Hongliangさんの書き込み (2005-04-14 16:44) より:
SizeやWidth、Heightプロパティは枠やタイトルバーも含んだサイズを表します。
ClientSizeプロパティをイメージのサイズと同じにすれば良いんではないでしょうか。


上記の通りClientSizeを使用して試してみました。

--修正前---------------------------
 Me.Width = Me._frmBackImage.Width
 Me.Height = Me._frmBackImage.Height

--修正1---------------------------
 Me.ClientSize = New System.Drawing.Size(Me._frmBackImage.Width, Me._frmBackImage.Height)
と修正したところ横幅は少し広い、縦幅は依然足りていない(切れている)状態です。

--修正2---------------------------
Me.ClientSize = Me._frmBackImage.Size
と修正しても修正1の内容と変わりませんでした。
(書き方が違うだけなので当たり前といえば当たり前ですが。。。)

普段はタイトルバーがついているアプリケーションしか
開発したことがなかったのでタイトルバーや枠の線の
太さ、大きさも含んでいるとは思いませんでした^^;

もう少しがんばってみます。
どうもありがとうございました^^
はぎ丸
常連さん
会議室デビュー日: 2005/02/02
投稿数: 36
投稿日時: 2005-04-14 17:18
途中経過
自己レスです。
FormBorderStyleのプロパティを
デフォルトの「Sizable」から
今回使用している「none」に変更すると
フォーム自体のサイズが勝手に変更されることを確認しました。
切れている部分はタイトルバーのサイズではないようでした^^;
はぎ丸
常連さん
会議室デビュー日: 2005/02/02
投稿数: 36
投稿日時: 2005-04-14 17:47
たびたび自己レスですみません。
解決しました。

理由は不明ですが、フォームのPaintイベントだと、
うまくいかず、別の方法で画像表示、透明化を行ったところ、
希望通りの結果となりました。

解決した方法を下記に書いておきます。
お騒がせしてすみませんでした^^;

------------------------------------------------------
'フォームロードハンドラ
Private Sub frmBase_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 'フォーム自体を透明にする。
 Me.TransparencyKey = Color.White
 Me.BackColor = Color.White

 '表示する画像の読み込み
 Me._frmBackImage = New Bitmap("c:\img.bmp")

 '画像の透明化
 Me._frmBackImage.MakeTransparent(Color.White)
 Me.pctBaseImage.Image = Me._frmBackImage

 '画像の大きさに合わせてフォームのサイズを変更する。
 Me.ClientSize = Me._frmBackImage.Size
End Sub
1

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