易语言如何同时实现无边框时移动窗口及改变窗口大小
QT:如何移动和缩放一个无边框窗口

QT:如何移动和缩放⼀个⽆边框窗⼝⼀个QT窗⼝如下可以做到⽆边框:Window {id: window//Designer 竟然不⽀持..., 设计模式时要注意flags: Qt.FramelessWindowHintwidth: 500height: 300title: "Window Title"}不过要注意, 这样QT Designer不⽀持, 在设计的时候可以先注释掉, 最后在打开.⼀旦设置了FramelessWindowHint, 系统就不管你这个窗⼝的移动和缩放了, 就需要⾃⼰来处理了.那怎么处理哪, ⼤概有以下思路1. 增加⼀个接收拖动事件的组件, 让它跟着⿏标移动2. 增加⼀个缩放锚点, 随着⿏标缩放3. 增加窗⼝四周的⿏标触发区域, 可以随着⿏标向四个⽅向缩放 (此⽂没包括实现) , 可以参考 {:target="_blank"}我们先来看看如果拖动窗⼝, 代码如下:/**头部操作区域.*/Rectangle {id: titleOpRectx: 0y: 0width: parent.widthheight: 30property string title : "Hello Board"MouseArea {id: mouseMoveWindowArea//height: 20anchors.fill: parentacceptedButtons: Qt.LeftButtonproperty point clickPos: "0,0"onPressed: {clickPos = Qt.point(mouse.x, mouse.y)//isMoveWindow = true}onReleased: {//isMoveWindow = false}onPositionChanged: {var delta = Qt.point(mouse.x - clickPos.x, mouse.y - clickPos.y)//如果mainwindow继承⾃QWidget,⽤setPoswindow.setX(window.x + delta.x)window.setY(window.y + delta.y)}}Button {id: closeButtonwidth: 25height: parent.heighttext: "X"anchors.left: parent.leftanchors.leftMargin: 0anchors.bottom: parent.bottomanchors.bottomMargin: 0flat: truefont.bold: truefont.pointSize: 14onClicked: {window.close()}}Text {id: titleTexttext: titleanchors.bottom: parent.bottom//底部留点空间bottomPadding: 5} //end titleTextButton {id: newStrikeButtonwidth: 25height: parent.heighttext: "+"anchors.right: parent.rightanchors.rightMargin: 0anchors.bottom: parent.bottomanchors.bottomMargin: 0flat: truefont.pointSize: 22}Frame {width: titleOpRect.widthheight: 1anchors.bottom: titleOpRect.bottomRectangle {height: parent.heightwidth: parent.widthcolor: "blue"}}}关键代码在MouseArea的onPressed 和 onPositionChanged 事件上. ⽐较容易.我们再来看看如果缩放窗⼝这次我们只是在窗⼝右下⾓放⼀个⼩矩形区域, 来捕获⿏标移动事件, 以实现缩放. /**尾部操作区域.*/Rectangle {id: footOpRectanchors.bottom: parent.bottomwidth: parent.widthheight: 30//resize区域MouseArea {id: resizeanchors {right: parent.rightbottom: parent.bottom}width: 15height: 15cursorShape: Qt.SizeFDiagCursorproperty point clickPos: "1,1"//保持窗⼝左上⾓不动property int oldXproperty int oldYonPressed: {clickPos = Qt.point(mouse.x, mouse.y)//oldWidth = window.width//oldHeight = window.heightoldX = window.xoldY = window.y}onPositionChanged: {var delta = Qt.point(mouse.x - clickPos.x,mouse.y - clickPos.y)var minWidth = 100;var minHeight = 100;//最⼩var newWidth = (window.width + delta.x)<minWidth?minWidth:(window.width + delta.x);//最⼩var newHeight = (window.height + delta.y)<minHeight?minHeight:(window.height + delta.y); window.width = newWidth;window.height = newHeight;window.x = oldXwindow.y = oldY}onReleased: {}Rectangle {id: resizeHintcolor: "red"anchors.fill: resize}}}这段代码⽹上很常见,1. 不过这⾥判断了窗⼝的最⼩⾼度和宽度, 不会导致窗⼝太⼩看不见2. ⿏标移动会导致负数, 所以这⾥也做了判断.3. 保持窗⼝左上⾓不动, 否则⿏标跑来跑去有问题.That's all, Thanks.。
如何实现控件随对话框大小变化而自动调整大小和位置

如何实现控件随对话框大小变化而自动调整大小和位置VC++ 2009-12-28 20:27:42 阅读461 评论0字号:大中小订阅1. 处理对话框的WM_SIZE,然后用MoveWindow或者SetWindowPos来把对话框上面的控件重新调整新位置和大小。
2. 基本的做法就是响应WM_SIZE消息,并按照窗口大小比例来调整控件的位置和大小,控件的大小最好设置成窗口的百分之几,这样的话,就可以根据窗口的大小随时调整了。
3. 每次OnSize 即可获得一个CRect,然后根据这个CRect来确定这些控件的位置和大小,使用函数MoveWindow 或SetWindowpos实现。
4.1)通过下面两个函数获取的是显示屏幕的大小【屏幕的分辨率】(不包括任务栏等区域):int nFullWidth=GetSystemMetrics( SM_CXFULLSCREEN ); //屏幕宽度int nFullHeight=GetSystemMetrics( SM_CYFULLSCREEN ); //屏幕高度2)这两个函数获取的是真正屏幕的大小【屏幕的分辨率】(包括任务栏等区域):int cx = GetSystemMetrics( SM_CXSCREEN );int cy = GetSystemMetrics( SM_CYSCREEN );如:用前两个函数获取的大小可能是1024*687 ,而用下边两个获取的就是1024*768。
5. 在OnSize() 中调用:GetClientRect() 和GetWindowRect() 函数可获取窗口大小,但需注意得到的是设备坐标,如果需要画图什么的还需要转换成逻辑坐标。
6. 字体大小随窗口变化而自动变化,比如说始终使字的高度始终占窗口的1/3。
使用:1). 在Creat中将nHeight设成窗口长度或者宽度的一定比值就行了(最好在onsize函数中设置);2). 使用WM_FONTCHANGE 消息。
易语言组件尺寸问题

