Как обрабатывать WM_CTLCOLORBTN?
От: Krit  
Дата: 16.02.08 19:56
Оценка:
Здравствуйте! Eсть задача — изменить цвет текста на кнопке. С помощью обычной обработки WM_CTLCOLOR этого сделать не удается. Советуют WM_CTLCOLORBTN, в частности нашел в поиске на этом форуме. Но я полнейший новичок в MFC, я не могу понять где создать обработчик для WM_CTLCOLORBTN? Для WM_CTLCOLOR он отображается на вкладке Message'ы формы, а WM_CTLCOLORBTN нет... Если не трудно, объясните доступно для новичка, как его создать? Или просто скажите простой способ изменения цвета текста на кнопаре. Спасибо.
Re: Как обрабатывать WM_CTLCOLORBTN?
От: tasiziso  
Дата: 16.02.08 21:02
Оценка:
Здравствуйте, Krit, Вы писали:

K>Здравствуйте! Eсть задача — изменить цвет текста на кнопке. С помощью обычной обработки WM_CTLCOLOR этого сделать не удается. Советуют WM_CTLCOLORBTN, в частности нашел в поиске на этом форуме. Но я полнейший новичок в MFC, я не могу понять где создать обработчик для WM_CTLCOLORBTN? Для WM_CTLCOLOR он отображается на вкладке Message'ы формы, а WM_CTLCOLORBTN нет... Если не трудно, объясните доступно для новичка, как его создать? Или просто скажите простой способ изменения цвета текста на кнопаре. Спасибо.


Ну так в чём проблемма?

Глядишь в класс, находишь макрос, в котором есть WM_CTLCOLOR и связанный с ним метод (событие). Делаешь то же самое для WM_CTLCOLORBTN. Добавляешь новый метод, связанный с WM_CTLCOLORBTN в класс, добавляешь реализацию. Читаешь в MSDN по WM_CTLCOLORBTN. Радуешься.
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re[2]: Как обрабатывать WM_CTLCOLORBTN?
От: Krit  
Дата: 16.02.08 21:16
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

Здравствуйте, tasiziso, Вы писали:

T>Глядишь в класс, находишь макрос, в котором есть WM_CTLCOLOR и связанный с ним метод (событие). Делаешь то же самое для WM_CTLCOLORBTN. Добавляешь новый метод, связанный с WM_CTLCOLORBTN в класс, добавляешь реализацию. Читаешь в MSDN по WM_CTLCOLORBTN. Радуешься.



Да не получается радоваться. Грустно всё это. Для того, чтобы тупо переставить цвет текста на кнопке, надо фиг знает как вертеться. Ужель нельзя было сделать аля сибилдер... проблема в том, что не найти где связывается функция OnCtlColor с WM_CTLCOLOR в программе, чтобы сделать аналогию.
Re[3]: Как обрабатывать WM_CTLCOLORBTN?
От: Carc Россия http://www.amlpages.com/home.php
Дата: 17.02.08 02:33
Оценка:
Нельзя поменять у кнопки цвет через WM_CTLCOLOR
MSDN
"...
By default, the DefWindowProc function selects the default system colors for the button. Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors.
...
"
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re[3]: Как обрабатывать WM_CTLCOLORBTN?
От: Sashaka Россия  
Дата: 17.02.08 10:56
Оценка:
T>>Глядишь в класс, находишь макрос, в котором есть WM_CTLCOLOR и связанный с ним метод (событие). Делаешь то же самое для WM_CTLCOLORBTN. Добавляешь новый метод, связанный с WM_CTLCOLORBTN в класс, добавляешь реализацию. Читаешь в MSDN по WM_CTLCOLORBTN. Радуешься.


K>Да не получается радоваться. Грустно всё это. Для того, чтобы тупо переставить цвет текста на кнопке, надо фиг знает как вертеться. Ужель нельзя было сделать аля сибилдер... проблема в том, что не найти где связывается функция OnCtlColor с WM_CTLCOLOR в программе, чтобы сделать аналогию.


А карта сообщений ты знаешь что такое? Если нет, лучше почитать хоть что то по MFC, перед тем как писать прогу, иначе будешь тормозить с такими вопросами на каждом шаге.

Кстати, то что надо вертеться, есть один плюс — по ходу верчения разбираешься что и как там организовано, и это позволяет потом сделать всякие вещи, которых через визард не сделаешь, ну и т. п.
Re: Как обрабатывать WM_CTLCOLORBTN?
От: Pest  
Дата: 20.02.08 13:26
Оценка:
Здравствуйте, Krit, Вы писали:

K>Здравствуйте! Eсть задача — изменить цвет текста на кнопке. С помощью обычной обработки WM_CTLCOLOR этого сделать не удается. Советуют WM_CTLCOLORBTN, в частности нашел в поиске на этом форуме. Но я полнейший новичок в MFC, я не могу понять где создать обработчик для WM_CTLCOLORBTN? Для WM_CTLCOLOR он отображается на вкладке Message'ы формы, а WM_CTLCOLORBTN нет... Если не трудно, объясните доступно для новичка, как его создать? Или просто скажите простой способ изменения цвета текста на кнопаре. Спасибо.



Приветсвую. в параметрах кнопки ставишь ownerdraw=true.

Далее нужно описать две функции:
void TDialog::OnPaint()
{if (IsIconic())
       {
           CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);//InvalidateRect(&rect1,1);
       }
    else
       CDialog::OnPaint();
}



void TDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
RECT rect; TCHAR buffer[MAX_PATH]; CDC dc;
if(nIDCtl==name)//name название твоей кнопки
   {    

    dc.Attach(lpDrawItemStruct ->hDC);
    rect= lpDrawItemStruct ->rcItem;
//отсюда можешь убрать лишние параметры цвета и оставить только цвет текста
    dc.Draw3dRect(&rect,RGB(153,204,242),RGB(153,204,242));
    dc.FillSolidRect(&rect,RGB(153,204,242));
    dc.SetBkColor(RGB(153,204,242));
    dc.SetTextColor(RGB(0,0,0); //цвет текста
    dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    ZeroMemory(buffer,MAX_PATH );
       ::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
        dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
   }

}


в message map вставляешь
ON_WM_PAINT()
ON_WM_DRAWITEM()


а .h фаил
afx_msg void OnPaint();
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
HICON m_hIcon;

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.