1

CStaticクラスが基本クラスであるカスタムコントロールを作成しました。現在、WM_PAINTイベントを使用して描画を処理しています。しかし、奇妙な振る舞いがあります。関数を使用してウィンドウを無効にした後でウィンドウを再度有効にすると、CWnd::EnableWindow関数で記述したものを描画できなくなりOnPaintます。代わりに静的コントロールを描画します。

スタイルをオーバーライドDrawItemして使用するこの標準的な方法があることに同意します。SS_OWNERDRAWしかし、何が問題になっていWM_PAINTますか?

void XXControl::OnPaint()
{
    CPaintDC PaintDC( this );
    // ** draw the control to PaintDC**
}
4

2 に答える 2

6

これがまさに私が書いたものです:

class CMyStatic : public CStatic
{
    DECLARE_MESSAGE_MAP()
public:
    void OnPaint(void);
};

BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
    ON_WM_PAINT()
END_MESSAGE_MAP()

void CMyStatic::OnPaint(void)
{
    CPaintDC dc(this);
    CRect rect;
    GetClientRect(&rect);

    dc.FillSolidRect(&rect, RGB(120,255,0));
}

そしてサブクラス化:

class CMyDlg : public CDialog
{
// Construction
    CMyStatic my_static;
...
};


BOOL CCMyDlg::OnInitDialog()
{
   CDialog::OnInitDialog();

   my_static.SubclassDlgItem(IDC_DRAW, this);

   return true;
}

IDC_DRAWこのダイアログのリソースに対する静的制御はどこにありますか。2 つのボタン ハンドラを作成しました。

void CMyDlg::OnBnClickedOk()
{
    my_static.EnableWindow(FALSE);
    my_static.Invalidate();
}

void CMyDlg::OnBnClickedOk2()
{
    my_static.EnableWindow();
    my_static.Invalidate();
}

そして、それは完璧に動作します!呼び出しを削除するInvalidateと、失敗します。

于 2011-08-25T14:55:11.867 に答える
1

Aero をオフにしてみてください。静的コントロールを描画していて、無効から有効にすると WM_PAINT メッセージが受信されないという同様の問題がありますが、Aero をオフにすると正常に動作します。

于 2012-12-05T16:37:36.533 に答える