mfc建立对话框,画图程序设计

vc++6.0:需要在已有文件基础上创建一个画板实现题目中的效果。目前文件里已经做了菜单等项目,但是上述题目实在是做不出来,希望可以指导一下,非常感谢。希望能够远程操作,可以加联系方式

img

简单写了一下,参考一下:


void CtestlistView::OnDraw(CDC* /*pDC*/)
{
    CtestlistDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码

    if (m_arrCircle.GetSize() > 0)
    {
        CClientDC dc(this);

        for (int i = 0; i < m_arrCircle.GetSize(); i++)
        {
            DrawCircle& circle = m_arrCircle[i];

            CBrush brush(circle.m_color);
            CPen pen(PS_SOLID, 1, circle.m_color);
            CBrush* pOldBrush = dc.SelectObject(&brush);
            CPen* pOldPen = dc.SelectObject(&pen);

            dc.Ellipse(circle.m_point.x - circle.m_radius, 
                circle.m_point.y - circle.m_radius, 
                circle.m_point.x + circle.m_radius, 
                circle.m_point.y + circle.m_radius);

            dc.SelectObject(pOldBrush);
            dc.SelectObject(pOldPen);
        }
    }

}


// CtestlistView 消息处理程序


void CtestlistView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CColorDialog dlg;
    if (dlg.DoModal() == IDOK)
    {
        DrawCircle circle;
        circle.m_color = dlg.GetColor();
        circle.m_point = point;
        circle.m_radius = rand() % 100;
        m_arrCircle.Add(circle);

        Invalidate();
    }


    CView::OnLButtonDown(nFlags, point);
}


如果对你有启发和帮助,请采纳!
答案参考Chatgpt解答
当使用 VC++ 6.0 在已有文件基础上创建画板并实现题目中的效果时,你可以按照以下步骤进行操作:

  1. 在对话框资源中添加一个按钮,用于触发绘图功能。例如,你可以在对话框资源中添加一个按钮控件,并设置其ID为 IDC_DRAW_BUTTON。

  2. 打开对话框类的头文件(通常为 .h 文件),添加以下成员变量和函数声明:

class CYourDialogClass : public CDialog
{
public:
    // ...

protected:
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // 声明鼠标左键点击事件处理函数

    // ...
};
  1. 打开对话框类的源文件(通常为 .cpp 文件),添加以下消息映射和函数实现:
BEGIN_MESSAGE_MAP(CYourDialogClass, CDialog)
    // ...
    ON_WM_LBUTTONDOWN() // 添加鼠标左键点击消息映射
    // ...
END_MESSAGE_MAP()

// 鼠标左键点击事件处理函数的实现
void CYourDialogClass::OnLButtonDown(UINT nFlags, CPoint point)
{
    CDialog::OnLButtonDown(nFlags, point);

    if (nFlags & MK_LBUTTON)
    {
        // 弹出颜色对话框
        CColorDialog dlg;
        if (dlg.DoModal() == IDOK)
        {
            COLORREF color = dlg.GetColor();

            // 以鼠标单击处为圆心画一个圆
            CDC* pDC = GetDC();
            int radius = rand() % 100 + 50; // 随机产生圆的半径
            pDC->SelectStockObject(NULL_BRUSH);
            pDC->SelectObject(CPen(PS_SOLID, 2, color));
            pDC->Ellipse(point.x - radius, point.y - radius, point.x + radius, point.y + radius);
            ReleaseDC(pDC);
        }
    }
}
  1. 在对话框类的消息映射中,添加按钮点击事件的处理函数。你可以使用 ClassWizard(类向导)将按钮的点击消息映射到一个成员函数。
void CYourDialogClass::OnDrawButtonClicked()
{
    // 触发鼠标左键点击事件,弹出颜色对话框并绘制圆
    CPoint point; // 假设你已经获得了鼠标点击的位置
    OnLButtonDown(MK_LBUTTON, point);
}
  1. 在对话框资源中关联按钮控件与按钮点击事件的处理函数。可以在按钮的属性对话框中设置按钮的控件ID,并在对话框类的消息映射中添加相应的响应函数。
BEGIN_MESSAGE_MAP(CYourDialogClass, CDialog)
    // ...
    ON_BN_CLICKED(IDC_DRAW_BUTTON, OnDrawButtonClicked)
    // ...
END_MESSAGE_MAP()

通过以上步骤,你可以在现有的对话框应用程序中实现画图功能。当用户单击左键时,将弹出颜色对话框并根

据用户选择的颜色在鼠标单击位置绘制一个随机半径的圆形。

请注意,上述代码仅为示例,你可能需要根据你的具体项目结构和需求进行相应的修改和调整。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/243193
  • 这篇博客你也可以参考下:mfc快捷键设置 | vc++6.0热键设置
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以给出建议解决方案:

    1. 首先需要在VC++6.0中,创建一个新的MFC工程,包括菜单,对话框等功能(如果已经有类似的项目,则可以直接使用该项目)

    2. 在对话框或者视图中添加画布控件,可以使用MFC提供的CStatic,CView或者CWnd控件,具体可以参考MFC开发文档。

    3. 在该控件中重载绘图函数OnPaint(),使用GDI绘图功能实现画图功能,具体可以参考GDI开发文档。

    4. 在菜单或者工具栏中添加画图工具,添加相应的响应函数,可以在响应函数中获取控件的句柄,实现对画布的控制,例如清空画布,保存图片等。

    5. 最后需要在项目中添加一些头文件和库文件,例如Windows.h,gdiplus.h等等,具体根据需要添加。

    6. 关于远程操作方面,可以使用VNC等远程桌面工具,或者使用TeamViewer等远程协助工具,具体根据需求选择使用。

    综上所述,以上是一个大致的解决方案,如果具体实现过程中还有具体问题可以再进一步探讨。

该回答引用ChatGPT4与博主@晓码自在合作编写:

根据您的描述,需要在一个现有的VC++项目中添加一个简单的画板功能,实现给定的效果。我理解您目前可能对如何在 VC++ 中实现画图功能还不太清楚,不要紧,我来给您一些指导:

  1. 添加画板窗口类CBoardWnd,需要定义窗口大小、客户区大小、画笔颜色、画笔宽度等属性,并在构造函数中设置初始值。
cpp 
class CBoardWnd : public CWnd
{
public:
    CBoardWnd();
    ...
private: 
    CRect m_rcClient;     // 客户区矩形
    COLORREF m_crColor;   // 画笔颜色
    int m_nPenWidth;      // 画笔宽度 
    ...  
};

  1. 重载CBoardWnd的OnPaint()函数。在这个函数中,我们需要获取设备上下文DC,设置画笔颜色、宽度,并绘制直线或其他图形。
cpp
void CBoardWnd::OnPaint() 
{
    CPaintDC dc(this);
    CPen pen;
    pen.CreatePen(PS_SOLID, m_nPenWidth, m_crColor);
    dc.SelectObject(&pen);
    dc.MoveTo(x1, y1);          // 起点
    dc.LineTo(x2, y2);    // 终点 
    ...
    ReleaseDC(&dc);
} 

  1. 添加鼠标事件响应函数,如OnLButtonDown()、OnMouseMove()、OnLButtonUp(),在这些函数中获取鼠标位置,并绘制线条或其他图形。
cpp
void CBoardWnd::OnLButtonDown(UINT nFlags, CPoint point) 
{
    m_ptStart = point;  // 起点
}

void CBoardWnd::OnMouseMove(UINT nFlags, CPoint point) 
{
    dc.MoveTo(m_ptStart);
    dc.LineTo(point); 
    m_ptStart = point;  // 更新起点
}   

void CBoardWnd::OnLButtonUp(UINT nFlags, CPoint point) 
{  }

  1. 将CBoardWnd类对象添加到资源,并在主窗口类中创建该对象,设置其父窗口为主窗口。
cpp
CBoardWnd* m_pBoard = new CBoardWnd();
m_pBoard->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, CRect(x, y, cx, cy), this, ID_BOARD);

这些是实现简单画板功能的基本步骤和代码参考。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
对于这个问题,我能提供一些基本的思路和代码帮助你实现。

首先,在你已有的对话框程序中,添加一个自定义控件用于绘图,例如 CStatic。在资源编辑器中,将 CStatic 控件的风格设置为 SS_BLACKRECT,这样可以取得一个黑色的矩形控件。

接下来,实现绘图功能。你可以通过重载 CStatic 控件的 WM_PAINT 消息来实现绘图。在 OnPaint 函数中,使用 CDC 类来创建一个画笔,然后利用画笔绘制图形。

比如,下面的代码演示了如何在 CStatic 控件中绘制一条线:

void MyStaticControl::OnPaint()
{
    CPaintDC dc(this); // 缓存设备上下文

    // 创建一支红色画笔
    CBrush brush(RGB(255, 0, 0));
    dc.SelectObject(brush);

    // 绘制一条直线
    dc.MoveTo(0, 0);
    dc.LineTo(100, 100);
}

你也可以通过鼠标交互来实现绘图。例如,当用户在 CStatic 控件上按下鼠标左键时,记录下鼠标的位置,当用户移动鼠标时,根据之前记录的位置和当前位置,绘制一条直线。

参考代码如下:

void MyStaticControl::OnLButtonDown(UINT nFlags, CPoint point)
{
    m_lastPoint = point; // 记录下上一次的位置
}

void MyStaticControl::OnMouseMove(UINT nFlags, CPoint point)
{
    if (nFlags & MK_LBUTTON)
    {
        // 鼠标左键被按下,绘制直线
        CPaintDC dc(this);
        CBrush brush(RGB(0, 255, 0));
        dc.SelectObject(brush);
        dc.MoveTo(m_lastPoint);
        dc.LineTo(point);
        m_lastPoint = point; // 更新位置
    }
}

以上是一些基本的思路和代码,希望对你有所帮助。至于完整的实现代码,由于你的代码和需求不确定,无法直接提供,但你可以参考以上代码实现自己的画板功能。
如果我的回答解决了您的问题,请采纳!

 CDC* pDC = GetDC(); // 获取设备上下文
        pDC->SelectStockObject(NULL_BRUSH);
        pDC->SelectObject(pLinePen); // 选择笔
        pDC->SetROP2(R2_COPYPEN); // 设置为覆盖绘图方式
        CPoint center; // 圆心
        //calculate the center
        center.x=(float(m_pStart.x+point.x))/2;
        center.y=(float(m_pStart.y+point.y))/2;
        // nRadius is a class member, double
        nRadius=sqrt(double(point.y-m_pStart.y)*(point.y-m_pStart.y)+
        (point.x-m_pStart.x)*(point.x-m_pStart.x))/2;
        pDC->Ellipse(center.x-nRadius, center.y-nRadius, center.x+nRadius, center.y+nRadius);
        ReleaseDC(pDC); // 释放设备上下文