在C Builder中,将Form的BorderStyle设为bsNone以后该窗体将没有边框,不能改变窗体大小,也不能拖动窗体。那么如何拖动及用鼠标改变无边框窗体大小呢?拖动无边框窗体的解决方法很多,例如:
文章整理:西部数码--专业提供域名注册、虚拟主机服务
1. 向窗体发送WM_NCLBUTTONDOWN消息,LParam = HTCAPTION
2. 向窗体发送WM_SYSCOMMAND消息,LParam = SC_MOVE | HTCAPTION;
3. 截获WM_NCHITTEST消息,返回HTCAPTION让系统认为鼠标正在标题栏上
等等。更改窗体大小能够用API:SetWindowPos,那么用拖动鼠标来改变无边框窗体大小呢?答案还是WM_NCHITTEST。
在Windows系统中任何鼠标消息都要靠WM_NCHITTEST来建立,任何鼠标动作都会触发WM_NCHITTEST,触发次数和鼠标驱动程式每秒钟派发多少消息有关。以下代码是在程式中截获WM_NCHITTEST,ccrun(老妖)用C Builder的方法实现的,通过重载WndProc来截获窗体消息,当然,还能够通过消息映射或接管WindowProc等来实现。另外特别说明的是:麻烦抄袭本站文章不爱留名的人不要搞错了,这不是纯C 的方法,请不要在抄袭的文章中用类似“C 中如何拖动无边框窗口”这样的标题来误导别人。类似的事情发生的太多了,顺便BS一下天极网抄袭不但不留原作者名字还篡改作者名字连同代码中的版权注释。
本代码应用在Delphi中的话,将语法略改变一下就能够了。
在单元文档的.h文档中加入:
private: // User declarations
void __fastcall WndProc(TMessage &Msg);
在单元文档的.cpp文档中加入:
// 重载窗体的WndProc实现截获窗体消息
void __fastcall TForm1::WndProc(TMessage &Msg)
{
switch(Msg.Msg)
{
case WM_NCHITTEST: //
{
// 分解当前鼠标的坐标
int nPosX = LOWORD(Msg.LParam);
int nPosY = HIWORD(Msg.LParam);
if(nPosX >= Left Width - 2 && nPosY >= Top Height - 2)
// 本文转自 C Builder 研究 - http://www.ccrun.com/article.asp?i=990&d=70jx1b
{
// 鼠标位置在窗体的右下角附近
Msg.Result = HTBOTTOMRIGHT;
return;
}
else if(nPosX >= Left Width -2)
{
// 鼠标位置在窗体右侧
Msg.Result = HTRIGHT;
return;
}
else if(nPosY >= Top Height - 2)
{
// 鼠标位置在窗体下方
Msg.Result = HTBOTTOM;
return;
}
// 以上只判断鼠标位置是否在右侧,右下角,下方,所以仅仅当鼠标指针在这三个位置时才会改变成改变大小的形状,拖动后可改变大小。
break;
}
default:
break;
}
TForm::WndProc(Msg);
}
效果如图,为了方便大家看的清楚一些,ccrun(老妖)在窗体上放了一个Align=alClient的TShape,边框黑色,背景灰色。

假如程式中有多个窗体都是无边框风格,但都想用鼠标拖动来改变窗体大小的话,建议new一个窗体,设成无边框,截获WM_NCHITTEST消息实现可鼠标拖动大小,然后其他的窗体统一从这个窗体继承就能够了。不必在每个窗体中都重载WndProc,那样效率太低了。这样的设计方法能够延伸到其他方面,比如窗体控件的自绘,在父窗体中将代码写好,然后继承就是了。
附录:
/*
* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
*/
#define HTERROR (-2)
#define HTTRANSPARENT (-1)
#define HTNOWHERE 0
#define HTCLIENT 1
#define HTCAPTION 2
#define HTSYSMENU 3
#define HTGROWBOX 4
#define HTSIZE HTGROWBOX
#define HTMENU 5
#define HTHSCROLL 6
#define HTVSCROLL 7
#define HTMINBUTTON 8
#define HTMAXBUTTON 9
#define HTLEFT 10
#define HTRIGHT 11
#define HTTOP 12
#define HTTOPLEFT 13
#define HTTOPRIGHT 14
#define HTBOTTOM 15
#define HTBOTTOMLEFT 16
#define HTBOTTOMRIGHT 17
#define HTBORDER 18
#define HTREDUCE HTMINBUTTON
#define HTZOOM HTMAXBUTTON
#define HTSIZEFIRST HTLEFT
#define HTSIZELAST HTBOTTOMRIGHT
#if(WINVER >= 0x0400)
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
如何通过鼠标拖动改变无边框窗体的大小
来源:互联网
作者:west263.com
时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
热点关注
- C 的面试题哦~
- hd7279键盘显示芯片c51代
- C语言的常用库函数使用方
- 什么是迭代跟递归算法?
- c#中父窗口和子窗口之间
- c#结合串口通信类实现串
- c#利用正则表达式实现字
- 用visual c#中轻松浏览
- C语言的常用库函数使用方
- C语言面试题大汇总之华为
- c#.net网络程式研发-sock
- c#实现smtp服务器,使用t
- C语言图像处理
- 如何自画ListView的Item(
- Linux下C语言编程基础知
- C 中对浮点数的格式化显
- 用c#实现由15位身份证号
- Windows Mobile 研发常见
- 在Visual C 中使用fopen
- Linux on POWER 中的 GNU
- uC/OS-II在ARM系统上的移
- C 嵌入式系统中应用
- C/C 中动态链接库的创建
- 关于c#中的datetime类型
- 用c#实现智能设备上的not
- C 中的指针(三) 智能指
- ASP.NET中使用TreeView控
- 使用c#创建sql server的
- C 中的动态多维数组
- c# enum设计和使用的相关
- Visual C /MFC入门教程
- 获取WinNT/Win2k当前用户
- 实现ComboBox输入文字的
- excel 2007单元格及内容
- C语言经典100例(一)
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD



