C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[18]: フォームをコントロールの形にくりぬきたい


(過去ログ 58 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■33399 / inTopicNo.1)  フォームをコントロールの形にくりぬきたい
  
□投稿者/ ken (36回)-(2009/02/27(Fri) 13:47:51)

分類:[VB.NET/VB2005 以降] 

VB2005+WINXP(SP2)です。

FormにPanelを貼り付けています。
で、以下のURLを参考にフォームをPanelの形にくりぬきたいのですが、
http://dobon.net/vb/dotnet/form/formregion.html#section2

    'GraphicsPathの作成
    Dim path As New Drawing2D.GraphicsPath()
    path.AddRectangle(New Rectangle(Me.Panel1.Left, Me.Panel1.Top, Me.Panel1.Width, Me.Panel1.Height))
    '形を変更
    Me.Region = New Region(path)

とすると、タイトルバーの座標分だけずれてくりぬかれているようです。
きれいにフォームをコントロールの形にするにはどうすればよいのでしょうか


引用返信 編集キー/
■33400 / inTopicNo.2)  Re[1]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (698回)-(2009/02/27(Fri) 13:57:41)
Panel がタイトルバーに重なってないからじゃなくて?
引用返信 編集キー/
■33401 / inTopicNo.3)  Re[2]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (699回)-(2009/02/27(Fri) 14:05:20)
もしくは、リージョンの指定座標はフォームの左上が基準で
コントロールは、タイトルバーの下が基準だから。。
引用返信 編集キー/
■33404 / inTopicNo.4)  Re[3]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (37回)-(2009/02/27(Fri) 14:50:03)
2009/02/27(Fri) 14:54:14 編集(投稿者)
2009/02/27(Fri) 14:53:41 編集(投稿者)

No33401 (.SHO さん) に返信
> もしくは、リージョンの指定座標はフォームの左上が基準で
> コントロールは、タイトルバーの下が基準だから。。

返答ありがとうございます。
指摘の通り、リージョンの指定座標はフォームの左上が基準のようですが、
この基準を指定することは可能なのでしょうか。

それとも、
path.AddRectangle(New Rectangle(Me.Panel1.Left, Me.Panel1.Top, Me.Panel1.Width, Me.Panel1.Height))
の時点で、タイトルバーの高さ(SystemInformation.CaptionHeight )を足すしかないのでしょうか。

#追記
path.AddRectangle(New Rectangle(Me.Panel1.Left, Me.Panel1.Top + SystemInformation.CaptionHeight, Me.Panel1.Width, Me.Panel1.Height))
上記のようにすると、フォームの境界線の太さ(?)分、ずれました。
境界線の幅も考慮しなければならないのでしょうか・・・

引用返信 編集キー/
■33405 / inTopicNo.5)  Re[4]: フォームをコントロールの形にくりぬきたい
□投稿者/ Hongliang (340回)-(2009/02/27(Fri) 14:54:34)
PointToScreenとPointToClientで調整すればいいんじゃないですか?
引用返信 編集キー/
■33408 / inTopicNo.6)  Re[5]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (38回)-(2009/02/27(Fri) 15:50:24)
No33405 (Hongliang さん) に返信
> PointToScreenとPointToClientで調整すればいいんじゃないですか?

ありがとうございます。
下記のようにしてみたのですが、まだパネルの左部と下部が切れ、右部と上部にフォームの一部が残ってしまいます。

        Dim rF As Rectangle = Me.RectangleToScreen(Me.ClientRectangle)
        Dim rP As Rectangle = Me.Panel1.RectangleToScreen(Me.Panel1.ClientRectangle)

        path.AddRectangle( _
            New Rectangle( _
                Me.Panel1.Left + (rP.Left - rF.Left), _
                Me.Panel1.Top + (rP.Top - rF.Top), _
                Me.Panel1.Width, _
                Me.Panel1.Height _
            ) _
        )

        '形を変更
        Me.Region = New Region(path)


引用返信 編集キー/
■33409 / inTopicNo.7)  Re[6]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (700回)-(2009/02/27(Fri) 16:16:33)
No33408 (ken さん) に返信

