Как поменять цвет?
От: Paul111  
Дата: 16.11.03 14:10
Оценка:
Не получается поменять цвет в Title.Использую GetWindowDC.А что делать с полученным контекстом?
Re: Как поменять цвет?
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 16.11.03 14:12
Оценка:
Здравствуйте, Paul111, Вы писали:

P> Не получается поменять цвет в Title.Использую GetWindowDC.А что делать с полученным контекстом?


Думаю, Вам стоит посмотреть в сторону WM_NCPAINT.
<< RSDN@Home 1.1.0 stable >>
- Искренне ваш, Поросенок Пафнутий
Re[2]: Как поменять цвет?
От: Paul111  
Дата: 16.11.03 14:16
Оценка:
В сторону WM_NCPAINT я смотрел.Но не знаю как обработать это сообщение.Я начинающий.
Re[3]: Как поменять цвет?
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 16.11.03 20:56
Оценка:
Здравствуйте, Paul111, Вы писали:

P>В сторону WM_NCPAINT я смотрел.Но не знаю как обработать это сообщение.Я начинающий.


Гх-м-м... а чем плох пример из MSDN:

An application can intercept the WM_NCPAINT message and paint its own custom window frame. The clipping region for a window is always rectangular, even if the shape of the frame is altered.

The wParam value can be passed to GetDCEx as in the following example.

case WM_NCPAINT:
{
    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    // Paint into this DC
    ReleaseDC(hwnd, hdc);
}
<< RSDN@Home 1.1.0 stable >>
- Искренне ваш, Поросенок Пафнутий
Re[4]: Как поменять цвет?
От: Antech  
Дата: 10.01.06 12:47
Оценка:
SDB>
SDB>case WM_NCPAINT:
SDB>{
SDB>    HDC hdc;
SDB>    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
SDB>    // Paint into this DC
SDB>    ReleaseDC(hwnd, hdc);
SDB>}
SDB>


Пробовал. На листбоксе у меня не работает. hDc всегда ноль, независимо от значения wParam. GetLastError() возвращает ноль.

GetWindowDc() + FillRect() работает нормально только в случае, если wParam==1, т. е. нужно перерисовывать весь frame. Иначе затирается клиентская часть окна (листбокса), т. к. Винда не предполагает в данном случае перерисовку всего окна.
Я также пробовал использовать GetWindowDc() + FillRgn(hDc,wParam,hBrush) для случаев wParam!=1, результат все тот же: hDc — валидный (FillRect() на нем работает), hBrush — валидный (та же причина), wParam подвергать сомнению нет смысла — его дает Винда. При этом FillRgn() возвращает true, GetLastError() — ноль.

Вот пример кода:
case (WM_NCPAINT)
 hNcDc=GetWindowDc(hWnd)
 hNcBrush=CreateSolidBrush(#00B00000)
 ncRect.right=1000
 ncRect.bottom=1000
 if (wParam.ne.1) then
  call FillRgn(hNcDc,wParam,hNcBrush)
 else
  call FillRect(hNcDc,ncRect,hNcBrush)
 end if
 call ReleaseDc(hWnd,hNcDc)
 call DeleteObject(hNcBrush)
 TableInListProc=0
 return

В данном примере при полной перерисовке (wParam==1) все ОК, при частичной (wParam!=1) фрэйм не рисуется (hNcDc, hNcBrush — валидны, пояснения даны выше).

WTF?
Re[5]: Как поменять цвет?
От: Sergey_BG Россия  
Дата: 10.01.06 12:51
Оценка:
Здравствуйте, Antech, Вы писали:

A>Пробовал. На листбоксе у меня не работает. hDc всегда ноль, независимо от значения wParam. GetLastError() возвращает ноль.


The WM_NCPAINT message is sent to a window when its frame must be painted.

Листбокс помоему не окошко с фреймом. Или я не прав?
Сергей
Re[6]: Как поменять цвет?
От: Antech  
Дата: 10.01.06 13:11
Оценка:
S_B>Листбокс помоему не окошко с фреймом. Или я не прав?

Листбокс — это окно, как и любой другой контрол. У него есть стиль WS_BORDER, так что и фрэйм имеется. И сообщение WM_NCPAINT приходит, вот только в регион wParam ничего не рисуется, и GetDcEx() на wParam'е не работает. Хотя с регионом wParam все нормально: он валидный, GetRgnBox() возвращает правильные координаты.

Никак не могу понять, в чем проблема. Это лыжи не едут, или я такой "одаренный" ?
Re[5]: Как поменять цвет?
От: Antech  
Дата: 10.01.06 13:47
Оценка:
Я фигею, дорогая редакция... Будучи в непонятках, начал гуглить. Нашел очень интересную вещь:

Undocumented flags for GetDCEx

(Curtesy of Feng Yuan) GetDCEx can be used to retrieve the device context for a window during processing of WM_NCPAINT. The documentation states that this is achieved by using

GetDCEx(hwnd, hrgn, DCX_WINDOW | DCX_INTERSECTRGN);

However, this call never works, because there is an undocumented flag to include which is not mentioned anywhere.

GetDCEx(hwnd, hrgn, DCX_WINDOW | DCX_INTERSECTRGN | 0x10000);


Взято отсюда: http://www.catch22.net/tuts/tips.asp

То есть GetDcEx() и не должен работать, если делать по SDK. С этим недокументированным флагом — GetDcEx() работает, но от этого не легче: FillRgn() в полученном контексте ничего не рисует.
Re[5]: Как поменять цвет?
От: Antech  
Дата: 10.01.06 14:56
Оценка:
В общем, сделал с помощью GetWindowDc() и FillRgn(), а сам неклиентский регион определяю из общего региона окна и региона клиентской части (CombineRgn).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.