在vc mfc exe工程内实现基本要求,并说出详细步骤及代码: 在应用程序窗口内,用鼠标点击任意位置,将会以鼠标点击处为圆心,生成一个大小和色彩均是随机的一个圆。当用户不停点击时,会出现满屏大小不一的彩球。 扩展要求: 1.彩色小球出现后,以匀速垂直向上方运动,直到移出窗口上边沿,消失。【30分】 2.添加鼠标追随效果。当按住鼠标左键,在程序窗口中移动时,光标所经之处产生彩球,1~2秒后随即消失
时间: 2024-02-17 21:04:25 浏览: 132
实现基本要求的步骤如下:
1. 创建一个 MFC 对话框应用程序。
2. 在对话框类的头文件中添加以下成员变量和函数声明:
```cpp
private:
CArray<CPoint, CPoint&> m_arrPoints;
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnPaint();
```
3. 在对话框类的源文件中实现以上声明的函数:
```cpp
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
m_arrPoints.Add(point);
Invalidate();
}
void CMyDlg::OnPaint()
{
CPaintDC dc(this);
for (int i = 0; i < m_arrPoints.GetSize(); i++) {
CPoint& pt = m_arrPoints.GetAt(i);
int r = rand() % 50 + 10;
COLORREF color = RGB(rand() % 256, rand() % 256, rand() % 256);
CBrush brush(color);
dc.SelectObject(&brush);
dc.Ellipse(pt.x - r, pt.y - r, pt.x + r, pt.y + r);
}
}
```
4. 编译并运行程序,点击窗口任意位置即可看到随机大小和颜色的圆出现。
实现扩展要求的步骤如下:
1. 在对话框类的头文件中添加以下成员变量和函数声明:
```cpp
private:
CArray<CPoint, CPoint&> m_arrPoints;
CArray<COLORREF, COLORREF&> m_arrColors;
UINT_PTR m_nTimerID;
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
```
2. 在对话框类的构造函数中创建定时器:
```cpp
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MYAPP_DIALOG, pParent)
{
m_nTimerID = SetTimer(1, 50, nullptr);
}
```
3. 在对话框类的 `OnPaint` 函数中,绘制所有彩球:
```cpp
void CMyDlg::OnPaint()
{
CPaintDC dc(this);
for (int i = 0; i < m_arrPoints.GetSize(); i++) {
CPoint& pt = m_arrPoints.GetAt(i);
COLORREF color = m_arrColors.GetAt(i);
int r = rand() % 50 + 10;
CBrush brush(color);
dc.SelectObject(&brush);
dc.Ellipse(pt.x - r, pt.y - r, pt.x + r, pt.y + r);
}
}
```
4. 在对话框类的 `OnTimer` 函数中,让所有彩球向上移动一定距离,并重新绘制所有彩球:
```cpp
void CMyDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == m_nTimerID) {
for (int i = 0; i < m_arrPoints.GetSize(); i++) {
CPoint& pt = m_arrPoints.GetAt(i);
pt.y -= 5;
}
Invalidate();
}
else {
CDialogEx::OnTimer(nIDEvent);
}
}
```
5. 在对话框类的 `OnMouseMove` 函数中,如果鼠标左键按下,则添加一个新点和对应颜色,并在一定时间后从数组中删除该点:
```cpp
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON) {
m_arrPoints.Add(point);
m_arrColors.Add(RGB(rand() % 256, rand() % 256, rand() % 256));
Invalidate();
SetTimer(m_arrPoints.GetSize(), 2000, nullptr);
}
}
```
6. 在对话框类的析构函数中释放定时器和数组:
```cpp
CMyDlg::~CMyDlg()
{
KillTimer(m_nTimerID);
m_arrPoints.RemoveAll();
m_arrColors.RemoveAll();
}
```
7. 编译并运行程序,按住鼠标左键并移动鼠标即可产生彩球,彩球会在一定时间后消失,点击窗口任意位置会出现满屏大小不一的彩球。
阅读全文