Avatar billede simonkofod Nybegynder
02. oktober 2001 - 22:20 Der er 1 kommentar og
1 løsning

MFC: Gennemsigtig bmp?

Jeg skal placere et bmp i et vindue. BMP\'en har et rødt område RGB(255,0,0), som skal være gennemsigtigt.

Jeg har forsøgt nedenstående nedenstående funktion, men får fejlen:

\"cannot convert parameter 1 from \'class CDC *\' to \'struct HDC__ *\'\"

Det virker fint hvis jeg benytter BitBlt, men så kommer den røde farve med.

Her er funktionen:


void CChessBoard::DrawChessPieces(CDC *pDC)
{
  CBitmap bmp;
  CDC memDC;
 
  memDC.CreateCompatibleDC(pDC);
  bmp.LoadBitmap(IDB_1B);
  memDC.SelectObject(&bmp);

  TransparentBlt(pDC,100,100,30,30,memDC,
                  0,0,30,30,RGB(255,0,0));

  //pDC->BitBlt(100,100,30,30,&memDC,0,0,SRCCOPY);
Avatar billede jpk Nybegynder
03. oktober 2001 - 08:27 #1
Prøv dette...
(crColor er den farve der skal ses som transparent)

void CSplashBitmap::Splash(CDC* pDC, int x, int y, COLORREF crColor)
{
    BITMAP bm;
    GetObject(sizeof(BITMAP), &bm);
    CPoint size(bm.bmWidth, bm.bmHeight);
    pDC->DPtoLP(&size);

    CPoint org(0, 0);
    pDC->DPtoLP(&org);

    CDC dcImage;
    dcImage.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmapImage = dcImage.SelectObject(this);
    dcImage.SetMapMode(pDC->GetMapMode());

    CDC dcAnd;
    dcAnd.CreateCompatibleDC(pDC);
    dcAnd.SetMapMode(pDC->GetMapMode());

    CBitmap bitmapAnd;
    bitmapAnd.CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);
    CBitmap* pOldBitmapAnd = dcAnd.SelectObject(&bitmapAnd);

    dcImage.SetBkColor(crColor);
    dcAnd.BitBlt(org.x, org.y, size.x, size.y, &dcImage, org.x, org.y, SRCCOPY);

    CDC dcXor;
    dcXor.CreateCompatibleDC(pDC);
    dcXor.SetMapMode(pDC->GetMapMode());

    CBitmap bitmapXor;
    bitmapXor.CreateCompatibleBitmap(&dcImage, bm.bmWidth, bm.bmHeight);
    CBitmap* pOldBitmapXor = dcXor.SelectObject(&bitmapXor);

    dcXor.BitBlt(org.x, org.y, size.x, size.y, &dcImage, org.x, org.y, SRCCOPY);
    dcXor.BitBlt(org.x, org.y, size.x, size.y, &dcAnd, org.x, org.y, 0x220326);

    CDC dcTemp;
    dcTemp.CreateCompatibleDC(pDC);
    dcTemp.SetMapMode(pDC->GetMapMode());

    CBitmap bitmapTemp;
    bitmapTemp.CreateCompatibleBitmap(&dcImage, bm.bmWidth, bm.bmHeight);
    CBitmap* pOldBitmapTemp = dcTemp.SelectObject(&bitmapTemp);

    dcTemp.BitBlt(org.x, org.y, size.x, size.y, pDC, org.x, org.y, SRCCOPY);
    dcTemp.BitBlt(org.x, org.y, size.x, size.y, &dcAnd, org.x, org.y, SRCAND);
    dcTemp.BitBlt(org.x, org.y, size.x, size.y, &dcXor, org.x, org.y, SRCINVERT);

    pDC->BitBlt(x, y, size.x, size.y, &dcTemp, org.x, org.y, SRCCOPY);

    dcTemp.SelectObject(pOldBitmapTemp);
    dcXor.SelectObject(pOldBitmapXor);
    dcAnd.SelectObject(pOldBitmapAnd);
    dcImage.SelectObject(pOldBitmapImage);
}
Avatar billede simonkofod Nybegynder
04. oktober 2001 - 23:54 #2
Tak skal du ha jpk! Det gav mig en masse ideer. Jeg kom frem til følgende funktion som gør jobbet:

void CChessBoard::DrawTransparent(CDC * pDC, UINT ID, int x, int y)
{
    //Definere transparent farve (RØD)
    COLORREF rgbTrans = RGB(255,0,0);

    // Opretter 2 memory DC\'er til bmp og transparent
    CDC dcImage, dcTrans;           
    dcImage.CreateCompatibleDC(pDC);    //Initialisere
    dcTrans.CreateCompatibleDC(pDC);    //Initialisere

    //Opretter bitmap som indeholder billede og læser det ind i tilhørende DC
    CBitmap bmpImage;                      //Opretter bitmap som skal indeholde brikken
    bmpImage.LoadBitmap(ID);            //Loader bitmap ud fra resource ID nummeret
    dcImage.SelectObject(&bmpImage);

    //Opretter bitmap som indeholder transperent og læser det ind i tilhørende DC   
    CBitmap bmpTrans;
    int nWidth = 34; // Width();
    int nHeight = 34;// Height();
    bmpTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL);  //\"1,1\" delen definere et \"monokromt\" bmp
    dcTrans.SelectObject(&bmpTrans);


    dcImage.SetBkColor(rgbTrans);        //sætter baggrundsfarve på bmpImage til det gennemsigtige   
    dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY); //opretter transparent

    pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);  //XOR original til destination
    pDC->BitBlt(x, y, nWidth, nHeight, &dcTrans, 0, 0, SRCAND);        //AND bmpTrans resultere i at brik bliver sort, og alt andet er XORed
    pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);    //Den sidste XOR ophæver den forige XOR, og det sorte bliver tegnet

    bmpImage.DeleteObject(); //Sletter bitmap, så der tikke kommer runtime error
    bmpTrans.DeleteObject(); //Sletter bitmap, så der tikke kommer runtime error
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester