【最大10000ポイント】当たる!!質問投稿キャンペーン!

vb2005での角の丸いフォームの作り方を教えてください。

vb6での作り方なら見つけたのですが、
vb2005で実行できるようにどう改良したらいいのか分かりません。
別のやり方でも良いので、どうか教えてください。

vb6の例
hRgn = CreateRoundRectRgn(0, 0, _
Me.Width / Screen.TwipsPerPixelX, _
Me.Height / Screen.TwipsPerPixelY, _
20, 20)
SetWindowRgn Me.hWnd, hRgn, True

A 回答 (2件)

Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal LeftRect As Integer, ByVal TopRect As Integer, ByVal RightRect As Integer, ByVal BottomRect As Integer, ByVal WidthEllipse As Integer, ByVal HeightEllipse As Integer) As Integer



Private Declare Function SetWindowRgn Lib "user32.dll" (ByVal hWnd As Integer, ByVal hRgn As Integer, ByVal bRedraw As Boolean) As Integer

Private Sub Form1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Click
Dim hRgn As Integer
Dim RightRect As Integer = VB6.PixelsToTwipsX(Me.Width) / VB6.TwipsPerPixelX
Dim BottomRect As Integer = VB6.PixelsToTwipsY(Me.Height) / VB6.TwipsPerPixelY
hRgn = CreateRoundRectRgn(0, 0, RightRect, BottomRect, 20, 20)
SetWindowRgn(Me.Handle.ToInt32, hRgn, True)
End Sub

で、試してください。
    • good
    • 0

<br /> 個人的には,Mono + Linuxとかの環境を考えるとWin32 APIに頼るのは得策ではないと考える。<br

> http://dobon.net/vb/dotnet/form/formregion.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NETでボタンの形状を変えたい

VB.NETにて角ばった四角いボタンから、XPのIE6でWEBページを見たときに表示される角の丸まったボタンに変更することはできるのでしょうか?
わかるかたいらっしゃいましたら教えてください。

Aベストアンサー

Windows XP スタイルを適用したいということでしたら下記をどうぞ。
ただし Windows XP でしかできません。
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=vb.net+xp%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB&num=50

全てのクライアントで実現したいのでしたらコントロールを自作するしかありません。
下記は私が参考にしているサイトです。
http://www.codeproject.com/

QC#で角が丸いテキストボックス

C#で角が丸いテキストボックス

C#で角が丸いテキストボックスを作成したいと考えています。
グループ化されたラベルやテキストボックスを解り易くしたい為です。

どなたかアドバイスよろしくお願いします。

Aベストアンサー

 こんばんは。
 ん? リージョンの事ですかねえ。
 http://dobon.net/vb/dotnet/form/formregion.html

 RoundRectangleのリージョンは存在しないので、チョッと面倒みたいです。
 http://www.geekpedia.com/code112_Draw-Rounded-Corner-Rectangles-Using-Csharp.html

 上記のソースを御拝借して書くと、こんな感じです。かなり雑ですが、参考程度に。
 後はTextBoxのBorderStyleをNoneにしておいて、TextBox用のペイントハンドラで、RoundRectangleの枠を描いて見てください。

private void SetRoundRect(Control ctl, float radius)
{
int width = ctl.Width;
int height = ctl.Height;

System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();

gp.AddLine(radius, 0, width - (radius * 2), 0); // Line
gp.AddArc(width - (radius * 2), 0, radius * 2, radius * 2, 270, 90); // Corner
gp.AddLine(width, radius, width, height - (radius * 2)); // Line
gp.AddArc(width - (radius * 2), height - (radius * 2), radius * 2, radius * 2, 0, 90); // Corner
gp.AddLine(width - (radius * 2), height, radius, height); // Line
gp.AddArc(0, height - (radius * 2), radius * 2, radius * 2, 90, 90); // Corner
gp.AddLine(0, height - (radius * 2), 0, radius); // Line
gp.AddArc(0, 0, radius * 2, radius * 2, 180, 90); // Corner
gp.CloseFigure();
ctl.Region = new Region(gp);
}

private void Form1_Load(object sender, EventArgs e)
{
SetRoundRect(this.textBox1, 20.0F);
}

 こんばんは。
 ん? リージョンの事ですかねえ。
 http://dobon.net/vb/dotnet/form/formregion.html

 RoundRectangleのリージョンは存在しないので、チョッと面倒みたいです。
 http://www.geekpedia.com/code112_Draw-Rounded-Corner-Rectangles-Using-Csharp.html

 上記のソースを御拝借して書くと、こんな感じです。かなり雑ですが、参考程度に。
 後はTextBoxのBorderStyleをNoneにしておいて、TextBox用のペイントハンドラで、RoundRectangleの枠を描いて見てください。

private void S...続きを読む

Q角の丸いボタン作成について質問です。

角の丸いボタン作成について質問です。

開発環境
XP
Visual Studio 2005、C/C++でWindowsAPIを使用。

リソースを使用してボタンを配置しているのですが、
ボタンの角がとがっているので、丸くしたいのですがどうすればいいのでしょうか?
ちなみに、プロパティシートで使用しています。

CreateWindow又はCreateWindowExを使用しての方法も教えて頂けると助かります。

Aベストアンサー

オーナードローにするか、Visual Style にするかになると思います。

Visual Style については
http://keicode.com/windows/ui01.php
が参考になると思います。

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QC#を用いて描画する四角形の角を丸くする方法

教えて下さい。
書籍やインターネットで調べているのですが、四角形の角を丸く(ワードの図形描画にある「角丸四角」です。)したり面取り(日曜大工で角を落とすのとおなじ)にはどのようにしたら良いのでしょうか?
多角形は参考するのがあったのですが、「角」の加工について調べたのですが見当たりませんでした。

【四角形描画】
//Graphicsオブジェクトの作成
Graphics g = PictureBox1.CreateGraphics();
//Penオブジェクトの作成(幅1の黒色)
//(この場合はPenを作成せずに、Pens.Blackを使っても良い)
Pen p = new Pen(Color.Black, 1);
//(10,20,100,80)の長方形を描く
g.DrawRectangle(p, 10, 20, 100, 80);
//リソースを開放する
p.Dispose();
g.Dispose();

【四角形の一箇所の角を丸くする】
 →四角形の角の描画が残ってしまう。
//Graphicsオブジェクトの作成
Graphics g = PictureBox1.CreateGraphics();
//位置(10, 20)に100x80の四角を赤色で描く
g.DrawRectangle(Pens.Red, 10, 20, 100, 80);
//先に描いた四角に外接する楕円の一部
//(開始角度 0度、スイープ角度 90度)を黒で描く
g.DrawArc(Pens.Black, 10, 20, 100, 80, 0, 90);
//リソースを開放する
g.Dispose();

教えて下さい。
書籍やインターネットで調べているのですが、四角形の角を丸く(ワードの図形描画にある「角丸四角」です。)したり面取り(日曜大工で角を落とすのとおなじ)にはどのようにしたら良いのでしょうか?
多角形は参考するのがあったのですが、「角」の加工について調べたのですが見当たりませんでした。

【四角形描画】
//Graphicsオブジェクトの作成
Graphics g = PictureBox1.CreateGraphics();
//Penオブジェクトの作成(幅1の黒色)
//(この場合はPenを作成せずに、Pens.Blackを使っても...続きを読む

Aベストアンサー

>隅の扇形を描く前に、角を含む四角形で消去(背景色で描画)してはいかがでしょうか。

背景がビットマップとかで消したくない場合はNGですね。
パスを使って描画範囲を限定するのがいいかと。


WindowsAPIならRoundRect()で一発なんですけどね。
.NETの場合は、こんな感じで組み合わせればいいでしょう。

角の丸い四角形を描画します。
System.Drawing.Drawing2D.GraphicsPath.AddLines
System.Drawing.Pen.LineJoin = System.Drawing.Pen.LineJoin.Round
System.Drawing.Graphics.DrawPath
System.Drawing.Graphics.FillPath

参考URL:http://www.microsoft.com/japan/msdn/net/general/win32map.asp

QVB.NETでラベルの大きさってどうやって変えるの?

VB.NETでラベルの大きさってどうやって変えるの?
バージョンは2008

Aベストアンサー

あれ?
普通に
Widthプロパティ
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.width%28VS.100%29.aspx
やHeightプロパティを変更すればできるはずだけど、コード、IDE問わず。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.height%28VS.100%29.aspx

#まぁAutoSizeプロパティをfalseにしないと、Textプロパティに代入された文字列を格納するのに必要な最低限の大きさに自動で調整されちゃうみたいだけど。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.autosize.aspx

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

Qボタンをマウスで押し続けたときのイベント

VB2005,Frameworks2を使用しています。

フォームに設置したButtonは、通常マウスをクリックする度にイベントが発生しますが、これをボタンをマウスで押している間だけイベントを発生されたいのですがその様なイベントやボタンの設定が見つかりません。

やはりタイマー等を使わないと再現できないのでしょうか?
よろしくお願いします。

Aベストアンサー

繰り返し処理ならMouseDownでタイマースタート、MouseUpでタイマー停止、がシンプルだと思われます。
ボタンを押している間だけ何らかの処理が進行するようなものなら、マルチスレッドですかね。MouseDownでスレッドスタート、MouseUpでスレッドを停止させるようなフラグをONにするか、スレッド強制終了させるか。。。
どちらにしても、イベントのプロシージャからは即座に脱出しないとパフォーマンスに影響します。

Qvb.net 画像の透過について

背面画像Aと前面画像Bがあります。
画像Bは画像A上をファイルから読み込んだ
X,YのLocationを任意に移動します。

Bの画像の白色の部分を透過にして、背面の画像Bが見えるように
表示したいのですが、うまくいきません。

PictureBoxコントロールのimageプロパティに
画像Bを設定して、backColorにTransparentを指定しても
親コントロール(画像Bを表示しているPictureBox)の
BackColorで表示されるだけでした。

vb6だとimageコントロールを使用すればできました。

vb.netで何か良い方法はないでしょうか?

Aベストアンサー

PictureBoxで透過処理を行うのであれば BackColorプロパティを Color.TransParentに変更します
次に 設定する画像を Bitmapオブジェクトで構築して
MakeTransparentメソッドで 何色を透明にしたいか設定します

次に 透過画像の背景になるコントロールの ControlsコレクションにAddします
PictureBoxの Locationを適切な位置に変更すれば 希望の動作になるかと …

' 透過画像を用意
Dim bmp as new Bitmap("透過画像のパス")
' 透過色を設定
bmp.MakeTransparent(bmp.GetPixel(0,0))
' コントロールの背景色を透過に設定
PictureBox2.BackColor = TransParent
' 透過画像を設定
PictureBox2.Image = bmp
' ここまでが初期設定


' 背景になるPictureBoxに 前景のコントロールを追加
if PictureBox1.Controls.Contains(PictureBox2) = false then
  PictureBox1.Controls.add(PictureBox2)
End if
' 前景の描画位置を設定
PictureBox2.Location = new Point( PictureBox1.Width / 2, PictureBox1.Height / 2)

といった具合です

PictureBoxで透過処理を行うのであれば BackColorプロパティを Color.TransParentに変更します
次に 設定する画像を Bitmapオブジェクトで構築して
MakeTransparentメソッドで 何色を透明にしたいか設定します

次に 透過画像の背景になるコントロールの ControlsコレクションにAddします
PictureBoxの Locationを適切な位置に変更すれば 希望の動作になるかと …

' 透過画像を用意
Dim bmp as new Bitmap("透過画像のパス")
' 透過色を設定
bmp.MakeTransparent(bmp.GetPixel(0,0))
' コントロールの背景色を透過...続きを読む

QFORMが開いているかどうかの確認方法

初歩の初歩だと思いますが。。。。

formが開いているかどうかの確認方法を教えてください。プロパティで確認できるのでしょうか?

Aベストアンサー

Form.Visible = True : 表示されている
Form.Visible = False : 表示されていない

でいいと思いますよ~

それとも二重起動禁止の方が知りたいんでしょうか?


人気Q&Aランキング