Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с OnCtlColor  (Прочитано 21983 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Lotor
Гость
« : 14-02-2008 09:34 » 

Люди, выручайте! Охота рисовать текст на кнопке нестандартным цветом. Почему 2005 студия ругается на этот код? При чем вроде неделю назад такая конструкция работала...

Код:
HBRUSH CTextFontsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(pWnd->GetDlgCtrlID()==IDC_BUTTON1)
{

}

return hbr;
}

Пишет    "D:\Microsoft Visual Studio 8\VC\atlmfc\include\afxwin.h(2852) : see declaration of 'CDialog'"
« Последнее редактирование: 14-02-2008 17:05 от Lotor » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-02-2008 09:46 » 

Точно полный текст ошибки приведён? Такое ощущение, что он был минимум из 2х строк - в первой должен быть код ошибки.
Записан
Lotor
Гость
« Ответ #2 : 14-02-2008 10:06 » 

Да, забыл строку "d:\work\k1807\interface\testt\testtdlg.cpp(179) : error C2039: 'OnCtlColor' : is not a member of 'CDialog'"
Может я своими кривыми руками удалил что полезное? Но в каждом новом проекте появляется эта ошибка...
« Последнее редактирование: 14-02-2008 10:09 от Lotor » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 14-02-2008 11:27 » 

А почему у тебю эта ф-я CMy111View, если ты в диалоге делаешь?

приведи бльше кода или проект выложи (только код), если небольшой
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lotor
Гость
« Ответ #4 : 14-02-2008 17:04 » 

Цитата
А почему у тебю эта ф-я CMy111View, если ты в диалоге делаешь?
Cчитайте что это диалоговое приложение - не суть. На работе любое новое приложение при обработки OnCtlColor выдает ошибку. Принес домой - выдает ошибку только данное приложение, новые же на OnCtlColor не ругаются. Даже не знаю, как быть. Наверное, что-то своими руками потер в свое время, а теперь как разгребать ума не приложу...
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 14-02-2008 17:08 » 

Lotor, от какого именно класса наследуется CMy111View (или CTextFontsDlg?)?
Что касается "потереть", то можно проверить: в редакторе правый клик по функции, goto declaration,  goto definition. У класса CWnd должен быть соответствующий метод объявлен и определён. Хотя сомневаюсь, что тут это - скорее, с наследованием что-то перемудрено, иначе ошибка не 1 раз вылезала бы, полагаю...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 14-02-2008 19:10 » 

Lotor, посмотри тогда внимательно в .h в классе должна быть объявлена ф-я OnCtlColor. Ошибка компилятора означает, что есть определение функции - члена класса, но в классе она не задекларирована.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 15-02-2008 04:47 » 

Lotor, показывай, как определена функция OnCtlColor в заголовке и так же визардовский макрос из cpp
Записан

Lotor
Гость
« Ответ #8 : 15-02-2008 16:10 » 

Lotor, от какого именно класса наследуется CMy111View (или CTextFontsDlg?)?
От CDialog. Это созданное мастером...
в общем хрень какая-то, сегодня попробывал дома еще раз скомпилировать - не ругалось на это приложение. Значит проще всего на работе переустановить студию. Но ведь точно и дома выдавала ошибку вчера...
Записан
Lotor
Гость
« Ответ #9 : 15-02-2008 16:25 » 

Ох, Вы меня простите, но новая проблема - не хочет перекрашиваться текст кнопки, а очень надо! У других элементов - ок, а кнопка ни в какую...
Код:
  HBRUSH CK1807Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO:  Change any attributes of the DC here
if(pWnd->GetDlgCtrlID()==IDC_BUTTON1)
{
pDC->SetTextColor(RGB(0, 255, 0));
}

// TODO:  Return a different brush if the default is not desired
return hbr;
}
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 15-02-2008 16:49 » 

Вобще-то, Lotor, это всё довольно-таки простецкая теория. Проще говоря она не может не работать. Те либо у тебя совсем студия не работает (тогда тут сложно помочь), либо где-то простецкие косяки, но ты не показываешь их нам. Поэтому трудно что-либо посоветовать...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lotor
Гость
« Ответ #11 : 15-02-2008 17:02 » 

Джон, да нет же! я тут на форуме даже нашел счас тему https://forum.shelek.ru/index.php/topic,6469.0.html, где вы советуете для этого поставить Owner Draw - true, но у меня тогда совсем кнопка пропадает. Всё-таки MFC для трудолюбивых людей, другое дело в борланде набросал на форму компонент, поустанавливал свойства и не мучайся.. =) Если не трудно, поможите) Эх, не по собственной воле на MFC, а сроки давят...
Записан
АлексейК
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 15-02-2008 19:17 » 


Вам надо создать свой класс кнопки производный от CButton, создать саму кнопку и переопределить его метод DrawItem. В этом методе берется текст кнопки (GetWindowText) и рисуется методом DrawText. Пример из MSDN (тема CButton::DrawItem):

lpDrawItemStruct
A long pointer to a DRAWITEMSTRUCT structure. The structure contains information about the item to be drawn and the type of drawing required.
Remarks
An owner-drawn button has the BS_OWNERDRAW style set. Override this member function to implement drawing for an owner-drawn CButton object. The application should restore all graphics device interface (GDI) objects selected for the display context supplied in lpDrawItemStruct before the member function terminates.

Also see the BS_ style values.

Example
// NOTE: CMyButton is a class derived from CButton. The CMyButton
// object was created as follows:
//
// CMyButton myButton;
// myButton.Create(_T("My button"),
//      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW,
//      CRect(10,10,100,30), pParentWnd, 1);
//

// This example implements the DrawItem method for a CButton-derived
// class that draws the button's text using the color red.
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
   UINT uStyle = DFCS_BUTTONPUSH;

   // This code only works with buttons.
   ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

   // If drawing selected, add the pushed style to DrawFrameControl.
   if (lpDrawItemStruct->itemState & ODS_SELECTED)
      uStyle |= DFCS_PUSHED;

   // Draw the button frame.
   ::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,
      DFC_BUTTON, uStyle);

   // Get the button's text.
   CString strText;
   GetWindowText(strText);

   // Draw the button text using the text color red.
   COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));
   ::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
      &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
   ::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 16-02-2008 12:01 » 

Lotor, пришли проект, я попробую глянуть. Только удали папки Release и Debug , и зажми проект а архив.( Почта написана под аватаркой, если что )

а ещё сначала попробуй такой финт ушами: удали процедуру OnCtlColor при помощи визарда, а потом при помощи него же добавь взад
Записан

Lotor
Гость
« Ответ #14 : 16-02-2008 15:57 » 

АлексейК,  А не подскажите как определить pParentWnd в этом куске?..
// myButton.Create(_T("My button"),
//      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW,
//      CRect(10,10,100,30), pParentWnd, 1);

Алексей1153++, в общем проблема с  OnCtlColor разрешилась. Надо переставлять студио на работе. Дело в том, что принесенный с работы проект выдавал ошибку только если жать Build, по  Rebuild же всё встало на свои места. Другое дело, что пляски во круг OnCtlColor затевались ради того, чтобы поменять цвет текста, а этого не выходит. Могу поменять цвет любых элементов кроме кнопки. Мдя.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 16-02-2008 18:42 » 

Lotor, да, на кнопке так не поменяешь цвет.

а тут
Цитата
А не подскажите как определить pParentWnd в этом куске?..
это указатель на родительское окно для кнопки (если делается прямо в диалоге, укажи this)
Записан

Lotor
Гость
« Ответ #16 : 18-02-2008 07:22 » 

это указатель на родительское окно для кнопки (если делается прямо в диалоге, укажи this)
Ох, что-то не получается разукрашивать текст на кнопке, может кто поделиться исходником?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 18-02-2008 08:53 » 