易语⾔组件尺⼨问题
通常⼤家说的让控件随窗⼝⼤⼩⽽改变的参考值都是窗⼝宽度、窗⼝⾼度。
这样的参考值是错误的,得的出来
的结果根本就不可⾏。
下⾯我哥⼤家讲下尺⼨问题,⼤家只要仔细看完这章,那是绝对的进步。
在易语⾔窗⼝的⽅法中有两个⽅法相信很多⼈不知道,这两个就是我即将要说的,〈整数型〉对象.取⽤户区宽度()和〈整数型〉对象.取⽤户区⾼度(),返回的都是数值,功能是取⽤户区尺⼨,所谓⽤户区就是
能放置组件的地⽅。
⽽窗⼝⾼度、窗⼝宽度,这些都是包含边框,所以⽤他们做参考就会出现组件超出窗⼝区
域。
下⾯做简单的例⼦,⼤家可以试试效果。
.版本 2
.⼦程序 __启动窗⼝_尺⼨被改变
编辑框1.⾼度= _启动窗⼝.取⽤户区⾼度 ()
编辑框1.宽度= _启动窗⼝.取⽤户区宽度 ()
编辑框1.左边= 0
编辑框1.顶边= 0
这样就搞定了,再也不会让控件⽆端端的被窗⼝吃到了。
C#改变无边框窗体的尺寸大小

C#改变⽆边框窗体的尺⼨⼤⼩以下代码为修改窗体尺⼨的代码:const int HTLEFT= 10;const int HTRIGHT = 11;const int HTTOP = 12;const int HTTOPLEFT = 13;const int HTTOPRIGHT = 14;const int HTBOTTOM = 15;const int HTBOTTOMLEFT = 0x10;const int HTBOTTOMRIGHT = 17;protected override void WndProc(ref Message m){switch (m.Msg){case0x0084:base.WndProc(ref m);Point vPoint = new Point((int)m.LParam & 0xFFFF,(int)m.LParam >> 16 & 0xFFFF);vPoint = PointToClient(vPoint);if (vPoint.X <= 5)if (vPoint.Y <= 5)m.Result = (IntPtr)HTTOPLEFT;else if (vPoint.Y >= ClientSize.Height - 5)m.Result = (IntPtr)HTBOTTOMLEFT;else m.Result = (IntPtr)HTLEFT;else if (vPoint.X >= ClientSize.Width - 5)if (vPoint.Y <= 5)m.Result = (IntPtr)HTTOPRIGHT;else if (vPoint.Y >= ClientSize.Height - 5)m.Result = (IntPtr)HTBOTTOMRIGHT;else m.Result = (IntPtr)HTRIGHT;else if (vPoint.Y <= 5)m.Result = (IntPtr)HTTOP;else if (vPoint.Y >= ClientSize.Height - 5)m.Result = (IntPtr)HTBOTTOM;break;case0x0201://⿏标左键按下的消息//m.Msg = 0x00A1;//更改消息为⾮客户区按下⿏标//m.LParam = IntPtr.Zero;//默认值//m.WParam = new IntPtr(2);//⿏标放在标题栏内 //以下做了⼀些修正,确保放⼤缩⼩按钮区域可以正常使⽤ Point point = Control.MousePosition; point = PointToClient(point); if (point.X < this.Width - 100 && point.Y < 30) { m.Msg = 0x00A1;//更改消息为⾮客户区按下⿏标 m.LParam = IntPtr.Zero;//默认值 m.WParam = new IntPtr(2);//⿏标放在标题栏内 }base.WndProc(ref m);break;default:base.WndProc(ref m);break;}}。
Winform无边框窗体拖动改变大小

