Comment dessiner du texte à l'aide de la CDC avec un fond transparent sur CBitmap?
J'ai le code suivant qui fonctionne à condition de masque à la rose pixels cependant, ce que je veux réellement transparente bits comme un fichier PNG pour que je puisse éviter le mélange alpha questions et la nécessité de masquer une couleur spécifique partout l'image bitmap sera utilisé.
CClientDC dc(pWnd);
CDC memDC;
if(!memDC.CreateCompatibleDC(&dc))
return NULL;
CRect bitmapRect;
bitmapRect.SetRectEmpty();
CFont* pOldFont = memDC.SelectObject(pWnd->GetFont());
CSize fontSize = memDC.GetTextExtent(imageText);
bitmapRect.right = fontSize.cx;
bitmapRect.bottom = fontSize.cy;
CBitmap bitmap;
if(!bitmap.CreateCompatibleBitmap(&dc, bitmapRect.Width(), bitmapRect.Height()))
return NULL;
CBitmap* pOldMemDCBitmap = memDC.SelectObject(&bitmap);
memDC.FillSolidRect(&bitmapRect, RGB(255,0,255));
//memDC.SetBkMode(TRANSPARENT); //doesn't work
//memDC.SetBkColor(TRANSPARENT); //doesn't work
memDC.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
//memDC.DrawText(imageText, bitmapRect, DT_TOP|DT_LEFT|DT_NOCLIP); //same difference
memDC.TextOut(0, 0, imageText);
memDC.SelectObject(pOldMemDCBitmap);
memDC.SelectObject(pOldFont);
memDC.DeleteDC();
CImageList bmImage;
bmImage.Create(bitmapRect.Width(), bitmapRect.Height(), ILC_COLOR32|ILC_MASK, 0, 1);
//this masks out the pink but for some windows blends edges of text causing pink text instead of black!
bmImage.Add(&bitmap, RGB(255,0,255));
Est juste le bug rempli bête que le MFC est défaillante ou ai-je raté quelque chose?
- IIRC
SetBkMode(TRANSPARENT)
devrait faire l'affaire. Vous n'avez pas, par hasard, seulement essayer y compris en ligne en combinaison avec le prochain appel àSetBkColor(TRANSPARENT)
(où il aurait présumément interpréter la constante TRANSPARENT comme de la couleur de la valeur, et peut-être remplacer la transparence mode)...? - Pas de ceux qui sont mutuellement exclusifs seulement des restes de choses que j'ai essayé ... je pense que je viens de comprendre mon problème, mais les tests avant de me mettre à jour ou de poster une réponse.
Vous devez vous connecter pour publier un commentaire.
Simple DrawText() avec un fond transparent sans MFC:
...
--hfrmobile
Environ 10 minutes après avoir posé ce je lire mon propre commentaire, et a réalisé que "certains windows" signifie qu'il a été liées à windows qui est passée. Plus précisément la police utilisée à partir de ladite fenêtre. Les polices avec les propriétés par défaut ont été en présentant l'étrange mélange.
À la fin de la journée, j'ai décidé que je devais modifier la police pour désactiver les choses gâcher mon code de dessin. Finalement, j'ai rétréci vers le bas à un coupable à l'origine du problème:
Donc j'ai encore
FillSolidRect
rose puis dessiner mes icônes, du texte, ce que je veux, etc. Puis le masque de la rose pixels. Avec la police de la qualité de l'ajustement, il n'est plus de mélanges de rose dans le texte de police et il a l'air bon. L'autre des cas ci-dessus crée une police par défaut à utiliser dans le cas où leCWnd*
passé n'est pas valide spécifié.