Tôi đang vẽ văn bản thành một phần bitmap DIB có màn hình ngoài, sâu 32 bit và sử dụng kênh alpha (ARGB). Tôi vẽ điểm ảnh trực tiếp vào bộ nhớ. Sau đó, tôi tạo ra một đối tượng đồ họa Gdiplus, chuyển bộ nhớ DC của tôi cho nó, và vẽ văn bản bằng cách sử dụng Graphics :: DrawString. Điều này hoạt động tốt trong những hoàn cảnh bình thường. Tuy nhiên, trên Remote Desktop, văn bản được hiển thị hoàn toàn trong suốt, tức là thay vì vẽ bất kỳ pixel màu nào, bạn có thể xem qua văn bản ở đâu. Có ai biết tại sao điều này là như vậy, và làm thế nào để sửa chữa nó ??Gdiplus DrawString lấy văn bản trong suốt trên Máy để bàn Từ xa
Dưới đây là thói quen drawString tôi:
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;
}
Và đó là cách tôi tạo 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...
}
Sau khi vẽ văn bản vào DIB, tôi làm
gfx.Flush (Gdiplus::FlushIntentionSync);
EDIT: Nó cũng có thể được bạn quan tâm rằng cửa sổ nơi DIB cuối cùng được đưa vào là một cửa sổ WS_EX_LAYERED. Đó là màn hình giật gân hiển thị khi ứng dụng bắt đầu và bị từ từ nhạt dần vào và ra bằng bộ hẹn giờ và phương pháp sau:
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);
}
Điều gì sẽ xảy ra khi bạn thay đổi cài đặt độ sâu màu của phiên RDP? –
Tôi đã thử nghiệm 15bit, 16bit, 24bit, 32bit (thiết lập trong tab Hiển thị trước khi phiên RDP được bắt đầu). Cùng một vấn đề với tất cả các cài đặt này. (Trên thực tế, 32bit không nhìn 32 bit với tôi. Có lẽ RDP là gian lận?) –
Làm thế nào để vô hiệu hóa Bitmap Caching Persistent? –