Я делаю образец экрана-заставки в MFC
, который ничего не делает, кроме отображения самого верхнего окна без полей с изображением в качестве фона. У меня действительно странная проблема, которая возникает на компьютере моих друзей, но не на моем, хотя мы используем одну и ту же ОС. Я исправил проблему, но хотел бы узнать, почему это могло происходить на его машине, а не на моей, и почему альтернативная версия, которую я создал, работает на обеих машинах.
Неверный метод 1 (работает у меня, а не у него)
BOOL Splash::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CFrameWnd::PreCreateWindow(cs))
return FALSE;
CBitmap bitmap; bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1));
CBrush bitmapBrush; bitmapBrush.CreatePatternBrush(&bitmap);
bitmap.DeleteObject();
cs.style = WS_POPUP;
cs.dwExStyle = WS_EX_TOPMOST;
cs.lpszClass = AfxRegisterWndClass(0, 0, (HBRUSH)bitmapBrush.Detach());
bitmapBrush.DeleteObject();
return TRUE;
}
Вышеприведенное отлично работает в двух моих версиях Windows (Windows 7 и 10) и показывает мозаичное растровое изображение со смещением по центру на экземпляре Windows 7 моего друга.
Рабочий метод 2 (до сих пор работает на всем протестированном)
void Splash::OnPaint()
{
CRect window;
this->GetClientRect(&window);
PAINTSTRUCT paint = { 0 };
CDC *dc = this->BeginPaint(&paint);
CDC memDC;
memDC.CreateCompatibleDC(dc);
CBitmap *oldBitmap = memDC.SelectObject(&this->m_SplashBitmap);
dc->BitBlt(window.left, window.top, window.right, window.bottom, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(oldBitmap);
memDC.DeleteDC();
this->EndPaint(&paint);
}
Приведенный выше код работает в моей Windows 7, Windows 10 и экземпляре Windows 7 моего друга. Есть идеи, почему это так или что может произойти? Может быть, моя первая итерация сделана совершенно неправильно?
CreatePatternBrush
возвращает логическую кисть. Вероятно, это случайность, что он вообще работает, зависит от видеокарты, которую я себе представляю. - person Jonathan Potter   schedule 19.02.2017CreatePatternBrush
тоже ничего не нашел. - person vane   schedule 19.02.2017WNDCLASS
иWNDCLASSEX
используются в одних и тех же процедурах создания окон.WNDCLASS
был замененWNDCLASSEX
, а в документацииWNDCLASSEX
вообще не говорится, что это должна быть физическая кисть. Из документацииWNDCLASSEX
в том же абзаце, на который вы ссылаетесь изWNDCLASS
: этот член может быть дескриптором кисти, которая будет использоваться для рисования фона, или может быть значением цвета, обратите внимание, что в новой документации был удален квалификаторphysical
. - person vane   schedule 19.02.2017