Lotor, создай класс CMyButton, производжный от CButton, в нём всего лишь нужно переписать виртуальную оконную процедуру:
Код:
LRESULT CMyButton::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
switch(message)
{
case WM_PAINT:
{
CPaintDC dc(this);

CRect rect;
CString txt;

GetClientRect(&rect);

//рамка
int w=2;//толщина рамки

COLORREF topleftColor;
COLORREF botrigColor;
if(m_bLButtonDown)
{
topleftColor=RGB(0,0,0);
botrigColor=RGB(255,255,255);
}
else
{
topleftColor=RGB(255,255,255);
botrigColor=RGB(0,0,0);
}

dc.FillSolidRect(0,0,rect.Width(),w,topleftColor);//верх
dc.FillSolidRect(0,rect.Height()-1-w+1,rect.Width(),w,botrigColor);//низ
dc.FillSolidRect(0,0,w,rect.Height(),topleftColor);//лево
dc.FillSolidRect(rect.Width()-1-w+1,0,w,rect.Height(),botrigColor);//право

//прямоугольник с текстом
CRect textrect=rect;
textrect.left+=w;
textrect.top+=w;
textrect.right-=w;
textrect.bottom-=w;

//фон
dc.FillSolidRect(&textrect,::GetSysColor(COLOR_3DFACE));
//dc.FillSolidRect(RGB(0,255,100));//или свой цвет

//имитация утопленности
int shiftX=2;//смещение при нажатии
int shiftY=2;
if(m_bLButtonDown)
{
textrect.left+=shiftX;
textrect.top+=shiftY;
}

GetWindowText(txt);



dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(0,200,0));
dc.DrawText(txt,&textrect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//dc.DrawText(txt,&textrect,DT_CENTER); //если многострочный текст
return 1;
}
break;

//мышь - забиваем эти сообщения
case WM_MOUSEMOVE:
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
case WM_MOUSEWHEEL:
{
return 1;
}
break;

//мышь - нажатие левой кнопки
case WM_LBUTTONDOWN:
{
SetCapture();
m_bLButtonDown=true;
Invalidate(0);
UpdateWindow();
return 1;
}
break;

//мышь - отпускание левой кнопки
case WM_LBUTTONUP:
{
ReleaseCapture();
m_bLButtonDown=false;
Invalidate(0);
UpdateWindow();
return 1;
}
break;

}
return CButton::WindowProc(message, wParam, lParam);
}


сделано на скорую руку (зато протестированно Внимание! Говорит и показывает... ), поэтому возможно, ещё какие то сообщения придётся переделывать. Но на первый взгляд - всё работает
« Последнее редактирование: 18-02-2008 17:37 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 18-02-2008 11:58 » 

Lotor, "Я на вас удивляюсь" (с)

Ну ты ведь уже сам всё нашёл на форуме. Ага Я как раз собирался брюзжать по поводу, что это уже когда-то было. Там ведь всё описано и проблема и невозможность ТАКОГО решения и даже ссылка на проект, в котором кнопки разукрашиываются. Так в чём проблема?

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lotor
Гость
« Ответ #19 : 18-02-2008 17:23 » 

Алексей1153++, спасибо, заработало)

Джон, то что я находил не помогало. Всё равно удивительно, как такая простая по сути, задача реализуется в MFC. Ужель нельзя было в мастера забить... Ну да ладно, разобрался)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 18-02-2008 17:34 » 

Lotor, я уже косяк нашёл - если фокус на кнопке, то нажатие на клаву (пробел вернее) рисует родительскую кнопку, видимо надо нажатие кнопок тоже обработать
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #21 : 19-02-2008 10:22 » 

Lotor, вся беда в том, что многие приписывают MFC парадоксальные способности и возможности. Они считают эту библиотеку чем-то отделённым от системы и поэтому требуют от неё того, что она не в состоянии сделать. На самом деле это просто удобная ООП упаковка для API. Те чего не могут стандартные контролы винды, того не может и MFC. Для всех остальных требований - собственные контролы. Их создать легко и просто.
Либо на базе существующих, либо полностью свои на базе объекта CWnd. Вот и всё.

зы а чем тебе это не подошло?
http://www.codeguru.com/Cpp/controls/buttonctrl/article.php/c5169/
« Последнее редактирование: 19-02-2008 10:24 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lotor
Гость
« Ответ #22 : 24-02-2008 09:58 » new

зы а чем тебе это не подошло?
http://www.codeguru.com/Cpp/controls/buttonctrl/article.php/c5169/
Видимо не разглядел потенциал, а ведь то что нужно)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines