正文

控件的实时拖动2006-12-07 16:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/21366.html

分享到:

由于一个小项目的需要,必须做控件的拖曳。以前还真没有想过这种问题。先来看看有没有处理消息,比如drag什么的,很遗憾没有。再来看看有没有函数,好像也没有,郁闷。没办法了。只好用绝招,自己做一个派生类把,下面我就以编辑框为例,简单说明一下拖曳的过程。

1。从CEdit派生一个类为CmyEdit。

2。添加左键处理函数:

 void Cmyedit::OnLButtonDown(UINT nFlags, CPoint point)
{
          // TODO: Add your message handler code here and/or call default
  
        pp=point;      // pp是Cmyedit的成员变量
          SetTimer(5,10,NULL);  // 引发定时器
          CEdit::OnLButtonDown(nFlags, point);
}

 

void Cmyedit::OnLButtonUp(UINT nFlags, CPoint point)
{
         // TODO: Add your message handler code here and/or call default
        KillTimer(5);  // 关闭定时器
        CEdit::OnLButtonUp(nFlags, point);
}

 

3。添加定时消息处理:

void Cmyedit::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
 
if(nIDEvent==5){ 

//获得鼠标当前位置,转换为父窗口内的坐标

 CPoint cursor_Pos;
 GetCursorPos(&cursor_Pos);
 GetParent()->ScreenToClient(&cursor_Pos);

//鼠标原来单击位置pp,转换为所在父窗口内的坐标

 CPoint edit_Pos=pp;
 ClientToScreen(&edit_Pos);
 GetParent()->ScreenToClient(&edit_Pos);

// 获得控件的大小,并且转换到父窗口的坐标,主要是为了获得左上角的坐标,方便下面的movewindow调用

 CRect edit_rect;
 GetWindowRect(edit_rect);
 GetParent()->ScreenToClient(&edit_rect);

// 利用向量相等的性质求得鼠标移动后的新左上角坐标

 int x=edit_rect.left+(cursor_Pos.x-edit_Pos.x);
 int y=edit_rect.top+(cursor_Pos.y-edit_Pos.y);
 MoveWindow(x,y,edit_rect.Width(),edit_rect.Height());

 }
CEdit::OnTimer(nIDEvent);

}

 

4.改变鼠标形状

BOOL Cmyedit::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
        // TODO: Add your message handler code here and/or call default

        SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEALL));
        return TRUE;

}

这样就结束了。可以到处用了。符合拖动的要求了。

阅读(3000) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册