绘制一次性矩形的原理就是不断的画新矩形,并不断的擦出旧矩形
void CMeiTuDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
down = point;
old = point;
DRAW = TRUE;
CDialogEx::OnLButtonDown(nFlags, point);
}
void CMeiTuDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
dc.SetROP2(R2_NOT); //此为关键!!!
dc.SelectStockObject(NULL_BRUSH); //不使用画刷
if (TRUE == DRAW) //根据是否有单击判断是否可以画矩形
{
dc.Rectangle(CRect(down,old));
dc.Rectangle(CRect(down,point));
old = point;
//下面用于将信息显示在窗口标题
/*char buf[128];
memset(buf, 0, 128);
sprintf(buf, ("起始:(%d,%d),终点:(%d,%d),大小:%d * %d"),
down.x,down.y,point.x, point.y, abs(point.x- down.x), abs(point.y- down.y));
SetWindowText(buf);*/
}
CDialogEx::OnMouseMove(nFlags, point);
}
void CMeiTuDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
up = point;
DRAW = FALSE; //重置绘制矩形框标志
//消隐最后的一个矩形(其原理跟拖动时矩形框绘制原理相同)
CClientDC dc(this);
dc.SetROP2(R2_NOT);
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(CRect(down,old));
CDialogEx::OnLButtonUp(nFlags, point);
}
绘制半透明矩形,借鉴的哪儿的忘了==
void MyButton::DrawAlphaRect(CRect rect)
{
CDC *dc = GetDC();
CDC cdc;
cdc.CreateCompatibleDC(dc);
CBitmap bitmap, *pOldBitmap;
bitmap.CreateCompatibleBitmap(dc, rect.right, rect.bottom);
CRect src(rect);
src.OffsetRect(CSize(-rect.left, -rect.top));
pOldBitmap = cdc.SelectObject(&bitmap);
cdc.FillSolidRect(src, RGB(0, 85, 255)); //透明色
if (::AlphaBlend == 0)
{
dc->BitBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, &cdc, src.left, src.top, SRCINVERT);
} else {
BLENDFUNCTION bf;
memset(&bf, 0, sizeof(bf));
bf.SourceConstantAlpha = 0x3f; //透明程度//值越大越不透明
bf.BlendOp = AC_SRC_OVER;
::AlphaBlend(dc->GetSafeHdc(), rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
cdc.GetSafeHdc(), src.left, src.top, src.right - src.left, src.bottom - src.top, bf);
}
cdc.SelectObject(pOldBitmap);
}