• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# PanelのRegion設定について)

C# PanelのRegion設定でのリサイズ問題と解決方法

このQ&Aのポイント
  • C#のPanelのRegion設定において、ボタンクリックによってRegion領域を変更する際に、リサイズの問題が発生しています。
  • 初期Locationが他の値で設定されている場合、矩形領域がリサイズされてしまいます。
  • 解決方法として、GraphicsPathを使用してRegionを設定する際に、サイズを取得する前に初期Locationを設定することで、リサイズの問題を回避することができます。

質問者が選んだベストアンサー

  • ベストアンサー
noname#251971
noname#251971
回答No.1

テスト用と言うことで記載コードの変な所にはツッコミませんが、 領域が小さくなると言う点については、 rect変数の作り方に問題があるからかと思われます。 矩形の左上をpanel1.Location.Xとpanel1.Location.Yで指定していますが、 これがどんな値かを考えてみてください。 これは、パネルを配置している親側の座標です。 パネル自身からすれば左上は常に 0, 0 になりますので new Rectangle(0, 0, panel1.Width,panel1.Height) で矩形を作ってみてください。

tamuhiro1004
質問者

お礼

ご指摘のとおり、0,0を開始点にすることで、解決できました。 panel内の矩形領域指定が間違っていたんですね。 アドバイスありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Clmage上の画像ファイルを表示する(C++)

    myRgnCreateRectRgn(rect.left,rect.top,rect.right,rect.bottom); は何をしているのか教えてください

  • Windowsプログラミング リージョンについて

    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; HRGN hRgn1, hRgn2; RECT rect; switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hRgn1 = CreateEllipticRgn(10, 10, 100, 100); hRgn2 = CreateEllipticRgn(50, 50, 200, 150); CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR); SelectClipRgn(hdc, hRgn1); GetClipBox(hdc, &rect); GetClipRgn(hdc, hRgn2); SelectClipRgn(hdc, NULL); DeleteObject(hRgn1); Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); FillRgn(hdc, hRgn2, GetStockObject(BLACK_BRUSH)); DeleteObject(hRgn2); EndPaint(hwnd, &ps); return 0; } return DefWindowProc(hwnd, msg, wp, lp); } リージョンというものがよく理解できません。 なぜCombineRgnの第一引数のリージョンが存在していないといけないのですか? DeleteObject(hRgn1);でhRgn1をDeleteしてるのにhRgn2が使えるのは なぜですか?  GetClipRgnで設定されたリージョンを取得しているようなんですか、このリージョンは領域の情報の共有ではなく、たんなる 領域の情報のコピーなのですか? DeleteObjectでDeleteしているhRgn1, hRgn2はどのリージョン(どのリージョンといった方がいいのかわかりませんが)を削除しているのか分かりません。 あと上記のソースとは関係ないのですが hRgn1 = CreateEllipticRgn(10, 10, 100, 100); hRgn2 = CreateEllipticRgn(50, 50, 200, 150); CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR); DeleteObject(hRgn1); DeleteObject(hRgn2); ←もしかしてこれは不要? としたとき DeleteObject(hRgn2);は不要なのでしょうか? 超初心者な質問ですみません。質問の仕方へたですみません。 分かる人お願いします。

  • C#で動作するコードをvbに移植したら動作しません

    以下のサイトのC#のサンプルコードを、vbに移植しました。 しかし、正常動作しません。 C#で正常動作するのは、確認しました。 とても悩んでします。 どなたか、教えていただけませんか。 よろしくお願いします。 https://tzeditor.blogspot.com/2020/02/customtitlebar.html 不具合内容は、以下になります。 ・非クライアント領域が緑になりません。白色です。 ・ウィンドウリフレッシュ(※)が動作すると、白色も消え、  普通のフォームの外観になります。  ※他のウィンドウをアクティブにする。 Imports System.Windows.Forms Imports System.Runtime.InteropServices Public Class Form1 <StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> Public Structure RECT Public Left As Int32 Public Top As Int32 Public Right As Int32 Public Bottom As Int32 Public ReadOnly Property Size As Size Get Return New Size(Right - Left, Bottom - Top) End Get End Property End Structure Declare Function GetWindowDC Lib "user32.dll" (ByVal hWnd As IntPtr) As IntPtr Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Int32 Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean Declare Function CreateRectRgn Lib "gdi32.dll" (ByVal nLeftRect As Integer, ByVal nTopRect As Integer, ByVal nRightRect As Integer, ByVal nBottomRect As Integer) As IntPtr Declare Function DeleteObject Lib "gdi32.dll" (hObject As IntPtr) As Boolean <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> Protected Overrides Sub WndProc(ByRef m As Message) Const WM_ACTIVATE As Int32 = &H6 Const WM_NCPAINT As Int32 = &H85 Const WM_NCACTIVATE As Int32 = &H86 'Dim handle As HandleRef = New HandleRef(Nothing, m.HWnd) Select Case (m.Msg) Case WM_ACTIVATE Case WM_NCPAINT Case WM_NCACTIVATE '非クライアント領域を含むデバイスコンテキストを取得 Dim hdc As IntPtr = GetWindowDC(m.HWnd) Try ' デバイスコンテキストからGraphicsを生成 ' Regionはクリッピングに使用 Using g As Graphics = Graphics.FromHdc(hdc) Using rgn As Region = New Region() Dim rect As RECT ' ウィンドウサイズを取得 ' Sizeプロパティでは正確な値が取れないので GetWindowRect(m.HWnd, rect) ' コントロールの矩形 Dim clientRect As Rectangle = New Rectangle(Point.Empty, rect.Size) ' 境界線の太さ分収縮した矩形を描画対象から外す rgn.Union(clientRect) rgn.Xor(New Rectangle(8, 31, clientRect.Width - 16, clientRect.Height - 39)) g.Clip = rgn ' タイトルバー領域の塗りつぶし g.FillRectangle(Brushes.Green, clientRect) g.FillEllipse(Brushes.Red, New Rectangle(200, 8, 20, 20)) ' WParamにはクリッピング領域のリージョンハンドルを設定 ' OSによる描画範囲を境界線の太さ分だけ収縮した矩形とする Dim wParam As IntPtr = CreateRectRgn(rect.Left + 8, rect.Top + 31, rect.Right - 8, rect.Bottom - 39) Dim m2 As Message = Message.Create(m.HWnd, m.Msg, wParam, m.LParam) MyBase.WndProc(m2) End Using End Using Catch ' 例外が発生したらOSに描画させる MyBase.WndProc(m) Finally '取得したデバイスコンテキストを解放 ReleaseDC(m.HWnd, hdc) End Try Return Case Else MyBase.WndProc(m) Return End Select End Sub End Class お手数をお掛けします。 よろしくお願いします。

  • クリッカブルマップを利用したASP.netですが

    クリッカブルマップを利用したASP.netですが 下記コードで画像表示、クリック選択場所はできたのですが クリックしてもNAVIGATEURLのページにリンクしません。 なぜでしょうか? <asp:ImageMap ID = "ImageMAP1" runat = "server" HotSpotMode = "PostBack" ImageUrl = "~/images/top.gif"> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/menu.aspx" Right = "68" Left = "2"/> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/page2.aspx" Right = "139" Left = "69"/> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/page3.aspx" Right = "209" Left = "140"/> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/page4.aspx" Right = "298" Left = "210"/> </asp:ImageMap>

  • C言語・Windows RECTが渡せない

    C言語のWindowsプログラムで、左クリック後に四角形の描画をしたいのですがうまくいきません。 WM_LBUTTONDOWNイベントで定義したRECT構造体を、別の関数に渡しRectangleで描画したいのですが、その関数内でRECTの値を調べるととんでもない値になっています。 何度やってもどうして値がおかしくなるのかわかりません。 WM_LBUTTONDOWNもWM_PAINTも正常に反応していると思います。 どうか知恵をお貸しくださいm(_ _)m 以下ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型はサイトの物を丸写しし、正常に動作することを確認しています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rcPos; switch (msg){ case WM_LBUTTONDOWN: rcPos.top =0; rcPos.left =0; rcPos.bottom =100; rcPos.right =100; InvalidateRect(hWnd, &rcPos, FALSE); break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); DrawGr(hWnd, hdc, &rcPos); EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //描画 int DrawGr(HWND hWnd, HDC hdc, RECT *rcPos) { int i; HBRUSH hBrush, hOldBrush; char *str_org = "rc.top=%d rc.left=%d rc.bottom=%d rc.right=%d"; char strx[256]; //四角形 hBrush = CreateSolidBrush(RGB(100, 100, 255)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); //デバッグ用 wsprintf((LPSTR)strx, (LPCSTR)str_org, rcPos->top, rcPos->left, rcPos->bottom, rcPos->right); MessageBox(hWnd, (LPCSTR)strx, (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); Rectangle(hdc, rcPos->left, rcPos->top, rcPos->right, rcPos->bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return 0; }

  • クリッカブルマップを利用したASP.netですが

    クリッカブルマップを利用したASP.netですが <asp:ImageMap ID = "ImageMAP1" runat = "server" HotSpotMode = "Navigate" ImageUrl = "~/images/top.gif"> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/menu.aspx" Right = "68" Left = "2"/> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/page2.aspx" Right = "139" Left = "69"/> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/page3.aspx" Right = "209" Left = "140"/> <asp:Rectangle HotSpot Bottom = "47" NavigateUrl = "~/website/page4.aspx" Right = "298" Left = "210"/> </asp:ImageMap> NavigateUrl を同じページにあるDropDwnListによって IF DropDownList.text="" then NavigateUrl = "~/website/menu.aspx?ddl=100" else NavigateUrl = "~/website/menu.aspx?ddl=" & DropDownList.text end if となるように条件によって 指定URLを変更できるようにしたいのですが どのようにしたらできるのでしょうか? ボタンの場合は クリックしたときにイベントができますが ImageMAP1でそれぞれの範囲のNavigateUrlごとに条件を入れることはできるのでしょうか? 教えてください。

  • CSSのcaption-side:・・・

    続けて質問すみません。 CSSのcaption-side:なのですが、 right / left / bottom はテーブルのどこに配置されるのが正しい配置ですか?        TOP   ┏━━━━━━━━━━━┓   ┃              ┃   ┃              ┃ left┃              ┃right   ┃              ┃   ┃              ┃   ┗━━━━━━━━━━━┛        bottom ですか?  left   TOP  right ┏━━━━━━━━━━━┓ ┃              ┃ ┃              ┃ ┃              ┃ ┃              ┃ ┃              ┃ ┗━━━━━━━━━━━┛      bottom ですか?

  • Rectangle(Bitmap)の幅と高さ

     以下、VBの記法で書きます。Windows10,.NETのGDI+を使用しています。  今まであまり気にしていなかったのですが、今回LockBitsとUnLockBitsを使用してBitmapのpixel情報をCopyするコードを書く事になり、急に気になり出しました。  LockBitsを使用する際、Rectangle構造体で読みだすBitmapの範囲を指定します。Rectangleが指定する実際のpixelですが、   (Rectangle.Left + Rectangle.Width - 1)×(Rectangle.Top + Rectangle.Height - 1) の範囲かな?、と思いました。例えば、   Dim Rect as Rectangle = New Rectangle(1, 1, 0, 0) などとやると、Rectは空になるし、(1, 1)一点を表すRectangleなら、   Dim Rect as Rectangle = New Rectangle(1, 1, 1, 1) なので・・・。  BitmapのWidthとHeightについても同様かと思います。実際の動作には余り影響しないのですが、気になったもので・・・。

  • VC++のOnDraw()関数で、ボールを動かす

    下記のように、VC++のOnDraw()関数において、ウィンドウ上でボールを上下に 動かせたいのですが、動きません。VC++のバージョンは9.0です。(Visual Studio 2008) どういうふうに書けば動きますか? ------------------------------------------------------------------------- void CControllGameView::OnDraw(CDC* pDC) { Bitmap2.LoadBitmap(IDB_BITMAP2); // ボール pOldBitmap = MemDC.SelectObject(&Bitmap2); // 転送前のビットマップ領域を退避 GetClientRect(&rect); // ウィンドウのサイズをrectに記憶 pDC->BitBlt((rect.right-42)/2, rect.top+50, 42, 41, &MemDC, 0, 0, SRCCOPY); // ビット単位でビットマップ画像を転送 int z = rect.bottom + 50; // ボールのy座標の初期値 while(z < rect.top){ pDC->MoveTo((rect.right-42)/2, z+=1); } MemDC.SelectObject(pOldBitmap); // 元に戻す ReleaseDC(pDC); }

  • C# イベント登録(RowPostPaint) delegate

    C#でデータグリッドビューにイベントを登録しようとしているのですが 方法が分からず困っています。 どこかのホームページで以下のように dgv.RowPostPaint += delegate { } までは良いのですが、中身を以下のように eオブジェクトを使うとエラーになります。 どうすれば、eが使えるのでしょうか? 根本から分かっていないので、すみませんがそこからよろしくお願いいたします。 DataGridView dgv = new DataGridView(); dgv.RowPostPaint += delegate { // 行ヘッダのセル領域を、行番号を描画する長方形とする // (ただし右端に4ドットのすき間を空ける) Rectangle rect = new Rectangle( e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 4, e.RowBounds.Height); // 上記の長方形内に行番号を縦方向中央&右詰めで描画する // フォントや前景色は行ヘッダの既定値を使用する TextRenderer.DrawText( e.Graphics, (e.RowIndex + 0).ToString(), dgv.RowHeadersDefaultCellStyle.Font, rect, dgv.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right); };