В моей программе мне нужно рисовать градиент в неклиентной области окна. Я передаю window device context в Win32 API функцию GradientFill(…). Все нормально под Win2000 и WinXP, а вот под WinMe градиент рисуется неверно, он как-то обрезан!
Я сделал небольшой примерчик, где эта ошибка воспроизводится. Вот две функции, которые рисуют градиент:
// offset from screen to window coordinates
rect.OffsetRect(-rect.left, -rect.top);
// get window device context
HDC hDC = ::GetWindowDC(m_hWnd);
// draw gradient
DrawGradient(hDC, rect);
// clean up
::ReleaseDC(m_hWnd, hDC);
}
void CTestDlg::DrawGradient(HDC hDC, const CRect& rect)
{
// This code is borrowed from MSDN
// article "Drawing a Shaded Rectangle"
TRIVERTEX vert[2] ;
GRADIENT_RECT gRect;
vert [0] .x = rect.left;
vert [0] .y = rect.top;
vert [0] .Red = 0x0000;
vert [0] .Green = 0x0000;
vert [0] .Blue = 0x0000;
vert [0] .Alpha = 0x0000;
vert [1] .x = rect.right;
vert [1] .y = rect.bottom;
vert [1] .Red = 0x0000;
vert [1] .Green = 0x0000;
vert [1] .Blue = 0xff00;
vert [1] .Alpha = 0x0000;
Для сравнения я включил в пример функцию FillRect(…), которой передается тот же device context. Все отлично работает и под WinMe и под другими Виндовозами! Чудеса!
А что думают профи в графике? Это что, ошибка в Микросовтовской реализации GradientFill(…) под WinMe?
Я использую:
WinMe/WinXP, Visual C++ 6.0, SP5, Platform SDK August 2001
Буду очень благодарен за комментарии, могу прислать демо проект, кого это заинтересует.