나는 깊이가 32 비트이고 알파 채널 (ARGB)을 사용하는 DIB 섹션의 화면 비트 맵에 텍스트를 그립니다. 픽셀을 메모리에 직접 그립니다. 그런 다음 Gdiplus Graphics 객체를 만들고, 메모리 DC를 전달하고 Graphics :: DrawString을 사용하여 텍스트를 그립니다. 정상적인 상황에서는 정상적으로 작동합니다. 그러나 원격 데스크톱에서는 렌더링 된 텍스트가 완전히 투명하게 표시됩니다. 즉, 색상 픽셀을 그리는 대신 텍스트의 위치를 볼 수 있습니다. 아무도 왜 이렇게, 그리고 그것을 고칠 방법을 알고 있습니까 ?? 나는Gdiplus DrawString은 원격 데스크톱을 통해 투명 텍스트를 그립니다.
gfx.Flush (Gdiplus::FlushIntentionSync);
편집을 수행 DIB에 텍스트를 그린 후
BITMAPV5HEADER bhd;
memset (&bhd, 0, sizeof (bhd));
bhd.bV5Size = sizeof (BITMAPV5HEADER);
bhd.bV5Width = nWidth;
bhd.bV5Height = -nHeight; // negative height indicates top-down DIB
bhd.bV5Planes = 1;
bhd.bV5BitCount = 32;
bhd.bV5Compression = BI_BITFIELDS;
bhd.bV5RedMask = 0x00FF0000;
bhd.bV5GreenMask = 0x0000FF00;
bhd.bV5BlueMask = 0x000000FF;
bhd.bV5AlphaMask = 0xFF000000;
m_pBuf = NULL;
m_hBmp = ::CreateDIBSection (m_hDC, (BITMAPINFO *) &bhd, DIB_RGB_COLORS,
(void **) &m_pBuf, NULL, 0);
if (m_hBmp == NULL || m_pBuf == NULL)
{
// error...
}
HGDIOBJ oldObj = ::SelectObject (m_hDC, m_hBmp);
if (oldObj == NULL)
{
// error...
}
:
여기 내 졸라 매는 끈 루틴입니다 :
void SplashScreen::drawString (MyString &ivText, Gdiplus::RectF &r,
Gdiplus::ARGB c, Gdiplus::StringAlignment align, Gdiplus::Font &fnt,
Gdiplus::Graphics &gfx)
{
Gdiplus::StringFormat fmt;
fmt.SetAlignment (align);
Gdiplus::SolidBrush brush (c);
wchar_t *wstr = new wchar_t [ivText.length()+1];
std::mbstowcs (wstr, ivText.cstr(), ivText.length()+1);
gfx.DrawString (wstr, ivText.length(), &fnt, r, &fmt, &brush);
delete wstr;
}
그리고 내가 DIB를 만드는 방법이 DIB가 마지막으로 그려진 창은 WS_EX_LAYERED 창입니다. 이 응용 프로그램이 시작될 때 표시하는 시작 화면, 그리고 천천히 그리고 타이머 다음과 같은 방법을 사용하여 페이드 아웃 :이 이제까지 작동 놀랐어요
void SplashScreen::setWindowTransparency (int nAlpha)
// @param nAlpha: 255 is opaque, 0 is fully transparent.
{
HWND hwnd = getHwnd();
BLENDFUNCTION blend;
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = nAlpha;
blend.AlphaFormat = AC_SRC_ALPHA;
BOOL bResult = ::UpdateLayeredWindow (hwnd, NULL, NULL, NULL, NULL,
NULL, RGB (0, 0, 0), &blend, ULW_ALPHA);
}
RDP 세션의 색 농도 설정을 변경하면 어떻게됩니까? –
나는 15 비트, 16 비트, 24 비트, 32 비트 (RDP 세션이 시작되기 전에 디스플레이 탭에서 설정)를 테스트했다. 이러한 모든 설정에서 동일한 문제가 발생합니다. (실제로, 32 비트는 32 비트를 나에게 보이지 않습니다. 아마 RDP가 바람을 피고 있습니까?) –
영구 비트 맵 캐싱을 비활성화하는 방법은 어떻습니까? –