按钮移动问题 [英] Problem in button movement

查看:61
本文介绍了按钮移动问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用SetTimer()函数查看按钮的运动,但是问题是这里没有显示运动,这是代码,此代码中的问题是它移动了按钮但不显示按钮''的运动.

void CMoveDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	
		UINT m_tim=SetTimer(1,10000,NULL);
		Move(m_tim);
}
	

void CMoveDlg::Move(UINT m_tim)
{

//ON PLACE OF BUTTON 3	
m_butn1.MoveWindow(30,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(60,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(80,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(100,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(120,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(140,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(220,260,130,60,true);
Sleep(800);
m_butn1.MoveWindow(300,150,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,130,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,125,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,120,130,60,true);
stop(m_tim);
	
}
void CMoveDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	m_butn1.MoveWindow(30,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(60,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(80,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(100,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(120,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(140,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(220,260,130,60,true);
Sleep(800);
m_butn1.MoveWindow(300,150,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,130,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,125,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,120,130,60,true);
stop(nIDEvent);
	CDialog::OnTimer(nIDEvent);
}


  void  CMoveDlg :: stop(UINT m_tim)
{
KillTimer(m_tim);
} 

解决方案

启动计时器后,立即调用Move()函数,该功能可移动按钮,终止计时器并返回.很有可能实际的计时器永远不会触发,因为它在发送第一个计时器事件之前就停止了. OnTimer函数只能将按钮移动单个步骤.这意味着在OnTimer函数中,您将只有一个对MoveWindow的调用(根本没有睡眠).您将需要检查当前按钮的位置并进行更新.一旦您想停止移动按钮,就必须取消计时器.


void CMoveDlg::NewMoveParameters()
{
  m_dx = (rand() % 10) - 4;
  m_dy = (rand() % 10) - 4;
  m_step = 0;
  m_stepMax = rand() % 40 + 40;
}
void CMoveDlg::OnButton1() 
{
  // UINT m_tim, INT m_x, m_y, m_dx, m_dy, m_step, m_stepMax are CMoveDig member vars
  m_x = m_y = 150; // button start position
  NewMoveParameters();	
  m_tim = SetTimer(1, 100, NULL);
}
void CMoveDlg::OnTimer(UINT nIDEvent) 
{
  if ( nIDEvent == m_tim)
  {
    if ( m_step == m_stepMax )
      NewMoveParameters();
    m_x += m_dx;
    m_y += m_dy;
    m_butn1.MoveWindow(m_x, m_y,130,60, true);
    m_step++;
  }
  CDialog::OnTimer(nIDEvent);
}


I have uses SetTimer() function for viewing the movement of buttons but the problem is that it does not show the movement here is the code,what is the problem from this code it moves the button but does not show it''s movement.

void CMoveDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	
		UINT m_tim=SetTimer(1,10000,NULL);
		Move(m_tim);
}
	

void CMoveDlg::Move(UINT m_tim)
{

//ON PLACE OF BUTTON 3	
m_butn1.MoveWindow(30,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(60,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(80,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(100,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(120,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(140,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(220,260,130,60,true);
Sleep(800);
m_butn1.MoveWindow(300,150,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,130,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,125,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,120,130,60,true);
stop(m_tim);
	
}
void CMoveDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	m_butn1.MoveWindow(30,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(60,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(80,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(100,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(120,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(140,10,130,60,true);
Sleep(800);
m_butn1.MoveWindow(220,260,130,60,true);
Sleep(800);
m_butn1.MoveWindow(300,150,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,130,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,125,130,60,true);
Sleep(800);
m_butn1.MoveWindow(320,120,130,60,true);
stop(nIDEvent);
	CDialog::OnTimer(nIDEvent);
}


void CMoveDlg::stop(UINT m_tim)
{
KillTimer(m_tim);
}

解决方案

Immediately after you start your timer you call the Move() function which moves the button around, kills the timer, and returns. Chances are that the actual timer never gets to fire, since it is stopped before the first timer event gets sent.


Instead of putting all the movement code into one block with sleeps in between, the OnTimer function should only move your button for one single step. It means that in the OnTimer function, you will have only one call to MoveWindow (and no sleep at all). You will need to check the current button position and update it. Once you want to stop moving the button, you have to kill the timer.


void CMoveDlg::NewMoveParameters()
{
  m_dx = (rand() % 10) - 4;
  m_dy = (rand() % 10) - 4;
  m_step = 0;
  m_stepMax = rand() % 40 + 40;
}
void CMoveDlg::OnButton1() 
{
  // UINT m_tim, INT m_x, m_y, m_dx, m_dy, m_step, m_stepMax are CMoveDig member vars
  m_x = m_y = 150; // button start position
  NewMoveParameters();	
  m_tim = SetTimer(1, 100, NULL);
}
void CMoveDlg::OnTimer(UINT nIDEvent) 
{
  if ( nIDEvent == m_tim)
  {
    if ( m_step == m_stepMax )
      NewMoveParameters();
    m_x += m_dx;
    m_y += m_dy;
    m_butn1.MoveWindow(m_x, m_y,130,60, true);
    m_step++;
  }
  CDialog::OnTimer(nIDEvent);
}


这篇关于按钮移动问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