VC6.0 mfc单文档中如何修改此代码#include <vector> public: CDC *pDC; CPoint center,pt; int r; COLORREF color; CBrush br; std::vector<CPoint>points; void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default pDC=GetDC(); center=point; r=rand()%46+5;//r=5~50 color=RGB(rand()%256,rand()%256,rand()%256); br.CreateSolidBrush(color); pDC->SelectObject(&br); pDC->Ellipse(center.x-r,center.y-r,center.x+r,center.y+r); br.DeleteObject(); points.push_back(center); CView::OnLButtonDown(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default SetTimer(1,200,NULL); CView::OnLButtonUp(nFlags, point); } void CMyView::rise() { center.y-=5; pDC=GetDC(); br.CreateSolidBrush(color); pDC->SelectObject(&br); pDC->Ellipse(center.x-r,center.y-r,center.x+r,center.y+r); br.DeleteObject(); } void CMyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default RedrawWindow(); rise(); CView::OnTimer(nIDEvent); }能实现鼠标单击左键出现一个垂直向上运动的圆,第二次单击左键又出现个垂直向上运动的圆,并且第一个圆不会消失而是继续原来的运动垂直向上,完整代码和步骤
时间: 2024-02-13 09:06:33 浏览: 60
完整的代码如下:
MyView.h:
```
#pragma once
#include <vector>
class CMyView : public CView
{
protected:
CPoint center, pt;
int r;
COLORREF color;
CBrush br;
std::vector<CPoint> points;
CDC* pDC;
void rise();
protected:
DECLARE_DYNCREATE(CMyView)
public:
CMyView() {};
virtual ~CMyView() {};
virtual void OnDraw(CDC* pDC);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnLButtonDown(UINT nFlags, CPoint point);
virtual void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT nIDEvent);
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // MyView.cpp 中的调试版本
inline CMyDoc* CMyView::GetDocument()
{ return reinterpret_cast<CMyDoc*>(m_pDocument); }
#endif
```
MyView.cpp:
```
#include "pch.h"
#include "My.h"
#include "MyDoc.h"
#include "MyView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
for (int i = 0; i < points.size(); i++)
{
br.CreateSolidBrush(color);
pDC->SelectObject(&br);
pDC->Ellipse(points[i].x - r, points[i].y - r, points[i].x + r, points[i].y + r);
br.DeleteObject();
}
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
center = point;
r = rand() % 46 + 5;
color = RGB(rand() % 256, rand() % 256, rand() % 256);
points.push_back(center);
SetTimer(1, 200, NULL);
CView::OnLButtonDown(nFlags, point);
}
void CMyView::OnLButtonUp(UINT nFlags, CPoint point)
{
CView::OnLButtonUp(nFlags, point);
}
void CMyView::rise()
{
for (int i = 0; i < points.size(); i++)
{
points[i].y -= 5;
}
}
void CMyView::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1)
{
rise();
Invalidate();
}
CView::OnTimer(nIDEvent);
}
```
步骤如下:
1. 在 MFC 单文档应用程序中,右键单击 MyView 类,选择“添加方法”。
2. 在“添加方法”对话框中,输入“rise”作为名称,并选择返回类型为“void”。
3. 单击“确定”按钮,在 MyView.cpp 文件中会自动生成 rise 方法的声明和定义。
4. 在 OnLButtonDown 方法中添加代码,以便在单击鼠标左键时创建一个圆形并将其添加到 points 向量中。
5. 在 OnLButtonDown 方法中添加代码,以便在单击鼠标左键时启动定时器。
6. 在 OnLButtonUp 方法中添加代码,以便在松开鼠标左键时停止定时器。
7. 在 OnTimer 方法中添加代码,以便在定时器触发时移动所有圆形并重绘视图。
8. 在 OnDraw 方法中添加代码,以便在视图中绘制所有圆形。
9. 编译并运行应用程序,单击鼠标左键创建一个圆形并使其向上移动,第二次单击鼠标左键创建另一个圆形,并使两个圆形同时向上移动。
阅读全文