GDI + проблемы на Windows XP - PullRequest
       8

GDI + проблемы на Windows XP

2 голосов
/ 04 марта 2012

Я использую GDI + для отображения окна входа в систему.Все это прекрасно работает на Windows 7, но на Windows XP (SP3 со всеми обновлениями) нет абсолютно никакого вывода.

Код в WM_PAINT

PAINTSTRUCT ps;
HDC         hdc = BeginPaint( hwnd, &ps );
Graphics    *graphics= new Graphics( hdc );

if ( graphics->Clear( BACKGROUND_COLOR ) != Ok )
{
    LOGGER << "LoginWindow::Error clearing surface" << endl;
    goto clean;
}

if ( graphics->DrawImage( dialogHeader, 0, 0, dialogHeaderSize.cx, dialogHeaderSize.cy ) != Ok )
{
    LOGGER << "LoginWindow::Error drawing image" << endl;
    goto clean;
}

if ( graphics->DrawRectangle( dialogBorderPen, 0, 0, LOGIN_WINDOW_WIDTH - 1, LOGIN_WINDOW_HEIGHT - 1 ) != Ok )
{
    LOGGER << "LoginWindow::Error drawing rectangle" << endl;
    goto clean;
}

clean:
delete graphics;
EndPaint( hwnd, &ps );

dialogHeader - это изображение .png, загруженное с помощью следующего кода:

dialogHeader = Bitmap::FromFile( imagePath );

GDI + инициализируется так:

GdiplusStartupInput gdiplusStartupInput;
Status              gdiplusStatus;
ULONG_PTR           gdiplusToken;

gdiplusStatus = GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL );

if ( gdiplusStatus != Ok )
{
    LOGGER << "Main::Failed to initialize GDI+. ErrorCode=" << gdiplusStatus << endl;
    return 1;
}

Некоторые известные факты:

  • Код рисования всегда выполняется успешно (проверено с помощью отладчика - Visual Studio 2010)
  • Изображение загружается без ошибок
  • Это происходит, еслиwindows themes / aero выключен или включен
  • Когда я перетаскиваю окно на Windows XP вне экрана, а затем обратно изображение отображается так:

http://imageshack.us/photo/my-images/851/winxp2.png/

Вывод на windows 7

http://imageshack.us/photo/my-images/824/win7p.png/

Вывод на windows XP

http://imageshack.us/photo/my-images/839/winxpu.png/

Надеюсь, кто-то может помочь.Спасибо.

1 Ответ

3 голосов
/ 05 марта 2012

Оказывается, это была комбинация стиля WS_EX_COMPOSITED и пользовательской живописи GDI +. Если я включу этот флаг, на Windows XP изначально ничего не рисуется. Только после изменения размера вещи начинают появляться.

После некоторых исследований я обнаружил, что это, вероятно, ошибка. Существует обходной путь однако:

  1. Создайте раздел DIB HBITMAP (или вы можете попробовать стандартный HBITMAP) в памяти и выберите его в HDC (посмотрите на CreateCompatibleBitmap и CreateCompatibleDC , а также SelectObject ).
  2. Обязательно создайте HBITMAP размером с клиентское окно.
  3. Теперь используйте этот «память» HDC при вызове:

    Graphics graphics (m_hDC); 
    
  4. Когда GDI + завершит рисование в памяти HDC, вызовите BitBlt, чтобы нарисовать изображение на pDC.

...