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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Фон Property sheet (продолжение темы winapi Property sheet)  (Прочитано 15358 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kultura
Помогающий

ru
Offline Offline

« : 28-03-2010 17:14 » 

Здравствуйте, в продолжение старой темы
https://forum.shelek.ru/index.php/topic,22836.0.html

Выяснилось неприятное обстоятельство в полученном решении. При перемещении скролла фон окошка меняет свой цвет. см. картинку. Это можно устранить заливкой или выводом фоновой картинки, но при наличии контролов в диалоге простая заливка не проходит, а фоновая картинка не влияет на фон контролов, который продолжает менять цвет при движении скролла вниз - вверх. В чем тут причина, и как это можно устранить?
Программка прилагается. Для проверки фона контролов хорошо подходят обычные текстовые контролы диалога.


* ColorError.jpg (34.12 Кб - загружено 710 раз.)
* PropertySheets.7z (11.71 Кб - загружено 622 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #1 : 29-03-2010 03:39 » 

запустил, никаких косяков не вижу.

насчёт скрина- если ты сам перекрашиваешь фон, корректно опиши обработчики сообщений
#define WM_CTLCOLORMSGBOX               0x0132
#define WM_CTLCOLOREDIT                 0x0133
#define WM_CTLCOLORLISTBOX              0x0134
#define WM_CTLCOLORBTN                  0x0135
#define WM_CTLCOLORDLG                  0x0136
#define WM_CTLCOLORSCROLLBAR            0x0137
#define WM_CTLCOLORSTATIC               0x0138

а для текстовых контролов можно возвращать

вот из мсдн пример для MFC, но всё аналогично)
Код:
// This OnCtlColor handler will change the color of a static control
// with the ID of IDC_MYSTATIC. The code assumes that the CMyDialog
// class has an initialized and created CBrush member named m_brush.
// The control will be painted with red text and a background
// color of m_brush.

HBRUSH CZilchDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   // Call the base class implementation first! Otherwise, it may
   // undo what we're trying to accomplish here.
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

   // Are we painting the IDC_MYSTATIC control? We can use
   // CWnd::GetDlgCtrlID() to perform the most efficient test.
   if (pWnd->GetDlgCtrlID() == IDC_MYSTATIC)
   {
      // Set the text color to red
      pDC->SetTextColor(RGB(255, 0, 0));

      // Set the background mode for text to transparent
      // so background will show thru.
      pDC->SetBkMode(TRANSPARENT);

      // Return handle to our CBrush object
      hbr = m_brush;
   }

   return hbr;
}

Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #2 : 29-03-2010 17:37 » 

Да нет, WM_CTLCOLORXXX не обрабатываю. Все по умолчанию. Но когда речь идет о простом диалоге, все впорядке, фон стабильный, а когда те же диалоги в встроены в property sheet, фон начинает плясать.
Эффекты видно, если покрутить скролл вниз-вверх. Когда идет вниз, фон немного темнее, а когда вверх - светлее, полосу видно на стыке.
Мне впринципе не не нужно закрашивать фон или рисовать фоновую картинку, достаточно стабильной закраски по умолчанию, но в данном случае "по умолчанию" не работает. В этом и загвоздка  Здесь была моя ладья...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 29-03-2010 17:59 » 

Код:
				ScrollWindow (hPage, 0, yChar * (yPos - si.nPos), NULL, NULL);
UpdateWindow (hPage);

сделай так
Код:
ScrollWindow (hPage, 0, yChar * (yPos - si.nPos), NULL, NULL);
InvalidateRect(hPage,<прямоугольник вкладки в абсолютных координатах>,1);
UpdateWindow (hPage);


прямоугольник получить можно через GetWindowRect
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #4 : 30-03-2010 16:42 » 

Алексей1153++ , спасибо, стало лучше, полоса на стыке ушла. Но цвет все равно неоднородный. Теперь он меняется плавно с левого верхнего угла к правому нижнему!
Скрин приложил

* ColorError2.jpg (34.84 Кб - загружено 680 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 31-03-2010 03:35 » 

Kultura, приложи не жпг, а BMP, только сожми архиватором. Подозреваю, что у тебя там вообще градиент )) А откуда - вопрос
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #6 : 31-03-2010 03:37 » 

так и есть - на убавленной яркости видно

(бмп прикладывать уже не нужно)

* grad1.JPG (29.4 Кб - загружено 669 раз.)
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #7 : 31-03-2010 13:59 » 

Offtopic:
Ребята, GUI-скрины жмите в PNG: без потерь и жмет отлично. JPEG - это только для фоток! BMP - это не для сети.
Поставлю в угол.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kultura
Помогающий

ru
Offline Offline

« Ответ #8 : 31-03-2010 17:07 » 

Завтра с работы скрин сделаю, там спецэффекты видно лучше

Алексей1153++, а ты у себя на машине пример не запускал, то же самое?
« Последнее редактирование: 31-03-2010 17:10 от Kultura » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #9 : 31-03-2010 17:15 » 

Kultura, я запускал - у меня просто обычный серый фон , ничего не мажется.

запустил, никаких косяков не вижу.

Да ты просто яркость убавь - увидишь ) А я и так вижу
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #10 : 01-04-2010 17:23 » 

Вот скрин с работы (см. приложение). На рабочем компе фон текстовых контролов и область справа были светло - серого цвета. Пространство между контролами до правой полосы занимает фоновая белая картинка, полоса появляется, где она заканчивается.

Тут явно что-то с перерисовкой. Стандартная заливка фоном по-умолчанию почему-то не работает.  Здесь была моя ладья...

* Untitled.png (40.48 Кб - загружено 698 раз.)
« Последнее редактирование: 01-04-2010 17:26 от Kultura » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #11 : 01-04-2010 17:27 » 

Kultura,  глянь пост#1 - там ответ

Цитата
  if (pWnd->GetDlgCtrlID() == IDC_MYSTATIC)
   {
...
      // Set the background mode for text to transparent
      // so background will show thru.
      pDC->SetBkMode(TRANSPARENT);
...
}
только переделать на АПИ, что несложно
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #12 : 01-04-2010 17:40 » 

Так эти контролы и создавались со стилем WS_EX_TRANSPARENT.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #13 : 01-04-2010 18:07 » 

а по какому они ключу прозрачны то ? Улыбаюсь Я вот так даже и не соображу...

ты же не вызывал
BOOL SetLayeredWindowAttributes(
    HWND hwnd,
    COLORREF crKey,
    BYTE bAlpha,
    DWORD dwFlags
);

В общем, убирай этот стиль ИМХО и пробуй SetBkMode(TRANSPARENT);
« Последнее редактирование: 01-04-2010 18:12 от Алексей1153++ » Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #14 : 01-04-2010 18:19 » 

А там вообще в ключах дело. Как этот механизм WS_EX_TRANSPARENT устроен и функционирует?

Попробую SetBkMode()
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #15 : 01-04-2010 18:27 » 

стиль WS_EX_TRANSPARENT указывает, что окно может менять прозрачность

Цитата
BOOL SetLayeredWindowAttributes(
    HWND hwnd,
    COLORREF crKey,
    BYTE bAlpha,
    DWORD dwFlags
);

hwnd
[in] Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created.

crKey
[in] Pointer to a COLORREF value that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro.

bAlpha
[in] Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque.

dwFlags
[in] Specifies an action to take. This parameter can be one or more of the following values.
LWA_COLORKEY
Use crKey as the transparency color.
LWA_ALPHA
Use bAlpha to determine the opacity of the layered window..


параметр dwFlags позволяет указать, что будет использоваться (можно по отдельности, можно вместе):
1) если есть флаг LWA_COLORKEY, используется ключ (RGB цвет) - все пикселы этого цвета, отрисованные на окне, будут всегда полностью прозрачны
2) если есть флаг LWA_ALPHA, используется ключ значение bAlpha - 0 означае полностью прозрачное окно, 255 - полностью непрозрачное. Промежуточные значения - плавное значение прозрачности


1- лично не проверял, но в теории так )),  2-лично проверял
Записан

Kultura
Помогающий

ru
Offline Offline

« Ответ #16 : 06-04-2010 14:58 » 

Алексей1153++ , спасибо за помощь, проблема решена.

Действительно, не хватало обработки сообщений WM_CTLCOLORXXX. Оказалось достаточно самого простого:

Код:
case WM_CTLCOLORXXX:
{
return (LRESULT) GetStockObject (WHITE_BRUSH);
}

Хотя и не совсем понятно, почему обычные диалоги этого не требуют, в отличии от вкладок property sheet
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #17 : 06-04-2010 15:31 » 

в обычных диалогах есть обработчики по умолчанию - там всё это делается в соответствии с выбранным стилем оформления Windows. Что касается property sh(ee/i)ts , не люблю их, не разбирался с ними, не использую Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines