+ -
当前位置:首页 → 问答吧 → mfc setwindowpos()改变按钮的位置?

mfc setwindowpos()改变按钮的位置?

时间:2011-11-25

来源:互联网

我想用setwindowpos实现button按钮移动的功能,就是当我的鼠标移动到按钮上时,我将按钮移动到一个指定的位置。
首先我定义了一个CButton的基类CCongBtn,
画一个按钮。
void CCongBtn::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
CRect largerect;
GetWindowRect(&largerect);
GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL,largerect.left+10,largerect.top+10,0,0,
  SWP_NOZORDER | SWP_NOSIZE);
CButton::OnMouseMove(nFlags, point);
}

为什么不能实现按钮的移动呢

作者: wdchensicong   发布时间: 2011-11-25

不知道为什么……

但如果是我,我可能这么做了:在父窗体的OnMouseMove里判断鼠标位置是不是到了按钮区域里,如果是,调用
GetDlgItem(IDC_BUTTON1)->SetWindowPos(...)

作者: accsoar   发布时间: 2011-11-25

一个CButton的基类CCongBtn

是CCongBtn继承CButton吧。

你移动CCongBtn对吧。你的目前CRect应该是相对于它的父窗口而言的。
GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL,largerect.left+10,largerect.top+10,0,0,
  SWP_NOZORDER | SWP_NOSIZE);
这里差不多
GetParent()->SetWindowPos(NULL,largerect.left+10,largerect.top+10,0,0,
  SWP_NOZORDER | SWP_NOSIZE);

作者: oldmtn   发布时间: 2011-11-25

1:请看MSDN中GetDlgItem的描述
2:SetWindowPos

[in] Specifies the new position of the left side of the window, in client coordinates. 

[in] Specifies the new position of the top of the window, in client coordinates. 

作者: dahaiI0   发布时间: 2011-11-25

C/C++ code
if ((point.x>=m_Rect.left ||point.x <= m_Rect.right) && (point.y>=m_Rect.top ||point.y<=m_Rect.bottom))
    {
        
        GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL,m_Rect.left+rand()%10,m_Rect.top+rand()%10,0,0,
            SWP_NOZORDER | SWP_NOSIZE);
    }


C/C++ code
GetDlgItem(IDC_BUTTON1)->GetClientRect(m_Rect);
    ClientToScreen(m_Rect);

作者: shen_wei   发布时间: 2011-11-25

额,不知道你重绘没得呢? 重绘的时候重绘2个矩形区域就好了,一个当前矩形区域,一个将要移到的另外一个巨型区域!

作者: wangweixu520   发布时间: 2011-11-25

引用 5 楼 wangweixu520 的回复:
额,不知道你重绘没得呢? 重绘的时候重绘2个矩形区域就好了,一个当前矩形区域,一个将要移到的另外一个巨型区域!


我知道这个方法,现在就是想用setwindowpos改变按钮的位置

作者: wdchensicong   发布时间: 2011-11-25

引用 1 楼 accsoar 的回复:
不知道为什么……

但如果是我,我可能这么做了:在父窗体的OnMouseMove里判断鼠标位置是不是到了按钮区域里,如果是,调用
GetDlgItem(IDC_BUTTON1)->SetWindowPos(...)

我判断了,测试的时候,我在函数一开始定义了一个messagebox(),用它来输出一个ok。运行的时候,每次都会弹出这个box,但是程序还是会死。

作者: wdchensicong   发布时间: 2011-11-25

GetDlgItem(IDC_BUTTON1)这个无效。
GetDlgItem的作用是在当前所在的对话框或是父窗口上找到ID为IDC_BUTTON1的子控件,你这段代码写在按钮类当中,它会去找这个按钮上的子控件,而你的按钮窗口上根本就没有子窗口。

作者: wltg2001   发布时间: 2011-11-25

GetDlgItem(IDC_BUTTON1)改成this

作者: dingxz105090   发布时间: 2011-11-25