CStatic background
От: Константин Л. Франция  
Дата: 21.04.06 15:42
Оценка:
Есть класс


class CSomeControl: public CWindowImpl<CBaseControl, WTL::CStatic>
{};


Как менять цвет его фона?
Re: CStatic background
От: BuHHunyx Беларусь  
Дата: 21.04.06 16:40
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Есть класс


КЛ>

КЛ>class CSomeControl: public CWindowImpl<CBaseControl, WTL::CStatic>
КЛ>{};

КЛ>


КЛ>Как менять цвет его фона?


WM_CTLCOLORSTATIC
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: CStatic background
От: Константин Л. Франция  
Дата: 24.04.06 08:44
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Здравствуйте, Константин Л., Вы писали:


КЛ>>Есть класс


КЛ>>

КЛ>>class CSomeControl: public CWindowImpl<CBaseControl, WTL::CStatic>
КЛ>>{};

КЛ>>


КЛ>>Как менять цвет его фона?


BHH>WM_CTLCOLORSTATIC


Про WM_CTLCOLORSTATIC в курсе, но это сообщение посылается паренту, а мне надо менять фон в CSomeControl. REFLECT_NOTIFICATIONS делать не хотелось бы
Re[3]: CStatic background
От: BuHHunyx Беларусь  
Дата: 24.04.06 08:56
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, BuHHunyx, Вы писали:


BHH>>Здравствуйте, Константин Л., Вы писали:


[skip]

BHH>>WM_CTLCOLORSTATIC


КЛ>Про WM_CTLCOLORSTATIC в курсе, но это сообщение посылается паренту, а мне надо менять фон в CSomeControl. REFLECT_NOTIFICATIONS делать не хотелось бы


Тогда придется все самому в WM_PAINT'е рисовать
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: CStatic background
От: Константин Л. Франция  
Дата: 24.04.06 12:22
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, BuHHunyx, Вы писали:


BHH>>>Здравствуйте, Константин Л., Вы писали:


BHH>[skip]


BHH>>>WM_CTLCOLORSTATIC


КЛ>>Про WM_CTLCOLORSTATIC в курсе, но это сообщение посылается паренту, а мне надо менять фон в CSomeControl. REFLECT_NOTIFICATIONS делать не хотелось бы


BHH>Тогда придется все самому в WM_PAINT'е рисовать


