Обработка WM_PAINT в подклассе CStatic Control

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

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

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

person Ragesh Chakkadath    schedule 25.08.2011    source источник
comment
CStatic - это родительский контроль или базовый класс?   -  person Ajay    schedule 25.08.2011
comment
Вы пытались вызвать Invalidate после EnableWindow? Поместите точку останова в OnPaint, если он действительно получает сообщение или нет.   -  person Ajay    schedule 25.08.2011
comment
Очевидно нет! OnPaint в этом случае не получает вызова. Кроме того, в чем необходимость Invalidate, когда при этом конкретном вызове элемент управления, который нарисован идеально, превращается в обычный статический элемент управления? так что розыгрыш происходит там, но не через мой OnPaint в этом случае.   -  person Ragesh Chakkadath    schedule 25.08.2011


Ответы (2)


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

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 вызов, и он потерпит неудачу.

person Ajay    schedule 25.08.2011
comment
Удалите недействительный вызов, и он не удастся. исключение? или это похоже на то, что ничья не происходит? Я понял, что рисуется не статический элемент управления (у него не было текста), но рисования не было. Так что Invalidate может быть здесь решением. дай мне проверить! - person Ragesh Chakkadath; 25.08.2011
comment
Без исключения. Он будет отображаться с использованием рисования Windows по умолчанию. Вызовите Invalidate, и он будет использовать ваш OnPaint. - person Ajay; 25.08.2011

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

person Kevin Eshbach    schedule 05.12.2012