1

SetWindowRgn() を使用して形状を roundrect に変更したモードレス ダイアログがあります。FrameRgn を使用して、その周りに色付きの境界線を描画したいと思います。これが私が使用しているコードです

BOOL CMyDlg::OnInitDialog() 
 {
 CDialog::OnInitDialog(); m_Brush.CreateSolidBrush(RGB(255,255,255));
 CRect rcDialog;
 GetClientRect(rcDialog);

 // This Creates area assigned to Dialog: This goes directly below the above in OnInitDialog
 m_rgnShape.CreateRoundRectRgn(rcDialog.TopLeft().x, rcDialog.TopLeft().y,rcDialog.BottomRight().x,rcDialog.BottomRight().y, rcDialog.Width()/8, rcDialog.Height()/8);
::SetWindowRgn(GetSafeHwnd(), (HRGN)m_rgnShape, TRUE);

return TRUE; // return TRUE unless you set the focus to a control
  // EXCEPTION: OCX Property Pages should return FALSE

}

void CMyDlg::OnPaint() 
{
 CPaintDC dc(this); // device context for painting

 CBrush brush;
 brush.CreateSolidBrush(RGB(255,0,0));

  dc.FrameRgn(&m_rgnShape, &brush, 2, 2);
}

FrameRgn が機能しない理由を誰かが説明できますか。それを機能させるサンプル コードをここに提供してください。

4

1 に答える 1

1

ドキュメントに示されているようにCWnd::SetWindowRgn

SetWindowRgn の呼び出しが成功すると、オペレーティング システムは、領域ハンドル hRgn によって指定された領域を所有します。オペレーティング システムは領域のコピーを作成しないため、この領域ハンドルを使用してそれ以上関数を呼び出したり、この領域ハンドルを閉じたりしないでください。

これが基本的に意味することは、その領域を別の目的に使用することはできず、その領域を「失う」こともできないということです。これはメンバー変数であるため、この最後の問題は心配する必要はありません。ただし、「使用しないでください」の部分に関しては、FrameRgn(...)呼び出しがゼロを返した可能性が高く、描画しようとしたときに失敗したことを示していることに気付くでしょう。

できることは、CRgnオブジェクトから領域ハンドルを切り離し、それを使用してウィンドウ領域を設定することです。その後、以前と同じように新しい領域を再作成できます。

m_rgnShape.CreateRoundRectRgn(...);
HGDIOBJ hRgn = m_rgnShape.Detach();
::SetWindowRgn(GetSafeHwnd(), (HRGN)hRgn, TRUE);
m_rgnShape.CreateRoundRectRgn(...);

より良い説明については、猫のように見せるための ウィンドウ領域の設定について説明しているこの記事を参照してください。


編集:あなたのコメントは、現在、フレーム領域が効果的にオフセットされていることを述べています。量は、ウィンドウの境界のサイズである可能性があります。

を呼び出すとGetClientRect、ウィンドウのクライアント領域のサイズが返されます。これは、簡単に描画できる部分であり、メソッドで行うときにデバイス コンテキストによって「記述」される部分CPaintDC dc(this);ですOnPaint()

オフセットの理由は、ウィンドウに通常描画しない境界線があるためです (いくつかの方法がありますが、ここでは無視します)。したがって、デバイス コンテキストは、ウィンドウからオフセットされた領域を表します。

あなたの場合、これに対する最も簡単な解決策は、ダイアログテンプレートを変更して境界線を指定しないことです。もちろん、これによりウィンドウのサイズ変更が制限されますが、すでに領域を設定しているため、サイズ変更もオプションではないと想定しています。

于 2013-04-30T16:05:13.340 に答える