| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2178 人关注过本帖
标题:求解一个学习WM_TIMER与WM_PAINT消息实例程序
只看楼主 加入收藏
kelehai
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-10-31
结帖率:0
收藏
 问题点数:0 回复次数:6 
求解一个学习WM_TIMER与WM_PAINT消息实例程序

题目要求:
运行平台:VC++6.0

创建一个基于对话框的程序,有三个按钮:Exit,Draw Graphics和Stop.其它为空.
当单击Draw Graphics时,应用程序不断地以不同的半径去绘制圆:首先圆半径不断增大,到达最大后双连续减少;在圆半径减小到某一程度后,又从头执行以上过程.
当单击Stop时,圆半径停止变化;
单击Exit按钮将退出应用程序.

=============================
首先我新建一个叫MyMessage的exe应用程序,选择基于对话框,其它默认.进入设计:

1) 按题目要求设计窗口:去掉两个不合要求的按钮--OK和Cancel.还有一个显示为TODO:~~的静态文本.新添三个按钮,其ID和Caption分别为:
IDC_EXIT_BUTTON Exit
IDC_DRAW_BUTTON Draw Graphics
IDC_STOP_BUTTON Stop

2)然后为Exit添加单击消息的代码:
viod CMymessageDlg::OnExitButton()
{
OnOK();
}

3)安装Timer。在CMymessageDlg::OnInitDialog()函数中"//TODO..."后面添加如下代码
int install;
install = SetTimer(1,250,NULL);
if(install == 0) MessageBox("Can not install timer!");
m_radius = 50;
m_direction = 1;
m_bclick = false;
return TRUE;
}
其中m_radius m_direction m_bclick在头文件MymessageDlg.h中定义如下:
int m_radius;
int m_direction;
BOOL m_bclick;

4)程序结束后清除Timer,在CMymassageDlg::OnDestroy()函数的TODO后添加如下代码:
KillTimer(1);

5)为DrawGraphics和Stop添加代码:
void CMymessageDlg::OnDrawButton()
{
m_bclick = true;
}

Void CMymessageDlg::OnStopButton()
{
m_bclick = false;
}

6)随着时间的变化要求半径变化,故为OnTimer()添加如下函数
void CMymessageDlg::OnTimer(UINT nlDEvent)
{
if (m_bclick)
{
m_radius += m_direction;
if (m_radius>=100) m_direction = -1;
if (m_radius<=10) m_direction = 1;
Invalidate();
}
CDialog::OnTimer(nIDEvent);
}

接着就是要写画圆的代码了,但我不知道应该怎么写,在哪里写,请高手指点一下。谢谢。

D3MWsQso.rar (24.94 KB) 求解一个学习WM_TIMER与WM_PAINT消息实例程序


搜索更多相关主题的帖子: PAINT TIMER 实例 单击 
2006-03-16 22:14
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 

void CMyMassageDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CBrush *pb, brush(RGB(0, 255, 0));

pb = dc.SelectObject(&brush);
dc.Ellipse(200-m_radius, 100-m_radius, 200+m_radius, 100+m_radius);
dc.SelectObject(pb);

}
}


http://myajax95./
2006-03-18 07:52
zinking
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:35
帖 子:916
专家分:0
注 册:2004-12-5
收藏
得分:0 
应该在ontimer()里做这件事情吧

http://kongfuziandlife. http://codeanddesign.
2006-03-18 16:38
xjc
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2004-12-2
收藏
得分:0 
2 楼的方法同样能实现

时间是最宝贵的
2006-03-18 17:17
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用zinking在2006-3-18 16:38:00的发言:
应该在ontimer()里做这件事情吧

画图不仅是在OnTimer时需要,当窗口缩小或被其他窗口遮盖住的时候也需要,所以画图的部份只能写在OnPaint()中,OnTimer()只作些加加减减的工作,OnPaint()不管是Timer激活的还是任何其他原因只管画图。


http://myajax95./
2006-03-19 01:11
kelehai
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-10-31
收藏
得分:0 
谢谢各位的指点
其实早在几天前就把程序写好了.
只是在颜色设置时我想让它把所有颜色都显示一遍
可能是计算时写得不好,
总是有一部分颜色无法出现.
我的程序如下:
ANTSNMDo.rar (5.17 KB) 求解一个学习WM_TIMER与WM_PAINT消息实例程序




of6WQri9.rar (26.34 KB) 求解一个学习WM_TIMER与WM_PAINT消息实例程序

2006-03-20 10:33
windywany
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-3-22
收藏
得分:0 
清华的一本叫WINDOWS C 程序设计入门与提高 有详细的说明
2006-03-22 20:33
快速回复:求解一个学习WM_TIMER与WM_PAINT消息实例程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019101 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved