吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 567|回复: 8
收起左侧

[学习记录] CAD 矩形 直线绘制 (矩形绘制覆盖问题未解决)

[复制链接]
BGDK111 发表于 2024-12-7 23:08
CAD 矩形 直线代码简单实现篇我们刚才学会了 画直线但是 矩形没学啊 我们知道了Rectangle() 是CDC 我们可以模仿一下于是乎  CPoint m_ptBegin;
CPoint m_ptEnd;
CPoint m_ptBegin2;
CPoint m_ptEnd2;
typedef struct PointLines {
    CPoint m_ptBegin;
    CPoint m_ptEnd;
}Lines, * PLines;  // 结构体传参防止 再看一眼就会爆炸
typedef struct PointLines2 {
    CPoint m_ptBegin2;
    CPoint m_ptEnd2;
}Lines2, * PLines2;  // 结构体传参防止 再看一眼就会爆炸
CList <Lines> m_CLine;  // 保存链表
CList <Lines2> m_CLine2;
int m_nId; // 判断 Menu状态在弄个链表 但是记得我们是位图 矩形是一大块 这个提前说一声  相当于在来一遍 画直线 不过变成 矩形而已void CCADView::CPdU(CPoint point)
{
    if (m_nId == IDM_LINE) {
        m_ptEnd = point;
        m_CLine.AddTail(Lines{ m_ptBegin,m_ptEnd });  // 鼠标抬起时候是保存 所以 保存链表
    }
    else if (m_nId == IDM_RECTANGLE) {
        m_ptEnd2 = point;
        m_CLine2.AddTail(Lines2{ m_ptBegin2,m_ptEnd2 });  // 鼠标抬起时候是保存 所以 保存链表
    }
&#8203;
}这个判断抬起,下面是判断落下void CCADView::CpdD(CPoint point)
{
    if (m_nId == IDM_LINE) {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        m_ptBegin = point;
    }
    if (m_nId == IDM_RECTANGLE) {
        m_ptBegin2 = point;
    }
&#8203;
}经典的判断Menu 状态 void CCADView::ZhiXian()
{
    m_nId = IDM_LINE;
}
void CCADView::OnRectangle()  // Choose
{
    m_nId = IDM_RECTANGLE;
}
&#8203;
//m_nId为指示接下来是Move 其实一次无效区域也可以 我是为了显得文章多:)void CCADView::OnMouseMove(UINT nFlags, CPoint point)
{
        
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    if (m_nId == IDM_LINE) {
        if (nFlags & MK_LBUTTON) {  // 移动但是要判断按没按下 否则他会一直移动
            m_ptEnd = point;
            InvalIDAteRect(NULL, FALSE);
        }
    }
    else if (m_nId == IDM_RECTANGLE) {
        if (nFlags & MK_LBUTTON) {  // 移动但是要判断按没按下 否则他会一直移动
            m_ptEnd2 = point;
            InvalidateRect(NULL, FALSE);
        }
    }
        
   
}
&#8203;核心思想 双缓冲视图 &#8203;
    CDC DC;  // 创建 兼容设备上下文
   
    CRect Rc;
    GetClientRect(&Rc);
    DC.CreateCompatibleDC(pDC);// 找到目标
    CBitmap Bitmaps;
   
    Bitmaps.CreateCompatibleBitmap(pDC, Rc.Width(), Rc.Height());
    //选择目标
    DC.SelectObject(&Bitmaps);
    DC.FillSolidRect(&Rc, RGB(255, 255, 255));   // 重画背景色
    //绘个图先
&#8203;
    POSITION a_pos = m_CLine.GetHeadPosition();
    POSITION a_pos2 = m_CLine2.GetHeadPosition();
   
    while (a_pos2) {  // 矩形第一个让他绘制的时候线在前面  每次重绘都是把里面图片贴上去啊!!!!
        Lines2& line2 = m_CLine2.GetNext(a_pos2);  // 把链表的值取出来  里面是POSITION
        DC.Rectangle(line2.m_ptBegin2.x, line2.m_ptBegin2.y, line2.m_ptEnd2.x, line2.m_ptEnd2.y);
        k++;
    }
&#8203;
    while (a_pos) {
        Lines& line = m_CLine.GetNext(a_pos);  // 把链表的值取出来  里面是POSITION
&#8203;
&#8203;
        DC.MoveTo(line.m_ptBegin);
        DC.LineTo(line.m_ptEnd);
        k++;
    }
    if (m_nId == IDM_RECTANGLE) {
        DC.Rectangle(m_ptBegin2.x, m_ptBegin2.y, m_ptEnd2.x, m_ptEnd2.y);
    }
&#8203;
    if (m_nId == IDM_LINE) {
    DC.MoveTo(m_ptBegin);
    DC.LineTo(m_ptEnd);
}
   
        pDC->BitBlt(0, 0, Rc.Width(), Rc.Height(), &DC, 0, 0, SRCCOPY);
   
}
&#8203;这样就可以实现了

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

azxs2050 发表于 2024-12-8 07:13
谢谢分享
jamesjie88 发表于 2024-12-8 08:15
xiaoxion999 发表于 2024-12-8 08:41
echoofw 发表于 2024-12-8 09:49
很好的资源
winword527 发表于 2024-12-8 10:04
不是都有课本吗
zlf2020999 发表于 2024-12-8 12:20
谢谢分享,正需要!谢谢!下载测试一下
shubiao 发表于 2024-12-8 15:51
谢谢分享
gtsarman5 发表于 2024-12-24 20:01
牛的,最近也在学这个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-2 17:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表