Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно поменять цвет кисти? все вроде правильно, а глючит! 
:(
    Опции темы
cardinal
Дата 5.4.2003, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Код
CPen newp;
CPen *oldp;
newp.CreatePen(PS_SOLID,1,crColour);
oldp = pDC->SelectObject(&newp);
pDC->Rectangle(2, 2, p.x + p.x - 2, p.y + p.y - 2);
pDC->SelectObject(&oldp);
newp.DeleteObject();


Вот такой вот простой кусочек исходника. Все как в книгах и в MSDN, а вот когда цвет меняешь примерно в сотый раз, то начинаются глюки - все просто рисуется черным цветом. Что не перепробовал - ничего не помогает, только после DestroyWindow() все опять работает и опять раз сто, но не больше. Ошибка просто должна сидеть здесь потому, что если например выкинуть вот это

Код
oldp = pDC->SelectObject(&newp);
pDC->Rectangle(2, 2, p.x + p.x - 2, p.y + p.y - 2);
pDC->SelectObject(&oldp);


то есть не выбирать новую кисть, то все как бы работает как надо.

Подскажите пожалуйста если кто знает, что надо refresh`евать, update`ывать или еще что-нибудь, чтобы избавиться от этого глюка.

Спасибо!



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
DENNN
Дата 5.4.2003, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



А pDC откуда появляется?Приведи всю процедуру. И расскажи в какие моменты ты рисуешь этот четырехугольник.
PM ICQ   Вверх
cardinal
Дата 5.4.2003, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Я сделал свои собственные кнопки. В событии ::DrawItem происходит в начале стандартная обработка структуры lpDrawItemStruct (см. снизу) и вот этот pDC передает в отдельную функцию рисования кнопок.
Код
void LCDButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct != NULL);

CDC* pDC   = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
...


Для простоты я уже ее сократил до минимального и вяглядит она вот так:

Код
void LCDButton::DrawButton(CDC* pDC, CPoint p, COLORREF crColour, BOOL param)
{
newp.CreatePen(PS_SOLID,1,crColour);
oldp = pDC->SelectObject(&newp);
pDC->Rectangle(2, 2, p.x + p.x - 2, p.y + p.y - 2);
pDC->SelectObject(&oldp);
newp.DeleteObject();
}


Четвертый параметр пока не используется. сrColour зависит от того как мы обработаем всякие параметры в DrawItem.

На форме, на которой сидит кнопка происходит след.:

Код
void LCDDialog::OnMouseMove(UINT nFlags, CPoint point)
{
int x;
if (Menu.m_bActive)
{
 Menu.m_bActive = false;
 Menu.RedrawWindow();
 //Menu.InvalidateRect(CRect(0,0,100,28), false);
}
CDialog::OnMouseMove(nFlags, point);
}


Если m_bActive == true, то значит мы были на кнопке Menu - мы перестанавливаем true на false и перерисовывем окно (кнопку). Если мы делаем так Menu.InvalidateRect(CRect(0,0,100,28), false); то результат тот же, что с true, что с false.

Как бы все перепробовал, а если кнопка потеряет и поймает фокус несколько десятков раз, то все начинает глючить и рисоваться исключительно черным цветом.




--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 6.4.2003, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Вообщем ошибка была тут:

Код
void LCDButton::DrawButton(CDC* pDC, CPoint p, COLORREF crColour, BOOL param)
{
newp.CreatePen(PS_SOLID,1,crColour);
oldp = pDC->SelectObject(&newp);
pDC->Rectangle(2, 2, p.x + p.x - 2, p.y + p.y - 2);
pDC->SelectObject(&oldp);
newp.DeleteObject();
}


Вот правильный вариант:

Код
void LCDButton::DrawButton(CDC* pDC, CPoint p, COLORREF crColour, BOOL param)
{
newp.CreatePen(PS_SOLID,1,crColour);
oldp = pDC->SelectObject(&newp);
pDC->Rectangle(2, 2, p.x + p.x - 2, p.y + p.y - 2);
pDC->SelectObject(oldp);
newp.DeleteObject();
}


Все дело было в одном крючке "&". Вот так вот ошибся, а сегодня с утра доперло.

Всем спасибо!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
DENNN
Дата 6.4.2003, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Незачто smile.gif
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.