void CardRegion::PrepareDragBitmaps(int numtodrag) { RECT rect; HDC hdc; int icard; int numcards = cardstack.NumCards(); int xoff, yoff; if(nThreedCount > 1) { PrepareDragBitmapsThreed(numtodrag); return; } //work out how big the bitmaps need to be nDragCardWidth = (numtodrag - 1) * abs(xoffset) + __cardwidth; nDragCardHeight = (numtodrag - 1) * abs(yoffset) + __cardheight; //Create bitmap for the back-buffer hdc = GetDC(NULL); hdcBackGnd = CreateCompatibleDC(hdc); hbmBackGnd = CreateCompatibleBitmap(hdc, nDragCardWidth, nDragCardHeight); SelectObject(hdcBackGnd, hbmBackGnd); //Create bitmap for the drag-image hdcDragCard = CreateCompatibleDC(hdc); hbmDragCard = CreateCompatibleBitmap(hdc, nDragCardWidth, nDragCardHeight); SelectObject(hdcDragCard, hbmDragCard); ReleaseDC(NULL, hdc); UseNicePalette(hdcBackGnd, __hPalette); UseNicePalette(hdcDragCard, __hPalette); int realvisible = numcards / nThreedCount; //if(numcards > 0 && realvisible == 0) realvisible = 1; int iwhichcard = numcards - 1; if(nThreedCount == 1) iwhichcard = 0; //grab the first bit of background so we can prep the back buffer; do this by //rendering the card stack (minus the card we are dragging) to the temporary //background buffer, so it appears if we have lifted the card from the stack //PaintRect(hdcBackGnd, &rect, crBackgnd); SetRect(&rect, 0, 0, nDragCardWidth, nDragCardHeight); xoff = calc_offset(xoffset, numcards, numtodrag, realvisible); yoff = calc_offset(yoffset, numcards, numtodrag, realvisible); parentWnd.PaintCardRgn(hdcBackGnd, 0, 0, nDragCardWidth, nDragCardHeight, xpos - xoff, ypos - yoff); // // Render the cardstack into the back-buffer. The stack // has already had the dragcards removed, so just draw // what is left // for(icard = 0; icard < realvisible; icard++) { Card card = cardstack.cardlist[iwhichcard]; int nCardVal; nCardVal = card.FaceUp() ? card.Idx() : nBackCardIdx; xoff = xoffset * icard + calc_offset(xoffset, numcards, numtodrag, realvisible);//- xoffset * ((numcards+numtodrag) / nThreedCount - numtodrag); yoff = yoffset * icard + calc_offset(yoffset, numcards, numtodrag, realvisible);//- yoffset * ((numcards+numtodrag) / nThreedCount - numtodrag); CardBlt(hdcBackGnd, xoff, yoff, nCardVal); iwhichcard++; } // // If there are no cards under this one, just draw the place holder // if(numcards == 0) { int xoff = 0, yoff = 0; if(xoffset < 0) xoff = nDragCardWidth - __cardwidth; if(yoffset < 0) yoff = nDragCardHeight - __cardheight; switch(uEmptyImage) { case CS_EI_NONE: //No need to draw anything: We already cleared the //back-buffer before the main loop.. //SetRect(&rc, xoff, yoff, xoff+ __cardwidth, yoff + __cardheight); //PaintRect(hdcBackGnd, &rc, MAKE_PALETTERGB(crBackgnd)); //parentWnd.PaintCardRgn(hdcBackGnd, xoff, yoff, __cardwidth, __cardheight, xpos, ypos);// + xoff, ypos + yoff); break; case CS_EI_SUNK: DrawCard(hdcBackGnd, xoff, yoff, __hdcPlaceHolder, __cardwidth, __cardheight); break; case CS_EI_CIRC: case CS_EI_X: CardBlt(hdc, xoff, yoff, uEmptyImage); break; } } // // now render the drag-cards into the dragcard image // PaintRect(hdcDragCard, &rect, crBackgnd); for(icard = 0; icard < numtodrag; icard++) { int nCardVal; if(xoffset >= 0) xoff = xoffset * icard; else xoff = -xoffset * (numtodrag - icard - 1); if(yoffset >= 0) yoff = yoffset * icard; else yoff = -yoffset * (numtodrag - icard - 1); Card card = dragstack.cardlist[icard]; nCardVal = card.FaceUp() ? card.Idx() : nBackCardIdx; CardBlt(hdcDragCard, xoff, yoff, nCardVal); } }
void CardRegion::PrepareDragBitmapsThreed(int numtodrag) { RECT rect; HDC hdc; int icard; int numunder = 0; int iwhichcard; int numcards = cardstack.NumCards(); //work out how big the bitmaps need to be nDragCardWidth = (numtodrag - 1) * abs(xoffset) + __cardwidth; nDragCardHeight = (numtodrag - 1) * abs(yoffset) + __cardheight; //Create bitmap for the back-buffer hdc = GetDC(NULL); hdcBackGnd = CreateCompatibleDC(hdc); hbmBackGnd = CreateCompatibleBitmap(hdc, nDragCardWidth, nDragCardHeight); SelectObject(hdcBackGnd, hbmBackGnd); //create bitmap for the drag-image hdcDragCard = CreateCompatibleDC(hdc); hbmDragCard = CreateCompatibleBitmap(hdc, nDragCardWidth, nDragCardHeight); SelectObject(hdcDragCard, hbmDragCard); ReleaseDC(NULL, hdc); UseNicePalette(hdcBackGnd, __hPalette); UseNicePalette(hdcDragCard, __hPalette); //grab the first bit of background so we can prep the back buffer; do this by //rendering the card stack (minus the card we are dragging) to the temporary //background buffer, so it appears if we have lifted the card from the stack //--SetRect(&rect, 0, 0, nDragCardWidth, nDragCardHeight); //--PaintRect(hdcBackGnd, &rect, crBackgnd); int threedadjust = numcards % nThreedCount == 0; numunder = CalcApparentCards(numcards); iwhichcard = (numcards+numtodrag) - numunder - 1; if(nThreedCount == 1) iwhichcard = 0; int xoff = calc_offset(xoffset, numunder, numtodrag, numunder); int yoff = calc_offset(yoffset, numunder, numtodrag, numunder); parentWnd.PaintCardRgn(hdcBackGnd, 0,0, nDragCardWidth,nDragCardHeight, xpos - xoff,ypos - yoff); // // Render the cardstack into the back-buffer. The stack // has already had the dragcards removed, so just draw // what is left // for(icard = 0; icard < numunder; icard++) { Card card = cardstack.cardlist[iwhichcard]; int nCardVal = card.FaceUp() ? card.Idx() : nBackCardIdx; CardBlt(hdcBackGnd, xoffset * icard - xoffset*(numunder-numtodrag+threedadjust), yoffset * icard - yoffset*(numunder-numtodrag+threedadjust), nCardVal); iwhichcard++; } // // If there are no cards under this one, just draw the place holder // if(numcards == 0) { switch(uEmptyImage) { case CS_EI_NONE: //no need! we've already cleared the whole //back-buffer before the main loop! //SetRect(&rect, 0, 0, __cardwidth, __cardheight); //PaintRect(hdcBackGnd, &rect, MAKE_PALETTERGB(crBackgnd)); break; case CS_EI_SUNK: DrawCard(hdcBackGnd, 0, 0, __hdcPlaceHolder, __cardwidth, __cardheight); break; case CS_EI_CIRC: case CS_EI_X: CardBlt(hdc, 0, 0, uEmptyImage); break; } } // // now render the drag-cards into the dragcard image // PaintRect(hdcDragCard, &rect, crBackgnd); for(icard = 0; icard < numtodrag; icard++) { Card card = dragstack.cardlist[icard]; int nCardVal = card.FaceUp() ? card.Idx() : nBackCardIdx; CardBlt(hdcDragCard, xoffset * icard, yoffset * icard, nCardVal); } }
void CardRegion::Render(HDC hdc) { int cardnum = 0; int numtodraw; BOOL fDrawTips; Update(); //Update this stack's card count + size numtodraw = nNumApparentCards; if(nFlashCount != 0) { if(fFlashVisible == false) numtodraw = 0; } if(fVisible == 0) return; cardnum = cardstack.NumCards() - numtodraw; int counter; for(counter = 0; counter < numtodraw; counter++) { int cardval; int x = xoffset * counter + xpos; int y = yoffset * counter + ypos; //if about to draw last card, then actually draw the top card if(counter == numtodraw - 1) cardnum = cardstack.NumCards() - 1; Card card = cardstack.cardlist[cardnum]; cardval = card.Idx(); if(card.FaceDown()) cardval = nBackCardIdx; //card-back //only draw the visible part of the card if(counter < numtodraw - 1) { if(yoffset != 0 && xoffset != 0) fDrawTips = FALSE; else fDrawTips = TRUE; if((yoffset != 0 && abs(xoffset) == 1) || (xoffset != 0 && abs(yoffset) == 1)) fDrawTips = TRUE; //draw horizontal strips if(yoffset > 0) { DrawHorzCardStrip(hdc, x, y, cardval, yoffset, fDrawTips); } else if(yoffset < 0) { DrawHorzCardStrip(hdc, x, y+__cardheight+yoffset, cardval, yoffset, fDrawTips); } //draw some vertical bars if(xoffset > 0) { DrawVertCardStrip(hdc, x, y, cardval, xoffset, fDrawTips); } else if(xoffset < 0) { DrawVertCardStrip(hdc, x+__cardwidth+xoffset, y, cardval, xoffset, fDrawTips); } if(yoffset != 0 && xoffset != 0)//fDrawTips == FALSE) { //if we didn't draw any tips, then this is a 2-dim stack //(i.e, it goes at a diagonal). //in this case, we need to fill in the small triangle in //each corner! DrawCardCorner(hdc, x, y, cardval, xoffset, yoffset); } } //if the top card, draw the whole thing else { CardBlt(hdc, x, y, cardval); } cardnum ++; } //end of index if(counter == 0) //if the cardstack is empty, then draw it that way { int x = xpos; int y = ypos; switch(uEmptyImage) { default: case CS_EI_NONE: //this wipes the RECT variable, so watch out! //SetRect(&rect, x, y, x+__cardwidth, y+__cardheight); //PaintRect(hdc, &rect, MAKE_PALETTERGB(crBackgnd)); parentWnd.PaintCardRgn(hdc, x, y, __cardwidth, __cardheight, x, y); break; case CS_EI_SUNK: DrawCard(hdc, x, y, __hdcPlaceHolder, __cardwidth, __cardheight); break; case CS_EI_CIRC: case CS_EI_X: CardBlt(hdc, x, y, uEmptyImage); break; } } return; }