易语言如何同时实现无边框时移动窗口及改变窗口大小
QT:如何移动和缩放一个无边框窗口
![QT:如何移动和缩放一个无边框窗口](https://img.taocdn.com/s3/m/680e23d76037ee06eff9aef8941ea76e58fa4a43.png)
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.。
如何实现控件随对话框大小变化而自动调整大小和位置
![如何实现控件随对话框大小变化而自动调整大小和位置](https://img.taocdn.com/s3/m/05f1dc0d844769eae009ed21.png)
如何实现控件随对话框大小变化而自动调整大小和位置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 消息。
易语言组件尺寸问题
![易语言组件尺寸问题](https://img.taocdn.com/s3/m/9f2d3925f011f18583d049649b6648d7c1c708f7.png)
易语⾔组件尺⼨问题
通常⼤家说的让控件随窗⼝⼤⼩⽽改变的参考值都是窗⼝宽度、窗⼝⾼度。
这样的参考值是错误的,得的出来
的结果根本就不可⾏。
下⾯我哥⼤家讲下尺⼨问题,⼤家只要仔细看完这章,那是绝对的进步。
在易语⾔窗⼝的⽅法中有两个⽅法相信很多⼈不知道,这两个就是我即将要说的,〈整数型〉对象.取⽤户区宽度()和〈整数型〉对象.取⽤户区⾼度(),返回的都是数值,功能是取⽤户区尺⼨,所谓⽤户区就是
能放置组件的地⽅。
⽽窗⼝⾼度、窗⼝宽度,这些都是包含边框,所以⽤他们做参考就会出现组件超出窗⼝区
域。
下⾯做简单的例⼦,⼤家可以试试效果。
.版本 2
.⼦程序 __启动窗⼝_尺⼨被改变
编辑框1.⾼度= _启动窗⼝.取⽤户区⾼度 ()
编辑框1.宽度= _启动窗⼝.取⽤户区宽度 ()
编辑框1.左边= 0
编辑框1.顶边= 0
这样就搞定了,再也不会让控件⽆端端的被窗⼝吃到了。
C#改变无边框窗体的尺寸大小
![C#改变无边框窗体的尺寸大小](https://img.taocdn.com/s3/m/0e764c3fb5daa58da0116c175f0e7cd184251834.png)
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无边框窗体拖动改变大小](https://img.taocdn.com/s3/m/b220f3365727a5e9856a6173.png)
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,搞定了,你试一下。
易语言如何同时实现无边框时移动窗口及改变窗口大小
![易语言如何同时实现无边框时移动窗口及改变窗口大小](https://img.taocdn.com/s3/m/7ee7b51eff00bed5b9f31d45.png)
添加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设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框](https://img.taocdn.com/s3/m/2170fc1c4b7302768e9951e79b89680203d86bc9.png)
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()事件中改变此属性,不起作⽤。
无标题栏窗口移动方法种种
![无标题栏窗口移动方法种种](https://img.taocdn.com/s3/m/8621fd9469eae009591bec04.png)
无标题栏窗口移动方法种种首先,看看在正常情况下系统是怎样来移动程序窗口的。
当使用者在程序窗口标题栏区域(非工作区)内,按下鼠标左键时将会发生下列事情:◆系统向该窗口过程函数发送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()函数的方式,来实现对无标题栏窗口实体的移动操作。
易语言窗口操作方法
![易语言窗口操作方法](https://img.taocdn.com/s3/m/80d0b1868ad63186bceb19e8b8f67c1cfad6ee08.png)
易语言窗口操作方法易语言是中国独立开发的一种编程语言,适用于Windows平台。
通过易语言可以实现Windows窗口的创建与操作。
本文将介绍易语言中常用的窗口操作方法,包括创建窗口、设置窗口属性、显示与隐藏窗口、窗口消息处理等。
一、创建窗口在易语言中,可以使用CreateWindow函数创建一个窗口。
CreateWindow函数的参数包括窗口标题、窗口类名、窗口风格、窗口位置和大小等。
下面是一个示例代码:创建窗口公共sHWND=NULLsHWND=CreateWindow("示例窗口","MainWin",样式_系统样式_剧中,200,200,500,300)如果(sHWND<0)提示框("创建窗口失败!","错误",64)结束其中,窗口标题为"示例窗口",窗口类名为"MainWin",窗口风格为样式_系统,窗口位置为(200,200),窗口大小为500x300。
如果创建窗口失败,会弹出一个提示框显示错误信息。
二、设置窗口属性在创建窗口之后,可以使用SetWindow函数设置窗口的属性,例如窗口标题、窗口风格、窗口位置和大小等。
下面是一个示例代码:设置窗口标题(sHWND,"新标题")设置窗口风格(sHWND,样式_最大化)设置窗口位置和大小(sHWND,100,100,600,400)其中,窗口句柄为sHWND,使用SetWindow函数分别设置窗口标题为"新标题",窗口风格为样式_最大化,窗口位置为(100,100),窗口大小为600x400。
三、显示与隐藏窗口在易语言中,可以使用ShowWindow函数来显示或隐藏一个窗口。
ShowWindow函数的参数包括窗口句柄和显示方式。
下面是一个示例代码:ShowWindow(sHWND,显示方式_普通)其中,窗口句柄为sHWND,显示方式为显示方式_普通,表示以普通方式显示窗口。
如何让easyuigridview宽度自适应窗口改变及fitColumns应用
![如何让easyuigridview宽度自适应窗口改变及fitColumns应用](https://img.taocdn.com/s3/m/88389597ed3a87c24028915f804d2b160b4e8619.png)
//在调整了窗口大小以后,设置easyui gridview也调整宽度 $(window).resize(functi('resize'); });
在javascript中任何function在执行的时候都会创建一个执行上下文因为为function声明的变量和function有可能只在该function内部这个上下文在调用function的时候提供了一种简单的方式来创建自由变量或私有子function
如何让 easyuigridview宽度自适应窗口改变及 fitColumns 应用
[QT]无边框窗体改变大小完美实现
![[QT]无边框窗体改变大小完美实现](https://img.taocdn.com/s3/m/31d01c0a6ad97f192279168884868762caaebbba.png)
[QT]⽆边框窗体改变⼤⼩完美实现近期,做项⽬⽤到⽆边框窗体,令⼈蛋疼的是⽆边框窗体⼤⼩的改变要像右边框那样,上下左右四周,⽽且要流畅。
⽹上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来⾃⼰新建了demo,写了⼀个⼩时,问题太多了,扔⼀边先不管了。
今天需要改进UI界⾯,没办法了,重新整理了下思路,没想到做出来了。
下⾯来分享下实现的过程,也许是菜鸟专栏,⾼⼿勿喷~1.⾸先⼤家要了解各九宫格的概念⼀个窗体可以被划分为上、下、左、右、左上、左下、右上、右下、中间,除了中间部分,其他都需要写程序处理。
在程序中定义Padding 为2,并同时定义枚举类型。
#define PADDING 2enum Direction { UP=0, DOWN=1, LEFT, RIGHT, LEFTTOP, LEFTBOTTOM, RIGHTBOTTOM, RIGHTTOP, NONE };2.定义⼀个⽅法,参数为⿏标⽬前的全局位置。
void Dialog::region(const QPoint &cursorGlobalPoint){ // 获取窗体在屏幕上的位置区域,tl为topleft点,rb为rightbottom点QRect rect = this->rect();QPoint tl = mapToGlobal(rect.topLeft());QPoint rb = mapToGlobal(rect.bottomRight());int x = cursorGlobalPoint.x();int y = cursorGlobalPoint.y();if(tl.x() + PADDING >= x && tl.x() <= x && tl.y() + PADDING >= y && tl.y() <= y) {// 左上⾓dir = LEFTTOP;this->setCursor(QCursor(Qt::SizeFDiagCursor)); // 设置⿏标形状} else if(x >= rb.x() - PADDING && x <= rb.x() && y >= rb.y() - PADDING && y <= rb.y()) {// 右下⾓dir = RIGHTBOTTOM;this->setCursor(QCursor(Qt::SizeFDiagCursor));} else if(x <= tl.x() + PADDING && x >= tl.x() && y >= rb.y() - PADDING && y <= rb.y()) {//左下⾓dir = LEFTBOTTOM;this->setCursor(QCursor(Qt::SizeBDiagCursor));} else if(x <= rb.x() && x >= rb.x() - PADDING && y >= tl.y() && y <= tl.y() + PADDING) {// 右上⾓dir = RIGHTTOP;this->setCursor(QCursor(Qt::SizeBDiagCursor));} else if(x <= tl.x() + PADDING && x >= tl.x()) {// 左边dir = LEFT;this->setCursor(QCursor(Qt::SizeHorCursor));} else if( x <= rb.x() && x >= rb.x() - PADDING) {// 右边dir = RIGHT;this->setCursor(QCursor(Qt::SizeHorCursor));}else if(y >= tl.y() && y <= tl.y() + PADDING){// 上边dir = UP;this->setCursor(QCursor(Qt::SizeVerCursor));} else if(y <= rb.y() && y >= rb.y() - PADDING) {// 下边dir = DOWN;this->setCursor(QCursor(Qt::SizeVerCursor));}else {// 默认dir = NONE;this->setCursor(QCursor(Qt::ArrowCursor));}}3.在对话框类中定义⼏个私有成员变量bool isLeftPressDown; // 判断左键是否按下QPoint dragPosition; // 窗⼝移动拖动时需要记住的点Direction dir; // 窗⼝⼤⼩改变时,记录改变⽅向编写对话框构造函数,初始化⼏个变量并做⼀些其他⼯作。
WPF下无边框窗体改变大小和移动
![WPF下无边框窗体改变大小和移动](https://img.taocdn.com/s3/m/b586a40ea4e9856a561252d380eb6294dd8822b2.png)
WPF下无边框窗体改变大小和移动最近一直在学习WPF,看着别人做的WPF程序那么漂亮,眼红啊~很多漂亮的程序都是无边框的。
于是无边框窗口操作就是最重要的了。
无边框窗口的操作一直以来相关的资料就很少。
WPF 下的就更少了,有的大多是无边框窗体的移动。
在得到群里高人的指点,再查了一些资料之后,终于把问题解决了。
废话不多说,直接来看看如何实现吧!其实现原理很简单:拦截并处理 Windows 消息:WM_NCHITTEST。
WPF 处理Windows 消息的模式和WinForm 不一样了。
Window 类里没有 WndProc 函数了,想要截取 Windows 消息必须借助 HwndSource 添加 Hook。
[csharp] view plaincopyprint?1.protected override void OnSourceInitialized(EventArgs e)2.{3.base.OnSourceInitialized(e);4.HwndSource hwndSource = PresentationSource.FromVisu al(this) as HwndSource;5.if (hwndSource != null)6.{7.hwndSource.AddHook(new HwndSourceHook(this.WndPr oc));8.}9.}10.11.protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)12.{13.return IntPtr.Zero;14.}OK,WndProc 注册完成之后就可以通过WndProc 函数完成对Windows消息的处理了。
可以发现,这里的WndProc 和标准的Win32 消息循环很像,只是多了一个 ref bool handled 参数,对于该参数MSDN是这样说明的:指示该消息是否已处理的值。
C#Winform去掉窗体灰色边框,以及实现窗体可拖动边框改变大小
![C#Winform去掉窗体灰色边框,以及实现窗体可拖动边框改变大小](https://img.taocdn.com/s3/m/7713562a59fb770bf78a6529647d27284b73373d.png)
C#Winform去掉窗体灰⾊边框,以及实现窗体可拖动边框改变⼤⼩1)去掉窗体灰⾊边框:在设计窗⼝中,将Form的FormBorderStyle设置为 FixedSingle 。
但是设置后窗⼝⽆法实现拖动边框改变⼤⼩。
需要在Form.cs加⼊以下代码:private const int WM_NCLBUTTONDBLCLK = 163;private const int WM_NCHITTEST = 132;///<summary>///边框改变⼤⼩///</summary>///<param name="m"></param>protected override void WndProc(ref Message m){switch (m.Msg){case WM_NCLBUTTONDBLCLK://WM_NCLBUTTONDBLCLK=163 <0xA3>拦截⿏标⾮客户区左键双击消息,决定窗体是否最⼤化显⽰if (this.MaximizeBox){base.WndProc(ref m);this.Invalidate();}return;case WM_NCHITTEST://WM_NCHITTEST=132 <0x84>base.WndProc(ref m);//如果去掉这⼀⾏代码,窗体将失去MouseMove..等事件//Point lpint = new Point((int)m.LParam);//可以得到⿏标坐标,这样就可以决定怎么处理这个消息了,是移动窗体,还是缩放,以及向哪向的缩放//if (lpint.Y < 30)// m.Result = (IntPtr)0x2;//托动HTCAPTION=2 <0x2>if (WindowState != FormWindowState.Maximized){Point p2 = this.PointToClient(MousePosition);//⿏标相对于窗体的坐标//当然可以托动也可以改变⼤⼩了//label1.Text = p2.X + "," + p2.Y;//HTLEFT=10 <0xA> 左边框if (p2.X < 5 && p2.Y > 5 && p2.Y < this.Height - 5)m.Result = (IntPtr)0xA;else if (p2.Y < 5 && p2.X > 5 && p2.X < this.Width - 5)m.Result = (IntPtr)0xC;//HTTOP=12 <0xC> 上边框else if (p2.X < 5 && p2.Y < 5)m.Result = (IntPtr)0xD;//HTTOPLEFT=13 <0xD>else if (p2.X >= this.Width - 5 && p2.Y < 5)m.Result = (IntPtr)0xE;//HTTOPRIGHT=14 <0xE>else if (p2.X > this.Width - 5 && p2.Y > 5 && p2.Y < this.Height - 5)m.Result = (IntPtr)0xB;//HTRIGHT=11 <0xB>else if (p2.Y >= this.Height - 5 && p2.X > 5 && p2.X < this.Width - 5)m.Result = (IntPtr)0xF;//HTBOTTOM=15 <0xF>else if (p2.X < 5 && p2.Y >= this.Height - 5)m.Result = (IntPtr)0x10;//HTBOTTOMLEFT=16 <0x10>else if (p2.X > this.Width - 5 && p2.Y >= this.Height - 5)m.Result = (IntPtr)0x11;//HTBOTTOMRIGHT=17 <0x11>//HTBORDER=18 <0x12>//HTMINBUTTON=8 <0x8> 最⼩化按钮//HTMAXBUTTON=9 <0x9> 最⼤化按钮//HTCLOSE=20 <0x14> 关闭按钮}return;default:base.WndProc(ref m);return;}}。
movewindow用法
![movewindow用法](https://img.taocdn.com/s3/m/77f77714e3bd960590c69ec3d5bbfd0a7956d505.png)
movewindow用法movewindow用法1. 简介movewindow是一个用于移动窗口的函数,通常在编写Windows 应用程序时使用。
它可以移动一个窗口到新的位置,在多个显示器中进行窗口移动,并可以改变窗口的大小。
2. movewindow函数的语法BOOL MoveWindow(HWND hWnd, // 窗口句柄int X, // 新的左上角x坐标int Y, // 新的左上角y坐标int nWidth, // 新的宽度int nHeight, // 新的高度BOOL bRepaint // 是否重绘窗口);3. 参数说明•hWnd:窗口句柄,指向待移动的窗口。
•X:新的左上角x坐标。
•Y:新的左上角y坐标。
•nWidth:新的宽度。
•nHeight:新的高度。
•bRepaint:是否重绘窗口。
4. 用法示例移动窗口到指定位置MoveWindow(hWnd, 100, 100, nWidth, nHeight, TRUE);该示例将指定的窗口移动到坐标 (100, 100) 的位置,并保持原有的宽度和高度。
设置bRepaint参数为TRUE可以重新绘制窗口,使其显示在新的位置。
在多个显示器中移动窗口HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR _DEFAULTTONEAREST);MONITORINFO monitorInfo = { sizeof(monitorInfo) }; GetMonitorInfo(hMonitor, &monitorInfo);int screenWidth = - ;int screenHeight = - ;MoveWindow(hWnd, screenWidth / 2, screenHeight / 2, nWid th, nHeight, TRUE);该示例代码可以在多个显示器中将窗口移动到屏幕中央。
无边框窗口移动
![无边框窗口移动](https://img.taocdn.com/s3/m/f6b4cb5c3b3567ec102d8afb.png)
第一步://先定义一个坐标点对象 mypointprivate Point mypoint;第二步:在窗体的点击事件中写private void Form1_MouseDown(object sender, MouseEventArgs e) {//鼠标在窗体内按下时,自动记录鼠标的 x y 值,并将它们改为负数mypoint = new Point(-e.X,-e.Y);}第三步:在窗体的鼠标移动事件中写private void Form1_MouseMove(object sender, MouseEventArgs e){/*鼠标在窗体内移动时,首先判断e.Button按下的是哪个鼠标按钮再判断* 是否等于左键按下,MouseButtons.Left这句的意思是鼠标左键按下状态*/if (e.Button == MouseButtons.Left){/*新建一个坐标点对象,它的坐标等于(Control.MousePosition;)* 桌面上坐标的位置*/Point myposition = Control.MousePosition;/*myposition.offset中的Offset是坐标平移的意思,现在将在窗体* 内点击左键时产生的负数加进来,也就等于现在鼠标在桌面上的坐标* 减去鼠标在窗体内的坐标位置,就等于现在窗体的位置*/myposition.Offset(mypoint.X, mypoint.Y);/*this.DesktopLocation这句的意思是获取或设置窗体在桌面上的位置* 它的位置来自myposition*/this.DesktopLocation = myposition;}其实这是个让人说过无数次的内容,但是最近在写一个测试小程序的时候发现了一个问题,今天没什么事做,就做个小的总结。
通过拖动窗体的客户区来移动一个窗体并不是很新鲜的内容,很多的程序都用到了这一点,尤其是一些可以换肤的程序。
改变窗口的尺寸
![改变窗口的尺寸](https://img.taocdn.com/s3/m/1656c007cd7931b765ce0508763231126edb7714.png)
改变窗口的尺寸改变窗口的尺寸当用户装载我的web网页时,我希望所打开窗口的尺寸足够用来显示我的网页内容.我知道怎幺使用windowopen()来创建一个具有一定太小的新窗口.不过我怎幺才能调整其尺寸并移动它以符台我的页面的需要昵?这个问题比较简单.你可使用一系列的JavaScript函数来实现太多数浏览器都会支持这些函数windowresizeBy(dx,dy)和window.resizeTo(x.y)这两个函数可让你调整当前窗口的大小windowmoveBy(cLx,dy)和window.moveTo(x,y糙:两个函数则能让你把当前的窗口移动到不同的屏幕位置.red2eBy函数允许竹用增量方式增加窗El的宽度和高度.或者用负数作参数来减少它们.例如,window.restzeBy(25,一50)会使窗口的宽度增加25十像素,同时窗口高度将会减少5o个像素.下边的表单验证了这几个功能,你可叭通过增量或减量的方式来改变窗口尺寸,或者也可直接指定窗El的尺寸.<formnairle=resi2e》<p><inputtype:buttonon~lick=.vars:"windowresizeBy("+document.resizewidthupbyvalue+,0);II;eval(s);rvalue:0'Clickherel'>&nbsp;toincreasethewidthofthis口ageby&nbsp<inputtype=textname=widthupbyvalue="25Isize=10>&nbsp;pixelsp>《nputtype=buttOiloncHck=vars:I,windowresizeBy(0,"+documentresizeheightuphyvalue+II);I;eval(s);Ivalue:.'Clickhere.>&nbsp;toincreasetheheightofthispageby&nbsp;<inputtype:textname=heightupbyvalue=25Isize=lO>&[1bSp;pixels.<pXinputtype=buttononclick=var8:IIWindow.resizeTo(.+document.resizewidthuptovalue+'I~document.resize heightuptovalue+I'):'l_eval(s);Ivalue:Clickhere'~>&nbsp;to setthewidthofthispageto&nbsp;<inputtype=textname=~ddthuptovalue=1800'Isize=10>&nbsp;pixelsandthel1eightc0<inputtype=textname=heightuptovalue=~'600'size=10>&nbsp;pixels</foiTn>当你按下某个按钮,脚本就会构造出正确的调整窗口太小的JavaScript函数并写人字符串,然后用Javascript的eval0函数来执行字符串中的指夸.Netscape的说明文档及我们的测试表明如果你要把某个窗口的宽度或高度调整到100个像索下,就必须使用有数字签名的脚本并拥有UniversalBrowserWrite权限.在Microsoft InternetExplorer中试验的结果则更为古怪.微软0司的说明文档根本设有提到这样的限制,而我们的测试却发现了前后不一致的结果如果你需要使用这样小的窗口.你必颓仔细试验一下看看是否就是休想要的结果;在JavaScript12中首次出现了所有这些函数,因此在InternetExplorer4.0和NetscapeNavigator40或者更高版本的浏览器都支持这些函数.更早版本的浏览器恐怕已经和T型福特车一样很少有人问津了.不过,为了避免在这些较早版本的谢览器中产生脚本执行错误,你还需要使用一些特殊的技巧. JavaScript可姓利用if语句来检测浏览器是否支持某个函数,如下面的例子所示.假设你的用户运行的是NetscapeNavigator3.0,这种技术可以阻止浏览器去运行moveBy0函数.如果不使用if语句. Netscape30就会产生一个JavaScript错误Javascript对大小写是敏感的,因此你必须正确书写resizeBy,resizeTo和其他函数的大小写还有类似的两个函数可咀实现对当前窗口的滚动window. scrollBy(dx,dy)和windowzerollTo伍,函数分别接受相对像素数和绝对像素数来实现滚动.调整大小和移动类函数同样也接受像素值,但在使用滚动类函数时也许会发生问题=你~P),}OwindowclientX和windowdjentY特性来判断当前窗口的像素坐标,而window.clientHeight和window.clientWidth特性则提供了窗口的高度和宽度.这些与screen. avaiIHeight和SGI'G~navaflWidth(表示屏幕所能容纳的最大高度和宽度)结台起来使用,就可以让体调整窗口的大小或者移动它们例如,你可以通过window.moveTo(0,0)把窗口移到屏幕的左上角.滚动一定像素的工作完成起来要麻烦得多.页面中的内容(或者简单地说就是文字部分)所占用的像素数量会根据用户使用的字体设置和其他一些因素而不同体可队使用窗口的尺寸来一次滚动一页的数据,但这显然比滚动条的功能要局限得多.因此.结论就是滚动类函数不象移动类和调整大小类函数那样有用.隐藏弹出窗口我量近发现有一种弹出式窗口广告可以隐藏在主窗口的后面.这是如何实现的这个效果实现起来相当简单.你所需要的只是一条Javas语句.fccus0~g;y,把一个窗口放到最前面当你打开一个弹出窗口时缺省的操作是将新的窗口放在最前面为了把新的窗口移到后只需要把主窗口推到最前面就行了比如:<script>window.open("/ads/popupegi.);selffocus();</script>注意在self.focus中,self是一个指向当前窗口的标准窗El 对象.口一zo一∞∞山.正_L山z正山_Lz—。
如何让控件随窗口大小自动调整位置和尺寸
![如何让控件随窗口大小自动调整位置和尺寸](https://img.taocdn.com/s3/m/ea278e3131126edb6f1a1036.png)
如何让控件随窗口大小自动调整位置和尺寸/ypxmaomao/blog/item/7294b8809a2833df9023d960.html2009年03月26日星期四15:46最笨的方法大概就是OnSize中按照新旧大小的比例算一下然后MoveWindow我在实际过程中碰见一个问题就是调整Crichedit时出错,后来才知道WM_SIZE执行在WM_CREATE前面. 所以调整Crichedit时要加判断条件if (IsWindow(m_testrich2.GetSafeHwnd())){m_testrich2.MoveWindow(crect,true);}--------------------------最后贴一下我的工程中部分代码-----------------------void CT alkDlg::OnSize(UINT nType, int cx, int cy){CRect crect;crect.left=5;crect.right=cx-117;crect.top=(300*cy)/410+2;//这些按照原先的比例计算出新的大小crect.bottom=cy-30;if (IsWindow(m_testrich.GetSafeHwnd()))//调整输入框{ //m_testrich.ShowWindow(SW_HIDE);m_testrich.MoveWindow(crect,true);}crect.top=5;crect.bottom=(300*cy)/410-24-2;if (IsWindow(m_testrich2.GetSafeHwnd()))//调整显示框{// m_testrich2.ShowWindow(SW_HIDE);m_testrich2.MoveWindow(crect,true);}crect.left=cx-175;crect.top=cy-28;crect.bottom=cy-5;crect.right=cx-117;m_btSend.MoveWindow(crect,true);//调整发送按钮crect.left=cx-175-80;crect.right=cx-117-80;m_close.MoveWindow(crect,true);//调整关闭按钮crect.top=(300*cy)/410-24;crect.bottom=(300*cy)/410;crect.right=cx-117-80+3;m_fstp.MoveWindow(crect,true);//调整发送图片按钮...........略=============================================================== =========方法2,使用别人写的类(我下了,还没用过,有需要的朋友如果下不了,可以留邮箱向我要)/source/1070512使用时,将其中的ControlPos.cpp和ControlPos.h文件引入工程中然后根据以下步骤进行操作:1:在需要处理的对画框的类定义中,定义一个操作对象(别忘了包含头文件ControlPos.h)class CYourDlg: public CDialog{............CControlPos m_cControlPos;}2:在该对话框的OnInitDialog中添加如下代码m_cControlPos.SetParent(this);3:接下来为每个要改变大小、位置的控件进行注册(自己编的词)m_cControlPos.AddControl(IDC_BUTTON1,CP_MOVE_HORIZONTAL) //使控件IDC_BUTTON1根据窗体大小的改变自动水平移动(其他样式见最后的“样式控制表”)4:最后,在该对话框的OnSize事件处理函数中添加如下代码:m_cControlPos.MoveControls();控制样式表:(4种样式可以任意组合)CP_MOVE_VERTICAL //垂直移动CP_MOVE_HORIZONTAL //水平移动CP_RESIZE_HORIZONTAL //改变宽度CP_RESIZE_VERTICAL //改变高度。
- 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个图片框的位置应该在哪的代码。