VC mfc单文档中代码如下void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); 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(); } // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CMyView printing BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics #ifdef _DEBUG void CMyView::AssertValid() const { CView::AssertValid(); } void CMyView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMyDoc* CMyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return (CMyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMyView message handlers void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default center=point; r=rand()%46+5;//r=5~50 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) { // TODO: Add your message handler code here and/or call default CView::OnLButtonUp(nFlags, point); } void CMyView::rise() { for(int i=0;i<points.size();i++) { points[i].y-=5; if(points[i].y<-r) { points.erase(points.begin()+i); i--; } } } void CMyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==1){ RedrawWindow(); rise(); } CView::OnTimer(nIDEvent); },为什么运行结果中后面单击出现的圆的状态会改变前面出现的圆的状态,怎么修改此代码能实现每次单击出现的圆的大小和颜色都不相同,完整步骤及代码
时间: 2023-06-29 08:17:21 浏览: 139
运行结果中后面单击出现的圆的状态会改变前面出现的圆的状态是因为OnDraw函数中设置了画刷颜色和大小,每次重绘时都会使用相同的画刷,所以后面出现的圆会覆盖前面出现的圆。你可以在单击时随机生成一个画刷颜色和大小,然后保存到vector中,每次重绘时使用对应的画刷。
以下是修改后的代码:
```
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i = 0; i < points.size(); i++) {
// 随机生成画刷颜色和大小
COLORREF color = RGB(rand() % 256, rand() % 256, rand() % 256);
int r = rand() % 46 + 5;
// 创建画刷并绘制圆形
CBrush brush;
brush.CreateSolidBrush(color);
pDC->SelectObject(&brush);
pDC->Ellipse(points[i].x - r, points[i].y - r, points[i].x + r, points[i].y + r);
}
// TODO: add draw code for native data here
}
```
在上面的代码中,我们在OnDraw函数中随机生成画刷颜色和大小,并将其保存到vector中。然后每次绘制圆形时,使用对应的画刷。这样就可以实现每次单击出现的圆的大小和颜色都不相同的效果。
完整的步骤和代码如下:
1. 在MFC框架中创建一个单文档应用程序。
2. 在CMyView类中添加以下成员变量:
```cpp
CPoint center; // 圆心坐标
int r; // 圆的半径
COLORREF color; // 圆的颜色
std::vector<CPoint> points; // 保存所有圆的坐标
```
3. 在CMyView类的OnLButtonDown函数中添加以下代码:
```cpp
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);
}
```
在上面的代码中,我们随机生成圆的半径和颜色,并保存圆的坐标到vector中。然后开始定时器,用来定时重绘界面。
4. 在CMyView类的OnDraw函数中添加以下代码:
```cpp
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i = 0; i < points.size(); i++) {
// 随机生成画刷颜色和大小
COLORREF color = RGB(rand() % 256, rand() % 256, rand() % 256);
int r = rand() % 46 + 5;
// 创建画刷并绘制圆形
CBrush brush;
brush.CreateSolidBrush(color);
pDC->SelectObject(&brush);
pDC->Ellipse(points[i].x - r, points[i].y - r, points[i].x + r, points[i].y + r);
}
// TODO: add draw code for native data here
}
```
在上面的代码中,我们随机生成画刷颜色和大小,并将其保存到vector中。然后每次绘制圆形时,使用对应的画刷。
5. 在CMyView类中添加以下定时器相关的函数:
```cpp
void CMyView::rise()
{
for (int i = 0; i < points.size(); i++)
{
points[i].y -= 5;
if (points[i].y < -r)
{
points.erase(points.begin() + i);
i--;
}
}
}
void CMyView::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1) {
RedrawWindow();
rise();
}
CView::OnTimer(nIDEvent);
}
```
在上面的代码中,我们定义了一个rise函数,用来移动所有圆的坐标。然后在定时器函数OnTimer中调用RedrawWindow函数,重绘界面,并移动所有圆的坐标。定时器的间隔为200ms。
6. 在CMyView类的消息映射中添加以下代码:
```cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()
```
7. 编译并运行程序,单击鼠标左键,可以看到随机生成的圆形,每隔200ms,所有圆形会向上移动,超出窗口范围的圆形将从vector中删除。每次单击出现的圆的大小和颜色都不相同。
阅读全文