How am I supposed to draw the rectangles colored? My task is to draw different color rectangles with the left mouse button and add them to the vector. (and the right button to drag them)
The drawing works fine, but I don't know how to make them random colors.
What I have tried:
POINT LeftButtonDown;
POINT ptCurrent;
POINT ptClicked;
vector<CRect> vRect;
bool isRubberBand = false;
bool IsClicked(CRect r, int x, int y);
void select(HWND hWnd, CRect r);
void deselect(HWND hWnd, CRect r);
void DrawRubberBand(HWND hWnd);
void MoveFromTo(HDC hdc, CRect& rectSelected, POINTS anchor, POINTS now);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CRect add;
static CRect rectSelected;
TCHAR s[100] = L"";
HDC hdc;
static POINTS anchor;
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
switch (wmId)
{
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
for (auto& rc : vRect)
{
Rectangle(hdc,
rc.left,
rc.top,
rc.right,
rc.bottom
);
}
EndPaint(hWnd, &ps);
}
break;
case WM_LBUTTONDOWN:
{
LeftButtonDown.x = LOWORD(lParam);
LeftButtonDown.y = HIWORD(lParam);
isRubberBand = true;
ptCurrent.x = LOWORD(lParam);
ptCurrent.y = HIWORD(lParam);
DrawRubberBand(hWnd);
}
break;
case WM_LBUTTONUP:
{
if (!isRubberBand)
{
return 0;
}
isRubberBand = false;
add.SetRect(LeftButtonDown.x, LeftButtonDown.y, ptCurrent.x, ptCurrent.y);
vRect.push_back(add);
UpdateWindow(hWnd);
}
break;
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON)
{
hdc = GetDC(hWnd);
if (!isRubberBand)
{
break;
}
DrawRubberBand(hWnd);
ptCurrent.x = LOWORD(lParam);
ptCurrent.y = HIWORD(lParam);
DrawRubberBand(hWnd);
}
if (wParam & MK_RBUTTON)
{
hdc = GetDC(hWnd);
POINTS now = MAKEPOINTS(lParam);
if (PtInRect(&rectSelected, POINT{ now.x,now.y }))
{
SetROP2(hdc, R2_NOTXORPEN);
MoveFromTo(hdc, rectSelected, anchor, now);
InvalidateRect(hWnd, NULL, TRUE);
anchor = MAKEPOINTS(lParam);
}
ReleaseDC(hWnd, hdc);
}
break;
case WM_RBUTTONDOWN:
{
bool isFind = false;
int x{ LOWORD(lParam) }, y{ HIWORD(lParam) };
for (auto& rc : vRect)
{
if (!isFind && IsClicked(rc, x, y))
{
select(hWnd, rc);
rectSelected = rc;
anchor = MAKEPOINTS(lParam);
isFind = TRUE;
}
else {
deselect(hWnd, rc);
}
}
}
break;
case WM_RBUTTONUP:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
bool IsClicked(CRect r, int x, int y)
{
POINT pt{ x, y };
return (bool)PtInRect(&r, pt);
}
void select(HWND hWnd, CRect r) {
HDC hdc = GetDC(hWnd);
HPEN selectPen = CreatePen(PS_DOT, 0, RGB(255, 0, 0));
SelectObject(hdc, selectPen);
Rectangle(hdc, r.left, r.top, r.right, r.bottom);
DeleteObject(selectPen);
}
void deselect(HWND hWnd, CRect r) {
HDC hdc = GetDC(hWnd);
Rectangle(hdc, r.left, r.top, r.right, r.bottom);
}
void DrawRubberBand(HWND hWnd) {
HDC hdc = GetDC(hWnd);
SetROP2(hdc, R2_NOT);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc,
LeftButtonDown.x,
LeftButtonDown.y,
ptCurrent.x,
ptCurrent.y
);
ReleaseDC(hWnd, hdc);
}
void MoveFromTo(HDC hdc, CRect& rectSelected, POINTS anchor, POINTS now)
{
Rectangle(hdc, rectSelected.left, rectSelected.top, rectSelected.right, rectSelected.bottom);
for (auto it = vRect.begin(); it != vRect.end(); it++)
{
if (*it == rectSelected)
{
vRect.erase(it);
break;
}
}
rectSelected.left = rectSelected.left + now.x - anchor.x;
rectSelected.top = rectSelected.top + now.y - anchor.y;
rectSelected.right = rectSelected.right + now.x - anchor.x;
rectSelected.bottom = rectSelected.bottom + now.y - anchor.y;
Rectangle(hdc, rectSelected.left, rectSelected.top, rectSelected.right, rectSelected.bottom);
vRect.push_back(rectSelected);
}