itagagaki
@itagagaki (板垣 史彦)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

MFCでOnNcPaintでの描画が反映されない

WindowsのMFCアプリをメンテしています。
昔は期待通りに動いていた思われるコードが、現在の環境(VS2019/Win10)でビルドして実行すると期待する結果になりません。

class CMyTreeDialog : public CDialog
{
~ 略 ~
};
void CMyTreeDialog::OnNcPaint()
{
	CDialog::OnNcPaint();
	DrawBorder();
}

こうやってダイアログに(CPenクラスで)ボーダー枠線を描画しているのですが、これが反映されません。

試しに

void CMyTreeDialog::OnNcPaint()
{
	//CDialog::OnNcPaint();
	DrawBorder();
}

としたらちゃんと描画できていて反映されます。しかしこれではダイアログのサイズ拡大時等にゴミが残ることになります。

解決方法を教えてください。

0

1Answer

昔は期待通りに動いていた思われる

lm [MSFT] said:
The system will detect that the app is painting its own non-client area when it doesn't pass WM_NCPAINT to DefWindowProc(), or passes it with a different WPARAM. Changing the WS_VISIBLE style of a top level window directly will also trigger it.
It seems that the demo app doesn't do any of this.
You can explicitely disable the glass frame for a given window with DwmSetWindowAttribute(DWMWA_NCRENDERING_POLICY) and DWMNCRP_DISABLED.

この辺とか関係ないですかね。(外してたらすみません)

1Like

Comments

  1. @itagagaki

    Questioner

    なるほど、Vista以降のDWMというものが関係している可能性はありそうですね。調べてみようと思います。ありがとうございます。

  2. @itagagaki

    Questioner

    ビンゴ!です

    m_pTreeDlg = new CMyTreeDialog;
    DWMNCRENDERINGPOLICY policy = DWMNCRP_DISABLED;
    DwmSetWindowAttribute(m_pTreeDlg->m_hWnd, DWMWA_NCRENDERING_POLICY, &policy, sizeof policy);
    

    これで解決しました!ありがとうございました!

Your answer might help someone💌