Winform拖拽改变无边框窗体大小大家在进行Winform开发过程中,很容易就可以完成一个窗口的布局工作,但现在的软件界面美化效果一个比一个好,很多软件都是无边框的,于是乎,你是不是也感叹:winform的带边框的窗体如此丑陋,我一定要把边框去掉!OK,去掉边框对Winform来说那绝对一件相当easy 的事情,一句this.FormBorderStyle=FormBorderStyle.None就可搞定。
简单倒是简单,边框去掉了,达到了自己的要求,但同时来了很多麻烦,其中一个就是窗口无法拖动改变大小了(这个问题在网上也有解决办法,但是清一色都是调用Win32的API来处理,可是如我这般的新手们对Win32了解甚少,根本不了解其运行原理和机制,所以还是希望用纯托管的代码来解决此问题,今天下午闲着没事,突然来了些“灵感”,尝试了一下,现在解决了,把我的一些想法拿出来和大家分享一下,如有bug,还望大家多多批评指正!好了,啰嗦半天了,不废话,先上图,看看是不是你想要的效果:思想:要拖拽改变窗体大小必须要鼠标按下,同时要知道拖拽方向,主要用到窗体的三个事件:(1)MouseDown:只有在鼠标按下时候,我们才可以拖动边缘改变窗体大小;(2)MouseUp:鼠标弹开以后,将不能改变窗体尺寸;(3)MouseMove:当鼠标处于按下状态时,鼠标移动改变窗体大小。
以下是代码,你可以先建一个项目,复制代码进去,看一下效果://定义一个枚举,表示拖动方向,具体作用看后面public enum MouseDirection{Herizontal,//水平方向拖动,只改变窗体的宽度Vertical,//垂直方向拖动,只改变窗体的高度Declining,//倾斜方向,同时改变窗体的宽度和高度None//不做标志,即不拖动窗体改变大小}//只需新建一个Form窗体即可,在此命名:Form3public partial class Form3 : Form{public Form3(){InitializeComponent();}bool isMouseDown = false; //表示鼠标当前是否处于按下状态,初始值为否MouseDirection direction = MouseDirection.None;//表示拖动的方向,起始为None,表示不拖动private void Form3_MouseDown(object sender, MouseEventArgs e){//鼠标按下isMouseDown = true;}private void Form3_MouseUp(object sender, MouseEventArgs e){// 鼠标弹起,isMouseDown = false;//既然鼠标弹起了,那么就不能再改变窗体尺寸,拖拽方向置Nonedirection = MouseDirection.None;}private void Form3_MouseMove(object sender, MouseEventArgs e){//鼠标移动过程中,坐标时刻在改变//当鼠标移动时横坐标距离窗体右边缘5像素以内且纵坐标距离下边缘也在5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Decliningif (e.Location.X >= this.Width - 5 && e.Location.Y > this.Height - 5){this.Cursor = Cursors.SizeNWSE;direction = MouseDirection.Declining;}//当鼠标移动时横坐标距离窗体右边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Herizontalelse if (e.Location.X >= this.Width - 5){this.Cursor = Cursors.SizeWE;direction = MouseDirection.Herizontal;}//同理当鼠标移动时纵坐标距离窗体下边缘5像素以内时,要将光标变为倾斜的箭头形状,同时拖拽方向direction置为MouseDirection.Verticalelse if (e.Location.Y >= this.Height - 5){this.Cursor = Cursors.SizeNS;direction = MouseDirection.Vertical;}//否则,以外的窗体区域,鼠标星座均为单向箭头(默认)elsethis.Cursor = Cursors.Arrow;//设定好方向后,调用下面方法,改变窗体大小ResizeWindow();}private void ResizeWindow(){//这个判断很重要,只有在鼠标按下时才能拖拽改变窗体大小,如果不作判断,那么鼠标弹起和按下时,窗体都可以改变if (!isMouseDown)return;//MousePosition的参考点是屏幕的左上角,表示鼠标当前相对于屏幕左上角的坐标this.left和this.top的参考点也是屏幕,属性MousePosition是该程序的重点if (direction == MouseDirection.Declining){//此行代码在mousemove事件中已经写过,在此再写一遍,并不多余,一定要写this.Cursor = Cursors.SizeNWSE;//下面是改变窗体宽和高的代码,不明白的可以仔细思考一下this.Width = MousePosition.X - this.Left;this.Height = MousePosition.Y - this.Top;}//以下同理if (direction == MouseDirection.Herizontal){this.Cursor = Cursors.SizeWE;this.Width = MousePosition.X - this.Left;}else if (direction == MouseDirection.Vertical){this.Cursor = Cursors.SizeNS;this.Height = MousePosition.Y - this.Top;}//即使鼠标按下,但是不在窗口右和下边缘,那么也不能改变窗口大小elsethis.Cursor = Cursors.Arrow;}}//参考这个方法,还可以拖拽改变窗体内控件的尺寸,ok,搞定了,你试一下。
易语言如何同时实现无边框时移动窗口及改变窗口大小

添加4个图片框作为窗口的标题栏和边框窗口的四周边框和标题栏可以用图片框来捏造如果你不想别人看见图片框的话可以把图片框的背景颜色弄得和窗口底色一样移动窗口,你可以用:_启动窗口.发送信息 (161, 2, 0)改变窗口大小,你可以用:_启动窗口.发送信息 (274, 61441, 0) ' 可以调整窗口左边的边框_启动窗口.发送信息 (274, 61442, 0) ' 可以调整窗口右边的边框_启动窗口.发送信息 (274, 61443, 0) ' 可以调整窗口上边的边框_启动窗口.发送信息 (274, 61446, 0) ' 可以调整窗口下边的边框_启动窗口.发送信息 (274, 61444, 0) ' 可以同时调整窗口上边和左边的边框_启动窗口.发送信息 (274, 61445, 0) ' 可以同时调整窗口上边和右边的边框_启动窗口.发送信息 (274, 61447, 0) ' 可以同时调整窗口下边和左边的边框_启动窗口.发送信息 (274, 61448, 0) ' 可以同时调整窗口下边和右边的边框用法:举个例子,添加个图片框,名称改为“标题栏”,例如要移动窗口:-------------------------------.子程序 _标题栏_鼠标左键被按下, 逻辑型.参数横向位置, 整数型.参数纵向位置, 整数型.参数功能键状态, 整数型_启动窗口.发送信息 (161, 2, 0)--------------------------------如果要改变窗口大小,我想你也知道该怎么用上面的代码如果在改变窗口大小时,你可以用.版本 2.子程序 __启动窗口_尺寸被改变然后在该子程序里添加尺寸改变后4个图片框的位置应该在哪的代码。
C#WinForm设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框

C#WinForm设置窗⼝⽆边框、窗⼝可移动、窗⼝显⽰在屏幕中央、控件去边框1)窗⼝去除边框在组件属性中FormBorderStyle设为None2)窗⼝随着⿏标移动⽽动添加引⽤using System.Runtime.InteropServices;在初始化控件{InitializeComponent();}代码后添加1 [DllImport("user32.dll")]2public static extern bool ReleaseCapture();3 [DllImport("user32.dll")]4public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);5bool beginMove = false;//初始化⿏标位置6int currentXPosition;7int currentYPosition;8 //获取⿏标按下时的位置9 private void QRCode_MouseDown(object sender, MouseEventArgs e)10 {11if (e.Button == MouseButtons.Left)12 {13 beginMove = true;14 currentXPosition = MousePosition.X;//⿏标的x坐标为当前窗体左上⾓x坐标15 currentYPosition = MousePosition.Y;//⿏标的y坐标为当前窗体左上⾓y坐标16 }17 }18 //获取⿏标移动到的位置19private void QRCode_MouseMove(object sender, MouseEventArgs e)20 {21if (beginMove)22 {23this.Left += MousePosition.X - currentXPosition;//根据⿏标x坐标确定窗体的左边坐标x24this.Top += MousePosition.Y - currentYPosition;//根据⿏标的y坐标窗体的顶部,即Y坐标25 currentXPosition = MousePosition.X;26 currentYPosition = MousePosition.Y;27 }28 }29 //释放⿏标时的位置30private void QRCode_MouseUp(object sender, MouseEventArgs e)31 {32if (e.Button == MouseButtons.Left)33 {34 currentXPosition = 0; //设置初始状态35 currentYPosition = 0;36 beginMove = false;37 }38 }3)窗⼝居中显⽰利⽤C# Form中的StartPosition属性CenterScreen将界⾯显⽰在屏幕中央若是⽤代码实现,显⽰窗体前,应设置此属性,可在调⽤Show()或是ShowDialog()⽅法之前或在窗体构造函数中设置此属性,不要在load()事件中改变此属性,不起作⽤。
无标题栏窗口移动方法种种

无标题栏窗口移动方法种种首先,看看在正常情况下系统是怎样来移动程序窗口的。
当使用者在程序窗口标题栏区域(非工作区)内,按下鼠标左键时将会发生下列事情:◆系统向该窗口过程函数发送WM_NCLBUTTONDOWN消息。
◆WM_NCLBUTTONDOWN消息最终将传送到窗口过程函数中的DefWindowProc()函数中去。
◆DefWindowProc()函数将根据鼠标左键按下并移动,以及HTCAPTION标识所表示鼠标按下时的位置诸多信息,来执行该消息的缺省动作即窗口随同鼠标光标一起移动的操作。
下面作为练习来测试一下,首先在窗口回调函数(即窗口过程函数)中设置下列语句:case WM_NCLBUTTONDOWNreturn 0;然后,同样是在窗口标题栏内按住鼠标左键并移动鼠标,但此时窗口却并不随同鼠标一起移动了,这是怎么回事?这是因为上述语句中设有“return 0”语句的缘故。
该语句使得WM_NCLBUTTONDOWN消息未能传递到DefWindowProc()函数,就在窗口过程函数中提前返回了,当然移动窗口的操作就无从进行了。
这也从反面印证了一个事实,那就是,最后完成移动窗口的操作将是由DefWindowProc()函数来完成的。
通过上面的分析可以勾划出这样一个操作过程:即用户在窗口标题栏内按下鼠标左键→系统发送WM_NCLBUTTONDOWN消息→DefWindowProc()函数接收消息→用户移动鼠标→DefWindowProc()函数执行窗口随同鼠标一起移动的操作。
由此得出一个结论,那就是要想实现移动窗口的操作,必须具备两个条件:一是要按下鼠标左键并移动(DefWindowProc()函数将检测这个条件);二是在按下鼠标左键时能发送WM_NCLBUTTONDOWN消息并返回HTCAPTION标识。
下面就根据以上的分析,在没有窗口标题栏的情况下,采取骗取DefWindowProc()函数的方式,来实现对无标题栏窗口实体的移动操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
添加4个图片框作为窗口的标题栏和边框
窗口的四周边框和标题栏可以用图片框来捏造
如果你不想别人看见图片框的话可以把图片框的背景颜色弄得和窗口底色一样移动窗口,你可以用:
_启动窗口.发送信息 (161, 2, 0)
改变窗口大小,你可以用:
_启动窗口.发送信息 (274, 61441, 0) ' 可以调整窗口左边的边框
_启动窗口.发送信息 (274, 61442, 0) ' 可以调整窗口右边的边框
_启动窗口.发送信息 (274, 61443, 0) ' 可以调整窗口上边的边框
_启动窗口.发送信息 (274, 61446, 0) ' 可以调整窗口下边的边框
_启动窗口.发送信息 (274, 61444, 0) ' 可以同时调整窗口上边和左边的边框_启动窗口.发送信息 (274, 61445, 0) ' 可以同时调整窗口上边和右边的边框_启动窗口.发送信息 (274, 61447, 0) ' 可以同时调整窗口下边和左边的边框_启动窗口.发送信息 (274, 61448, 0) ' 可以同时调整窗口下边和右边的边框
用法:
举个例子,添加个图片框,名称改为“标题栏”,例如要移动窗口:
-------------------------------
.子程序 _标题栏_鼠标左键被按下, 逻辑型
.参数横向位置, 整数型
.参数纵向位置, 整数型
.参数功能键状态, 整数型
_启动窗口.发送信息 (161, 2, 0)
--------------------------------
如果要改变窗口大小,我想你也知道该怎么用上面的代码
如果在改变窗口大小时,你可以用
.版本 2
.子程序 __启动窗口_尺寸被改变
然后在该子程序里添加尺寸改变后4个图片框的位置应该在哪的代码。