[VC++ MFC] Comment faire de la transparence avec bitblt ?

Comment faire de la transparence avec bitblt ? [VC++ MFC] - C++ - Programmation

Marsh Posté le 18-11-2002 à 11:03:00    

Salut,
 
J'ai un chtit pb , ca fait un bout de temps que j'essaie de faire un truc et j y arrive pas ... je m explique :
 
Je dois dessiner un bouton dans une fenetre (CView) mais ce n'est pas une image . Pour le représenter , je prends le fond et je veux faire une manip pour rendre la zone plus claire (ou plus foncée) mais comment faire ? je suppose que je dois utiliser BitBlt avec un dwRop bien spécifique mais je n y arrive pas ca n'affiche rien en fait .
 
Ce que je fais :
 

Code :
  1. CDC dc;
  2. dc.CreateCompatibleDC(pDC);
  3. CBrush brush;
  4. brush.CreateSolidBrush(RGB(255,0,0));
  5. dc.SelectObject(&brush);
  6. pDC->BitBlt(rect.left,rect.top,rect.right-rect.left,rect.bottom - rect.top,&dc,0,0,MERGECOPY);
  7. Brush.DeleteObject();
  8. dc.DeleteDC();


 
dans le dernier champ(dwRop) quelque soit l option , il ne met fait rien sauf BLACKNESS (tout en noir, normal),WHITENESS(tout en blanc) et PATINVERT ou il m'inverse seulement la destination...  
 
Et si je change la couleur de mon brush ca ne change rien.
 
Comment faire SVP ?
 
merci

Reply

Marsh Posté le 18-11-2002 à 11:03:00   

Reply

Marsh Posté le 18-11-2002 à 13:44:34    

Up y a personne qui sait faire ca :??:

Reply

Marsh Posté le 18-11-2002 à 16:28:36    

xilebo a écrit a écrit :

Up y a personne qui sait faire ca :??:




 
Voici du code extrait de mes libs, je te laisse faire le menage, il doit y avoir tout ce qu'il faut... tu peux même surment améliorer le tout...
 

Code :
  1. // Charger le bitmap
  2. BOOL  bRet = TRUE;
  3. HINSTANCE hResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIDResource),RT_BITMAP);
  4. ASSERT(hResource);
  5. // Load the bitmap, and create a DIB section
  6. HBITMAP hBmp =
  7. (HBITMAP)::LoadImage( hResource,
  8.       MAKEINTRESOURCE(nIDResource),IMAGE_BITMAP,0,0,
  9.       LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
  10. if( hBmp == NULL )
  11.  return FALSE; // Cannot load the bitmap
  12. if(!Attach( hBmp ))
  13.  return FALSE;
  14. // Retrieve bitmap size
  15. BITMAP bitmapData;
  16. GetBitmap(&bitmapData);
  17. m_sizeBitmap.cx = bitmapData.bmWidth;
  18. m_sizeBitmap.cy = bitmapData.bmHeight;
  19. // Ensuite dessiner le bitmap
  20. // crColour est la couleur a utiliser pour la transparance
  21. BOOL CGBitmap::DrawTransparent(CDC * pDC, int x, int y, COLORREF crColour)
  22. {
  23. // Make sure to have called LoadBitmap() before to use this function
  24. ASSERT(GetSafeHandle());
  25. COLORREF crOldBack = pDC->SetBkColor(RGB(255,255,255));
  26. COLORREF crOldText = pDC->SetTextColor(RGB(0,0,0));
  27. CDC   dcImage, dcTrans;
  28. BOOL  bResult;
  29. CBitmap* pOldBitmapTrans;
  30. // Create two memory dcs for the image and the mask
  31. dcImage.CreateCompatibleDC(pDC);
  32. dcTrans.CreateCompatibleDC(pDC);
  33. // Select the image into the appropriate dc
  34. CBitmap* pOldBitmapImage = dcImage.SelectObject(this);
  35. // Create the mask bitmap
  36. CBitmap bitmapTrans;
  37. bResult = bitmapTrans.CreateBitmap(m_sizeBitmap.cx, m_sizeBitmap.cy, 1, 1, NULL);
  38. if(bResult)
  39. {
  40.  // Select the mask bitmap into the appropriate dc
  41.  pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans);
  42.  // Build mask based on transparent colour
  43.  dcImage.SetBkColor(crColour);
  44.  bResult = dcTrans.BitBlt(0, 0, m_sizeBitmap.cx, m_sizeBitmap.cy, &dcImage, 0, 0, SRCCOPY);
  45.  // Do the work - True Mask method - cool if not actual display
  46.  if(bResult)
  47.   bResult = pDC->BitBlt(x, y, m_sizeBitmap.cx, m_sizeBitmap.cy, &dcImage, 0, 0, SRCINVERT);
  48.  if(bResult)
  49.   bResult = pDC->BitBlt(x, y, m_sizeBitmap.cx, m_sizeBitmap.cy, &dcTrans, 0, 0, SRCAND);
  50.  if(bResult)
  51.   bResult = pDC->BitBlt(x, y, m_sizeBitmap.cx, m_sizeBitmap.cy, &dcImage, 0, 0, SRCINVERT);
  52. }
  53. // Restore settings
  54. dcImage.SelectObject(pOldBitmapImage);
  55. dcTrans.SelectObject(pOldBitmapTrans);
  56. pDC->SetBkColor(crOldBack);
  57. pDC->SetTextColor(crOldText);
  58. bitmapTrans.DeleteObject();
  59. return bResult;
  60. }


 
J'utilise ces functions depuis des années pour afficher des icones dans des boites de dialogue ou le fond est un bitmap (marbre ou autre motif). ça marche nickel.
Tu peux surment simplifier le code sous Windows, car ce code ci est fait egalement pour tourner sous UNIX (SUN Solaris) via des outils de portages spécifiques, donc le chargement du bitmap doit etre fait de cette manière; mais sous Windows, je crois que tu n'as pas besoin de tout ce bazard...  :)


Message édité par YungMakko le 18-11-2002 à 16:33:39

---------------
In tartiflette, we trust!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed