Не получается поменять цвет в Title.Использую GetWindowDC.А что делать с полученным контекстом?
Здравствуйте, Paul111, Вы писали:
P> Не получается поменять цвет в Title.Использую GetWindowDC.А что делать с полученным контекстом?
Думаю, Вам стоит посмотреть в сторону WM_NCPAINT.
<< RSDN@Home 1.1.0 stable >>
В сторону WM_NCPAINT я смотрел.Но не знаю как обработать это сообщение.Я начинающий.
Здравствуйте, 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 >>
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?
S_B>Листбокс помоему не окошко с фреймом. Или я не прав?
Листбокс — это окно, как и любой другой контрол. У него есть стиль WS_BORDER, так что и фрэйм имеется. И сообщение WM_NCPAINT приходит, вот только в регион wParam ничего не рисуется, и GetDcEx() на wParam'е не работает. Хотя с регионом wParam все нормально: он валидный, GetRgnBox() возвращает правильные координаты.
Никак не могу понять, в чем проблема. Это лыжи не едут, или я такой "одаренный"

?
Я фигею, дорогая редакция... Будучи в непонятках, начал гуглить. Нашел очень интересную вещь:
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() в полученном контексте ничего не рисует.
В общем, сделал с помощью GetWindowDc() и FillRgn(), а сам неклиентский регион определяю из общего региона окна и региона клиентской части (CombineRgn).