1 利用 MFC 的向导,创建基于单文档的应用程序; 2 以窗口下方正中为中心,随机产生不同形状的图形,并按照从小变大,从下 向上的形状,以抛物线轨迹运动,产生礼花效果 3 图形颜色随机,形状不限。 请具体说明实现步骤,并给出具体代码来表示
时间: 2024-03-18 22:40:02 浏览: 51
好的,下面是实现步骤和代码:
1. 创建基于单文档的MFC应用程序。
2. 在资源视图中添加一个位图资源,用于绘制图形。
3. 在文档类中添加一个CArray对象,用于存储图形的属性信息,例如图形的位置、大小、颜色等。
4. 在View类的OnDraw函数中,遍历CArray对象,根据图形属性信息绘制图形。
5. 在View类中添加一个计时器,每隔一定时间触发一次,生成一个新的图形,并将其属性信息加入CArray对象中。
6. 在View类的OnUpdate函数中,更新每个图形的位置,使其沿抛物线轨迹运动。
7. 在View类的OnEraseBkgnd函数中,返回TRUE,防止背景擦除,避免图形闪烁。
下面是主要代码示例:
在Doc类中添加CArray对象:
```C++
class CMyDoc : public CDocument
{
protected:
CArray<ShapeInfo, ShapeInfo&> m_arrShapes; // 存储图形属性信息的CArray
// ...
};
```
在View类中添加计时器:
```C++
class CMyView : public CView
{
protected:
CMyView() {
m_nTimerID = SetTimer(1, 50, NULL); // 每50毫秒触发一次计时器
}
private:
UINT_PTR m_nTimerID; // 计时器ID
// ...
};
```
在View类的OnTimer函数中,生成一个新的图形:
```C++
void CMyView::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == m_nTimerID) {
// 随机生成图形属性信息
ShapeInfo shapeInfo;
shapeInfo.x = rand() % 400 + 50; // x坐标在50到450之间随机
shapeInfo.y = 600; // 初始位置在窗口底部
shapeInfo.width = rand() % 50 + 20; // 宽度在20到70之间随机
shapeInfo.height = rand() % 50 + 20; // 高度在20到70之间随机
shapeInfo.color = RGB(rand() % 256, rand() % 256, rand() % 256); // 颜色随机
// 将图形属性信息加入CArray对象中
((CMyDoc*)GetDocument())->m_arrShapes.Add(shapeInfo);
// 强制刷新视图
Invalidate();
}
CView::OnTimer(nIDEvent);
}
```
在View类的OnUpdate函数中,更新每个图形的位置:
```C++
void CMyView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
// 获取当前时间
DWORD dwTime = GetTickCount();
// 遍历CArray对象,更新每个图形的位置
for (int i = 0; i < ((CMyDoc*)GetDocument())->m_arrShapes.GetCount(); i++) {
ShapeInfo& shapeInfo = ((CMyDoc*)GetDocument())->m_arrShapes[i];
shapeInfo.y = 600 - (dwTime - shapeInfo.startTime) / 10; // 计算当前位置
if (shapeInfo.y < -shapeInfo.height) { // 如果图形已经移出窗口,则从CArray对象中移除
((CMyDoc*)GetDocument())->m_arrShapes.RemoveAt(i);
i--;
}
}
// 强制刷新视图
Invalidate();
}
```
在View类的OnDraw函数中,绘制每个图形:
```C++
void CMyView::OnDraw(CDC* pDC)
{
for (int i = 0; i < ((CMyDoc*)GetDocument())->m_arrShapes.GetCount(); i++) {
ShapeInfo& shapeInfo = ((CMyDoc*)GetDocument())->m_arrShapes[i];
// 绘制图形
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&bmp);
pDC->TransparentBlt(shapeInfo.x - shapeInfo.width / 2, shapeInfo.y - shapeInfo.height, shapeInfo.width, shapeInfo.height, &memDC, 0, 0, shapeInfo.width, shapeInfo.height, SRCCOPY);
// 设置图形起始时间
if (shapeInfo.startTime == 0) {
shapeInfo.startTime = GetTickCount();
}
}
}
```
在View类的OnEraseBkgnd函数中,返回TRUE:
```C++
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
return TRUE; // 防止背景擦除
}
```
以上是大致的实现步骤和代码示例,具体实现可以根据需要进行调整和完善。
阅读全文