Обработка WM_PAINT в подклассе CStatic Control - PullRequest
0 голосов
/ 25 августа 2011

Я создал пользовательский элемент управления, класс которого имеет CStatic в качестве базового класса. В настоящее время я обрабатываю рисунок, используя событие WM_PAINT. Но есть странное поведение. Когда я снова включаю окно после его отключения с помощью функции CWnd::EnableWindow, оно отказывается рисовать то, что я написал в функции OnPaint. Вместо этого он рисует статический элемент управления.

Я согласен, что существует этот стандартный метод переопределения DrawItem и использования стиля SS_OWNERDRAW. Но что не так с WM_PAINT?

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

Ответы [ 2 ]

5 голосов
/ 25 августа 2011

Вот именно то, что я написал:

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 - статический контроль над ресурсом для этого диалога.Я написал два обработчика кнопок:

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

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

И это работает без нареканий!Удалите Invalidate вызов, и он потерпит неудачу.

1 голос
/ 05 декабря 2012

Попробуйте отключить Aero.У меня похожая проблема, когда я рисую статический элемент управления, и когда он переходит из отключенного состояния во включенное, сообщение WM_PAINT никогда не принимается, но если я выключаю Aero, оно работает нормально.

...