Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1662 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°247466
xilebo
noone
Posté le 18-11-2002 à 11:03:00  profilanswer
 

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

mood
Publicité
Posté le 18-11-2002 à 11:03:00  profilanswer
 

n°247594
xilebo
noone
Posté le 18-11-2002 à 13:44:34  profilanswer
 

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

n°247751
YungMakko
Posté le 18-11-2002 à 16:28:36  profilanswer
 

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!

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[MFC] Comment faire un bouton "Help" ou "Aide"MFC + librairie static maison ...
Dll et MFCMFC : positionner une fenetre en cascade par rapport à la précédente
Visual C++/MFC : comment inserer une view dans un projet monoframe ?MFC Visual C++
blem chelou avec SendMessage MFC[MFC] comment ouvrir une base access 2000 ?
[MFC] Utilisation de la touche TAB dans un RichEdit[VC++ 6] Onglets en MFC
Plus de sujets relatifs à : [VC++ MFC] Comment faire de la transparence avec bitblt ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR