int GridWidget::cellHitTest(const QPoint &point) { qreal wantedHeight = CELL_HEIGHT * (ROW_COUNT + 1); qreal wantedWidth = FIRST_COL_WIDTH + CELL_WIDTH * COL_COUNT; qreal scaleWidth = width()/wantedWidth; qreal scaleHeight = height()/ wantedHeight; qreal minScale = qMin(scaleWidth, scaleHeight); QRectF drawnRect(0, 0, wantedWidth*minScale, wantedHeight*minScale); drawnRect.moveCenter(this->rect().center()); drawnRect.moveTop(0); if(!drawnRect.contains(point)) return -1; qreal cellWidth = (drawnRect.width() - FIRST_COL_WIDTH * minScale) / COL_COUNT; qreal firstColWidth = drawnRect.width() - (COL_COUNT * cellWidth); qreal cellHeight = drawnRect.height() / (ROW_COUNT + 1); int col = (point.x() - drawnRect.left() - firstColWidth) / cellWidth; int row = (point.y() - drawnRect.top() - cellHeight) / cellHeight; if(col<0) return -1; if(row<0) return -1; int address = (row * 32) + col; if(address>511 || address<0) return -1; return address; }
/************************************************************************ drawListCtrlProgressBar 리스트 컨트롤에 사용되는 진행바를 그린다. @PARAM : @RETURN : @REMARK : 그림을 그리는 영역의 높이 너비가 4픽셀 이하인 경우에는 그리지 않는다. @AUTHOR : youngchang ([email protected]) @HISTORY : 2006/01/03:CREATED ************************************************************************/ void CFishBMPManager::drawListCtrlProgressBar(CDC* pDC, CRect rect, int percentage) { assert(percentage>=0 && percentage <= 100); enum { PADDING = 1, }; CBitmap leftProgress, middleProgress, rightElapse, middleElapse; GetBMPfromList(pDC, getListCtrlProgressBar(), 0, &leftProgress); GetBMPfromList(pDC, getListCtrlProgressBar(), 1, &middleProgress); GetBMPfromList(pDC, getListCtrlProgressBar(), 2, &middleElapse); GetBMPfromList(pDC, getListCtrlProgressBar(), 3, &rightElapse); BITMAP bm; leftProgress.GetBitmap(&bm); if (rect.Height() < bm.bmHeight && rect.Width() < 4 ) return; // 받아온 영역중 실제로 그림이 그려지는 부분 CRect drawnRect( rect.left + 1 , rect.CenterPoint().y - (int)(bm.bmHeight / 2), rect.right - 1, rect.CenterPoint().y + (bm.bmHeight - (int)(bm.bmHeight / 2)) ); CRect outlineRect = drawnRect; outlineRect.InflateRect(1, 1, 1, 1); // DRAWING ACTION // 와괵 사각형 그리기 CPen pen; pen.CreatePen(PS_SOLID, 1, RGB(0x8C, 0X8C, 0X8C)); CPen* oldPen = pDC->SelectObject(&pen); pDC->Rectangle(outlineRect); pDC->SelectObject(oldPen); int nProgressWidth = (drawnRect.Width() * percentage / 100)<0 ? (-1) : (drawnRect.Width() * percentage / 100); for (int it = drawnRect.left; it<=drawnRect.right; it++) { if ( it < drawnRect.left + nProgressWidth || percentage >= 100 ) { // 진행바의 가장 왼쪽과 가장 오른쪽 처리 if (it == drawnRect.left) m_bmplistListCtrlProgressBar.Draw(pDC, 0, CPoint(it, drawnRect.top), SRCCOPY); else if (it == drawnRect.right) m_bmplistListCtrlProgressBar.Draw(pDC, 0, CPoint(it-1, drawnRect.top), SRCCOPY); // 1을 빼줘야하는 것은 IMAGELIST 버그로 보임 else m_bmplistListCtrlProgressBar.Draw(pDC, 1, CPoint(it, drawnRect.top), SRCCOPY); } else { // 남은 상태의 가장 왼쪽과 가장 오른쪽 처리 if (it == drawnRect.left) m_bmplistListCtrlProgressBar.Draw(pDC, 3, CPoint(it, drawnRect.top), SRCCOPY); else if (it == drawnRect.right) m_bmplistListCtrlProgressBar.Draw(pDC, 3, CPoint(it-1, drawnRect.top), SRCCOPY); else m_bmplistListCtrlProgressBar.Draw(pDC, 2, CPoint(it, drawnRect.top), SRCCOPY); } } }
QRect RatingStarDrawer::drawStarPolygons(QPainter* painter, int numberOfStars) const { QRect drawnRect(0, 0, 0, 0); QPolygon polygon(m_starPolygon); if (numberOfStars) { drawnRect.adjust(0, 0, 0, m_starPolygonSize.height()); } for (int i = 0; i < numberOfStars; ++i) { painter->drawPolygon(polygon, Qt::WindingFill); polygon.translate(m_starPolygonSize.width(), 0); drawnRect.adjust(0, 0, m_starPolygonSize.width(), 0); } return drawnRect; }
void PieceManager::drawBox(sf::Vector2f start, sf::Vector2f end, bool black, bool rightClick) { sf::Vector2i startSquare, endSquare; startSquare.x = (int)std::min(start.x,end.x); startSquare.y = (int)std::min(start.y,end.y); endSquare.x = (int)std::max(start.x,end.x)+1; endSquare.y = (int)std::max(start.y,end.y)+1; sf::Vector2i size = endSquare - startSquare; sf::IntRect drawnRect(startSquare,size); if(rightClick) { for(auto it = pieces.begin(); it != pieces.end(); ++it) { if((*it).selected && !(*it).dead && black == (*it).isBlack) (*it).destination = drawnRect; } } else for(auto it = pieces.begin(); it != pieces.end(); ++it) { (*it).selected = (!(*it).dead && black == (*it).isBlack && drawnRect.contains((*it).position)); } }