VC语言

本类阅读TOP10

·VC++ 学习笔记(二)
·用Visual C++打造IE浏览器(1)
·每个开发人员现在应该下载的十种必备工具
·教你用VC6做QQ对对碰外挂程序
·Netmsg 局域网聊天程序
·Windows消息大全
·VC++下使用ADO编写数据库程序
·VC++学习笔记(四)
·非法探取密码的原理及其防范
·怎样在VC++中访问、修改注册表

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
续论对无标题栏对话框的拖动方法

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

    对于无标题栏的对话框,用鼠标移动它的简单方法为:对消息WM_NCHITTEST进行处理,然后做鼠标位置的判断,如果鼠标位置在要移动窗口的客户区,则返回为鼠标在标题栏的信号,也就是欺骗windows,让它误认为你在点击标题栏,于是,你就可以正常拖动窗口了。

       具体的函数例子如下:

UINT CTimeWakeDlg::OnNcHitTest(CPoint point)

{

       UINT hit=CDialog::OnNcHitTest(point);

       return ((hit==HTCLIENT)? HTCAPTION:hit);

}

       然而,当我们运行时,我们发现,这种移动方法,电击客户区的任何地方都可以移动整个窗口,可是,在大多数的应用中,我们希望仅仅有部分区域起移动功能的作用。

这样,想到了对参数point的处理,但是,要知道,这里的point不是在当前活动窗口内的坐标,而是整个windows桌面的坐标。要判断鼠标点击到客户区的哪一部分,必须把point对应到当前窗口中。

于是,应用函数GetWindowPlacement得到当前窗口在屏幕上的位置,这样,才能和point进行位置的比较。这个函数的参数类型为WINDOWPLACEMENT结构。原型为

typedef struct tagWINDOWPLACEMENT {     /* wndpl */
    UINT  length;
    UINT  flags;
    UINT  showCmd;
    POINT ptMinPosition;
    POINT ptMaxPosition;
    RECT  rcNormalPosition;
} WINDOWPLACEMENT;

其中,第六个变量rcNormalPosition为窗口正常显示时的位置。这样,就取得了窗口在桌面上的坐标了。通过和point的坐标比较,就会得到正确结果,我们把上面的那个函数修改如下,就会得到只有窗口左上角才能起到拖动作用的函数。

UINT CTimeWakeDlg::OnNcHitTest(CPoint point)

{

       UINT hit=CDialog::OnNcHitTest(point);

       if(hit==HTCLIENT)

       {

              WINDOWPLACEMENT winplace;

              GetWindowPlacement(&winplace);

              int xp=winplace.rcNormalPosition.left;

              int yp=winplace.rcNormalPosition.top;

 

              if((point.x>xp)&&(point.x<xp+10)&&(point.y>yp)&&(point.y<yp+10))

                     return HTCAPTION;

              else

                     return hit;

       }

       else

              return hit;

}

       好了,再在左上角画个图之类的,就更明显漂亮喽 J


相关文章

相关软件