> 下記のようにしてみたのですが、まだパネルの左部と下部が切れ、右部と上部にフォームの一部が残ってしまいます。

右部と上部が残るんですか?
左部と上部じゃなくて?
引用返信 編集キー/
■33411 / inTopicNo.8)  Re[7]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (39回)-(2009/02/27(Fri) 16:26:57)
2009/02/27(Fri) 16:29:42 編集(投稿者)
<pre><pre>■No33409 (.SHO さん) に返信
> ■No33408 (ken さん) に返信
> 
>>下記のようにしてみたのですが、まだパネルの左部と下部が切れ、右部と上部にフォームの一部が残ってしまいます。
> 
> 右部と上部が残るんですか?
> 左部と上部じゃなくて?

━:フォームの境界線
─:パネルの境界線
*:フォーム

┏━━━━━━━┓
┃*******┃
┃*┌───┐*┃
┃*│   │*┃
┃*│   │*┃
┃*└───┘*┃
┃*******┃
┗━━━━━━━┛

から、パネルのサイズでくりぬこうとしたのですが、

   ***** 
   ───┐* 
      │* 
      │* 
         
         
上図のようにパネルの左、下が切れ、上、右にフォームが残っているという状態です。

試したコード
Dim rF As Rectangle = Me.RectangleToScreen(Me.ClientRectangle)
Dim rP As Rectangle = Me.Panel1.RectangleToScreen(Me.Panel1.ClientRectangle)

path.AddRectangle( _
    New Rectangle( _
        Me.Panel1.Left + (rP.Left - rF.Left), _
        Me.Panel1.Top + (rP.Top - rF.Top), _
        Me.Panel1.Width, _
        Me.Panel1.Height _
    ) _
)

'形を変更
Me.Region = New Region(path)



</pre></pre>

引用返信 編集キー/
■33415 / inTopicNo.9)  Re[8]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (702回)-(2009/02/27(Fri) 17:07:46)
No33411 (ken さん) に返信

>    ***** 
>    ───┐* 
>       │* 
>       │* 

う〜ん、、、Rectangleにリージョン切ったら、座標のズレはあったとしても
こうはならないですよね。。。なんか変。

RectangleToScreen の調整する前から、こういう状況ですか?
引用返信 編集キー/
■33416 / inTopicNo.10)  Re[9]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (40回)-(2009/02/27(Fri) 17:24:49)
No33415 (.SHO さん) に返信
> RectangleToScreen の調整する前から、こういう状況ですか?

Dim path As New Drawing2D.GraphicsPath()
path.AddRectangle(New Rectangle(Me.Panel1.Left, Me.Panel1.Top, Me.Panel1.Width, Me.Panel1.Height))
Me.Region = New Region(path)

とした場合、結果は少し違いますが、やはりずれます。
FormのFormBorderStyleをnoneにすればバッチリくりパネルのみ表示されるんですが、
タイトルバーが表示されている場合はずれます。



引用返信 編集キー/
■33418 / inTopicNo.11)  Re[10]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (703回)-(2009/02/27(Fri) 17:57:24)
SystemInformation.CaptionHeight を足すのはダメだったんですか?
ようは、調整すればいいだけのような気がしますが、、、
引用返信 編集キー/
■33420 / inTopicNo.12)  Re[11]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (41回)-(2009/02/27(Fri) 18:19:25)
No33418 (.SHO さん) に返信
> SystemInformation.CaptionHeight を足すのはダメだったんですか?
> ようは、調整すればいいだけのような気がしますが、、、

No33404にも書きましたが、
path.AddRectangle(New Rectangle(Me.Panel1.Left, Me.Panel1.Top + SystemInformation.CaptionHeight,Me.Panel1.Width, Me.Panel1.Height))

とするとフォームの境界線の太さ(?)分、ずれました。

path.AddRectangle(New Rectangle(Me.Panel1.Left + ((Me.Size.Width - Me.ClientRectangle.Size.Width) / 2), Me.Panel1.Top + SystemInformation.CaptionHeight + ((Me.Size.Height - Me.ClientRectangle.Size.Height - SystemInformation.CaptionHeight) / 2), Me.Panel1.Width, Me.Panel1.Height))
上記の通りしたら、きれいに切り取られました。

このように調整するしかないのでしょうか。
もっと簡潔にする方法はあるのでしょうか?
引用返信 編集キー/
■33421 / inTopicNo.13)  Re[12]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (704回)-(2009/02/27(Fri) 18:26:56)
No33420 (ken さん) に返信

> もっと簡潔にする方法はあるのでしょうか?

どうせ、初期化かどこかで1回しかやらない処理だし十分じゃないですか?
目的は達成してるし。

後は、1行で書かないようにするとか…
どっちが簡潔かは好みですが。
引用返信 編集キー/
■33423 / inTopicNo.14)  Re[13]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (42回)-(2009/02/27(Fri) 18:46:14)
No33421 (.SHO さん) に返信
> ■No33420 (ken さん) に返信
>
>>もっと簡潔にする方法はあるのでしょうか?
>
> どうせ、初期化かどこかで1回しかやらない処理だし十分じゃないですか?
> 目的は達成してるし。
>
> 後は、1行で書かないようにするとか…
> どっちが簡潔かは好みですが。

FormBorderStyleがSizebleですと、きれいに切り取られるのですが、
それ以外だと上記のロジックのままだとずれます。
どうせ、一回しかやらない処理なのでいいのですが、汎用的にならないものかと・・・
解決済み
引用返信 編集キー/
■33424 / inTopicNo.15)  Re[14]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (705回)-(2009/02/27(Fri) 19:03:53)
> FormBorderStyleがSizebleですと、きれいに切り取られるのですが、
> それ以外だと上記のロジックのままだとずれます。
> どうせ、一回しかやらない処理なのでいいのですが、汎用的にならないものかと・・・

パネルの部分だけ切り取ってしまったら BorderStyle なんて意味ないので
Sizeble 固定でいいような気もしますが…
解決済み
引用返信 編集キー/
■33427 / inTopicNo.16)  Re[15]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (43回)-(2009/02/27(Fri) 19:52:23)
No33424 (.SHO さん) に返信
>>FormBorderStyleがSizebleですと、きれいに切り取られるのですが、
>>それ以外だと上記のロジックのままだとずれます。
>>どうせ、一回しかやらない処理なのでいいのですが、汎用的にならないものかと・・・
>
> パネルの部分だけ切り取ってしまったら BorderStyle なんて意味ないので
> Sizeble 固定でいいような気もしますが…

もちろん、結果としていいんですけどね。ちょっと気になったもんですから。
ありがとうございました。
引用返信 編集キー/
■33428 / inTopicNo.17)  Re[16]: フォームをコントロールの形にくりぬきたい
□投稿者/ .SHO (706回)-(2009/02/27(Fri) 19:57:55)
No33427 (ken さん) に返信

> もちろん、結果としていいんですけどね。ちょっと気になったもんですから。
> ありがとうございました。

FormBorderStyle を判断して調整する汎用関数を作成しちゃえばいいと思います。
解決済み
引用返信 編集キー/
■33430 / inTopicNo.18)  Re[17]: フォームをコントロールの形にくりぬきたい
□投稿者/ Hongliang (341回)-(2009/02/27(Fri) 20:27:49)
Rectangle rect = form1.RectangleToScreen(panel1.Bounds);
rect.Offset(-form1.Left, -form1.Top);
form1.Region = new Region(rect);

でいけると思うんですけど。というかいけたんですけど。FormBorderStyleによらず。
引用返信 編集キー/
■33489 / inTopicNo.19)  Re[18]: フォームをコントロールの形にくりぬきたい
□投稿者/ ken (44回)-(2009/03/02(Mon) 10:43:31)
No33430 (Hongliang さん) に返信
> Rectangle rect = form1.RectangleToScreen(panel1.Bounds);
> rect.Offset(-form1.Left, -form1.Top);
> form1.Region = new Region(rect);
>
> でいけると思うんですけど。というかいけたんですけど。FormBorderStyleによらず。

なるほど、Offsetですか
ありがとうございます!
できました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -