正文

控件的实时拖动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;} 这样就结束了。可以到处用了。符合拖动的要求了。

阅读(3286) | 评论(1)


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

评论

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