Сделал с помощью REFLECT_NOTIFICATIONS/MESSAGE_HANDLER(OCM_CTLCOLORSTATIC...
Но появилась другая проблема — закрашивается фон только той части окна, на которой рисуется текст самого статика. Вот код:



LRESULT CBaseControl::OnColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
{
    HWND from = (HWND)lParam;
    HDC hDC = (HDC)wParam;
    if( from == m_errorline.m_hWnd )
    {
        SetBkMode(hDC, TRANSPARENT);
        return (LRESULT) GetSysColorBrush(NULL_BRUSH);
    }    
    if( from == m_hWnd )//own reflected WM_CTLCOLORSTATIC
    {
        ATL::CString errorText;
        m_errorline.GetWindowText(errorText);

        if( !errorText.IsEmpty() )
        {
                 SetBkColor( hDC, RGB(220, 20, 20) );
             return (LRESULT)(HBRUSH)m_BkBrush;
        }        
    }
    return ::DefWindowProc(from, uMsg, wParam, lParam);
}


screenshot:

Re[5]: CStatic background
От: BuHHunyx Беларусь  
Дата: 24.04.06 13:06
Оценка:
Здравствуйте, Константин Л., Вы писали:

[skip]

КЛ>Сделал с помощью REFLECT_NOTIFICATIONS/MESSAGE_HANDLER(OCM_CTLCOLORSTATIC...

КЛ>Но появилась другая проблема — закрашивается фон только той части окна, на которой рисуется текст самого статика. Вот код:

[skip]

Закрашивается бэкграунд статика. Нужно больше — растяни статик в редакторе ресурсов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: CStatic background
От: Константин Л. Франция  
Дата: 24.04.06 13:23
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Здравствуйте, Константин Л., Вы писали:


BHH>[skip]


КЛ>>Сделал с помощью REFLECT_NOTIFICATIONS/MESSAGE_HANDLER(OCM_CTLCOLORSTATIC...

КЛ>>Но появилась другая проблема — закрашивается фон только той части окна, на которой рисуется текст самого статика. Вот код:

BHH>[skip]


BHH>Закрашивается бэкграунд статика. Нужно больше — растяни статик в редакторе ресурсов.

Статик занимает все пространство скриншота, на нем создаются все контролы динамически
Re[7]: CStatic background
От: BuHHunyx Беларусь  
Дата: 24.04.06 14:20
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, BuHHunyx, Вы писали:


BHH>>Здравствуйте, Константин Л., Вы писали:


BHH>>[skip]


КЛ>>>Сделал с помощью REFLECT_NOTIFICATIONS/MESSAGE_HANDLER(OCM_CTLCOLORSTATIC...

КЛ>>>Но появилась другая проблема — закрашивается фон только той части окна, на которой рисуется текст самого статика. Вот код:

BHH>>[skip]


BHH>>Закрашивается бэкграунд статика. Нужно больше — растяни статик в редакторе ресурсов.

КЛ>Статик занимает все пространство скриншота, на нем создаются все контролы динамически

Кодом докажи
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: CStatic background
От: Константин Л. Франция  
Дата: 24.04.06 15:17
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, BuHHunyx, Вы писали:


BHH>>>Здравствуйте, Константин Л., Вы писали:


BHH>>>[skip]


КЛ>>>>Сделал с помощью REFLECT_NOTIFICATIONS/MESSAGE_HANDLER(OCM_CTLCOLORSTATIC...

КЛ>>>>Но появилась другая проблема — закрашивается фон только той части окна, на которой рисуется текст самого статика. Вот код:

BHH>>>[skip]


BHH>>>Закрашивается бэкграунд статика. Нужно больше — растяни статик в редакторе ресурсов.

КЛ>>Статик занимает все пространство скриншота, на нем создаются все контролы динамически

BHH>Кодом докажи


Честн. слово

Кода больно много, а вот вам скриншотик


Через перегрузку WM_PAINT закрашивается нормально, но там надо текст самому рисовать
Re[9]: CStatic background
От: BuHHunyx Беларусь  
Дата: 24.04.06 16:00
Оценка:
Здравствуйте, Константин Л., Вы писали:

[skip]

У тебя походу отрабатывает SetBkColor( hDC, RGB(220, 20, 20) );
m_BkBrush не используется. Как создаешт?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: CStatic background
От: Константин Л. Франция  
Дата: 24.04.06 16:06
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Здравствуйте, Константин Л., Вы писали:


BHH>[skip]


BHH>У тебя походу отрабатывает SetBkColor( hDC, RGB(220, 20, 20) );

BHH>m_BkBrush не используется. Как создаешт?

WTL::CBrush::CreateSolidBrush( COLORREF )
Может это все в WM_ERASEBKGND можно как-то сделать?
Re[11]: CStatic background
От: BuHHunyx Беларусь  
Дата: 24.04.06 16:44
Оценка: 3 (1)
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, BuHHunyx, Вы писали:


BHH>>Здравствуйте, Константин Л., Вы писали:


BHH>>[skip]


BHH>>У тебя походу отрабатывает SetBkColor( hDC, RGB(220, 20, 20) );

BHH>>m_BkBrush не используется. Как создаешт?

КЛ>WTL::CBrush::CreateSolidBrush( COLORREF )

КЛ>Может это все в WM_ERASEBKGND можно как-то сделать?

Не нужно . Лучше свой код причеши.
На какие месаги и в каких контролах вызывается OnColor?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: CStatic background
От: Константин Л. Франция  
Дата: 24.04.06 16:59
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, BuHHunyx, Вы писали:


BHH>>>Здравствуйте, Константин Л., Вы писали:


BHH>>>[skip]


BHH>>>У тебя походу отрабатывает SetBkColor( hDC, RGB(220, 20, 20) );

BHH>>>m_BkBrush не используется. Как создаешт?

КЛ>>WTL::CBrush::CreateSolidBrush( COLORREF )

КЛ>>Может это все в WM_ERASEBKGND можно как-то сделать?

BHH>Не нужно . Лучше свой код причеши.

BHH>На какие месаги и в каких контролах вызывается OnColor?


class CBaseControl: public CWindowImpl<CBaseControl, WTL::CStatic>
{
public:

      BEGIN_MSG_MAP(CBaseControl)
        MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColor)        
        MESSAGE_HANDLER(OCM_CTLCOLORSTATIC, OnColor)//handling own reflected WM_CTLCOLORSTATIC                
    END_MSG_MAP()


    LRESULT OnColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
};

class CGeneratedTaggingPage : public CPropertyPageImpl<CGeneratedTaggingPage>, public CScrollImpl<CGeneratedTaggingPage> 
{
public:

      BEGIN_MSG_MAP(CGeneratedTaggingPage)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInit)
        REFLECT_NOTIFICATIONS()//здесь возвращаем CBaseControl'у его WM_CTLCOLORSTATIC
        CHAIN_MSG_MAP(CPropertyPageImpl<CGeneratedTaggingPage>)
        if(uMsg != WM_PAINT && uMsg != WM_PRINTCLIENT)
        {
            CHAIN_MSG_MAP(CScrollImpl<CGeneratedTaggingPage>)
        }
    END_MSG_MAP()    
};


На CGeneratedTaggingPage мы динамически создаем CBaseControl.

------

Попробовал добавить еще и рисование в WM_ERASEBKGND:


BEGIN_MSG_MAP(CBaseControl)
        MESSAGE_HANDLER(WM_CTLCOLORSTATIC, CBaseControl::OnColor)
        MESSAGE_HANDLER(OCM_CTLCOLORSTATIC, OnColor)//handling own reflected WM_CTLCOLORSTATIC                
        MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
END_MSG_MAP()

      LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        WTL::CRect rcOwn;
            GetClientRect(&rcOwn);
        CDCHandle dc((HDC)wParam);        
        dc.FillRect(&rcOwn, m_BkBrush);
        bHandled = TRUE;
        return 1;
    }


Комбинация REFLECT_NOTIFICATIONS + MESSAGE_HANDLER(OCM_CTLCOLORSTATIC + MESSAGE_HANDLER(WM_ERASEBKGND работает, но нижний статик(с красным текстом на скриншоте) отказывается становиться прозрачным. Вот реализация OnColor для этого случая:

LRESULT OnColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
{
HWND from = (HWND)lParam;
HDC hDC = (HDC)wParam;

::SetBkMode(hDC, TRANSPARENT);
return (LRESULT) GetSysColorBrush(NULL_BRUSH);
}
Re[12]: CStatic background
От: Константин Л. Франция  
Дата: 26.04.06 16:06
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

BHH>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, BuHHunyx, Вы писали:


BHH>>>Здравствуйте, Константин Л., Вы писали:


BHH>>>[skip]


BHH>>>У тебя походу отрабатывает SetBkColor( hDC, RGB(220, 20, 20) );

BHH>>>m_BkBrush не используется. Как создаешт?

КЛ>>WTL::CBrush::CreateSolidBrush( COLORREF )

КЛ>>Может это все в WM_ERASEBKGND можно как-то сделать?

BHH>Не нужно . Лучше свой код причеши.

BHH>На какие месаги и в каких контролах вызывается OnColor?
поставил тебе баллы за терпеливость и внимание к моей проблеме а ты вдруг замолчал
Что у меня не так?
Re[13]: CStatic background
От: BuHHunyx Беларусь  
Дата: 26.04.06 16:39
Оценка: 1 (1)
Здравствуйте, Константин Л., Вы писали:

[skip]

BHH>>Не нужно . Лучше свой код причеши.

BHH>>На какие месаги и в каких контролах вызывается OnColor?
КЛ>поставил тебе баллы за терпеливость и внимание к моей проблеме а ты вдруг замолчал
КЛ>Что у меня не так?

Это у меня те так . Проект засуппортить срочно надо было. Да и рсдн лежал...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[14]: CStatic background
От: Константин Л. Франция  
Дата: 27.04.06 14:03
Оценка:
Здравствуйте, BuHHunyx, Вы писали:

UP
Re[15]: CStatic background
От: c-smile Канада http://terrainformatica.com
Дата: 27.04.06 22:17
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, BuHHunyx, Вы писали:


КЛ>UP


Background рисуется вот этой вот brush:

return (LRESULT)(HBRUSH)m_BkBrush;


Она у тебя какого цвета?
Re[16]: CStatic background
От: Константин Л. Франция  
Дата: 28.04.06 08:47
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, BuHHunyx, Вы писали:


КЛ>>UP


CS>Background рисуется вот этой вот brush:


CS>
CS>return (LRESULT)(HBRUSH)m_BkBrush; 
CS>


CS>Она у тебя какого цвета?


220, 20, 20
Re[17]: CStatic background
От: BuHHunyx Беларусь  
Дата: 28.04.06 10:24
Оценка:
Здравствуйте, Константин Л., Вы писали:

[skip]

Который раз проссматриваю приведенный выше код и не могу найти ничего криминального.
Думаю стоит сделать минимальное приложение с проблемным функционалом и при воспроизведении ошибки выложить линк.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.