C#窗体布局技巧
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace QQFrm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region 公共变量
IntPtr Tem_Handle;//获取控件及窗体的句柄
Point CPoint;//获取控件中鼠标的坐标
static int Tem_place = 0;
int Frm_Height = 0;
int FrmHeight = 0;
#endregion
#region API声明
//获取当前鼠标下可视化控件的句柄
[DllImport("user32.dll")]
public static extern int WindowFromPoint(int xPoint, int yPoint);
//获取指定句柄的父级句柄
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);
//获取屏幕的大小
[DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
private static extern int GetSystemMetrics(int mVal);
#endregion
#region 获取当前鼠标下可视化控件的句柄
/// <summary>
/// 获取当前鼠标下可视化控件的句柄
/// </summary>
/// <param x="int">当前鼠标的X坐标</param>
/// <param y="int">当前鼠标的Y坐标</param>
public IntPtr FormNameAt(int x, int y)
{
IntPtr Tem_hWnd;//设置存储句柄的变量
Tem_Handle = (IntPtr)(WindowFromPoint(x, y));//获取当前鼠标下可视化控件的句柄
Tem_hWnd = Tem_Handle;//记录原始句柄
while (Tem_hWnd != ((IntPtr)0))//遍历该句柄的父级句柄
{
Tem_Handle = Tem_hWnd;//记录当前句柄
Tem_hWnd = GetParent(Tem_hWnd);//获取父级句柄
}
return Tem_Handle;//返回最底层的父级句柄
}
#endregion
private void timer1_Tick(object sender, EventArgs e)
{
if (this.Top < 3 && Tem_place==0)//如果窗体被移到屏幕的顶部
{
if (this.Handle == FormNameAt(Cursor.Position.X, Cursor.Position.Y))//当鼠标移致到该窗体上
{
panel_Title.Tag = 1;//设置标识,用于判断窗体在屏幕顶部
timer2.Enabled = false;//不对窗体进行拉伸操作
this.Top = 0;//使窗体致顶
}
else
{
panel_Title.Tag = 1;//设置标识,用于判断窗体在屏幕顶部
timer2.Enabled = true;//将窗体在顶部进行隐藏
}
}
else
{
if (this.Left < 3 || this.Right > GetSystemMetrics(0) - 3)//如果窗体被移到屏幕的左端或右端
{
if (this.Left < 3)//如果窗体被移到屏幕的左端
{
if (this.Handle == FormNameAt(Cursor.Position.X, Cursor.Position.Y))//当鼠标移致到该窗体上
{
panel_Title.Tag = 2;//设置标识,用于判断窗体在屏幕左端
timer2.Enabled = false;
Frm_Height = this.Height;
this.Left = 0;//使窗体致左
this.Top = 0;
this.Height = Screen.AllScreens[0].Bounds.Height;
Tem_place = 1;
}
else
{
panel_Title.Tag = 2;
timer2.Enabled = true;//将窗体在左端进行隐藏
}
}
if (this.Right > GetSystemMetrics(0) - 3)//如果窗体被移到屏幕的右端
{
if (this.Handle == FormNameAt(Cursor.Position.X, Cursor.Position.Y))//当鼠标移致到该窗体上
{
panel_Title.Tag = 3;//设置标识,用于判断窗体在屏幕右端
timer2.Enabled = false;
Frm_Height = this.Height;
this.Left = GetSystemMetrics(0) - this.Width;//使窗体致右
this.Top = 0;
this.Height = Screen.AllScreens[0].Bounds.Height;
Tem_place = 1;
}
else
{
panel_Title.Tag = 3;
timer2.Enabled = true;//将窗体在右端进行隐藏
}
}
}
}
}
private void timer2_Tick(object sender, EventArgs e)
{
switch (Convert.ToInt16(panel_Title.Tag.ToString()))//对标识进行判断
{
case 1://顶端隐藏
{
if (this.Top < 5)
this.Top = -(this.Height - 2);
break;
}
case 2://左端隐藏
{
if (this.Left < 5)
this.Left = -(this.Width - 2);
break;
}
case 3://右端隐藏
{
if ((this.Left + this.Width) > (GetSystemMetrics(0) - 5))
this.Left = GetSystemMetrics(0) - 2;
break;
}
}
}
private void panel1_Click(object sender, EventArgs e)
{
this.Close();
}
#region 利用窗体上的控件移动窗体
/// <summary>
/// 利用控件移动窗体
/// </summary>
/// <param Frm="Form">窗体</param>
/// <param e="MouseEventArgs">控件的移动事件</param>
public void FrmMove(Form Frm, MouseEventArgs e) //Form或MouseEventArgs添加命名空间using System.Windows.Forms;
{
if (e.Button == MouseButtons.Left)
{
Point myPosittion = Control.MousePosition;//获取当前鼠标的屏幕坐标
myPosittion.Offset(CPoint.X, CPoint.Y);//重载当前鼠标的位置
Frm.DesktopLocation = myPosittion;//设置当前窗体在屏幕上的位置
Tem_place = 0;
this.Height = FrmHeight;
}
}
#endregion
private void panel_Title_MouseDown(object sender, MouseEventArgs e)
{
timer1.Enabled = false;
CPoint = new Point(-e.X, -e.Y);
}
private void panel_Title_MouseMove(object sender, MouseEventArgs e)
{
FrmMove(this, e);
}
private void panel_Title_MouseUp(object sender, MouseEventArgs e)
{
timer1.Enabled = true;
}
private void Form1_Load(object sender, EventArgs e)
{
Frm_Height = this.Height;
FrmHeight = this.Height;
this.TopMost = true;
}
}
}
C#窗体布局技巧的更多相关文章
- Android学习笔记之布局技巧以及布局中的细节介绍....
PS:休息两天,放一放手上的东西,做做总结... 学习内容: 1.Android中LinearLayout布局技巧... 2.layout中drawable属性的区别... 先简单的介绍一下dra ...
- DIV+CSS常用网页布局技巧!
以下是我整理的DIV+CSS常用网页布局技巧,仅供学习与参考! 第一种布局:左边固定宽度,右边自适应宽度 HTML Markup <div id="left">Left ...
- 总结与学习DIV+CSS网页布局技巧
以前用表格布局时设置网页居中非常方便,把表格对齐方式设置为居中就行了,就这么简单,现在呢,用DIV+CSS样式表控制,好像不是那么容易了,其实也很简单,只不过方式不同而已. <style> ...
- 移动平台3G手机网站前端开发布局技巧
本文转载至:移动平台3G手机网站前端开发布局技巧汇总 - 前端开发-武方博 您或许正在或准备参与一个WepApp项目,您或许正在Google搜索mobile development相 关的文章,您或许 ...
- pyqt5 窗体布局
窗体布局 1使用qtdesigner新建一个对话框,然后拖放几个按钮和文本框,按钮使用水平布局,效果如下: 鼠标选中水平布局再选中文本框,进行垂直布局,如下: 垂直布局后的效果如下: 然后,如何让窗体 ...
- 移动平台3G手机网站前端开发布局技巧汇总
移动平台3G手机网站前端开发布局技巧汇总 作者:前端开发-武方博 发布:2011-05-10 09:11 分类:移动开发 阅读:120,618 views 7条评论 您或许正在 ...
- C#入门经典(2-重置窗体布局,界面介绍,错误列表)
- CSS之定位布局(position,定位布局技巧)
css之定位 1.什么是定位:css中的position属性,position有四个值:absolute/relative/fixed/static(绝对/相对/固定/静态(默认))通过定位属性可以设 ...
- UWP开发入门(九)——简单界面的布局技巧及屏幕适应
嘿嘿嘿,题目比较绕哈.本篇主要讨论一般情况下,页面的布局技巧,怎么将元素的展现尽量做到分辨率无关.基本的思路仍然是尽量少的标定具体的数字,而是用比列来标注各元素占据的空间. 这里我打算用易信的名片页来 ...
随机推荐
- CentOS7 搭建LVS+keepalived负载均衡
1.实验环境 4台节点 Keepalived1 + lvs1(Director1):192.168.31.4 Keepalived2 + lvs2(Director2):192.168.31.3 Re ...
- 【其他】【Restful】【1】简单了解Restful概念
内容: REST是一种设计风格,不是一种标准,是一种思想.符合REST原则的架构方式即可称为RESTful. 在Restful之前的操作:http://127.0.0.1/user/query/1 G ...
- 把url链接转换成二维码的工具类
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io ...
- for + setTimeout
一.背景 最近在翻看以前的老书<node.js开发指南>,恰好碰到 for 循环 + setTimeout 的经典例子,于是重新梳理了思路并记录下. 二.写在前面,setTimeout 和 ...
- swf 上传
推荐这个博客:http://blog.csdn.net/hi_kevin/article/details/23430345 这个文章很不错,我推荐这个文章:http://leeon.me/upload ...
- 剑指offer-调整数组内奇偶数顺序
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 解题思路 时间换 ...
- 使用INTERSECT运算符
显示符合以下条件的雇员的雇员ID 和职务ID:这些雇员的当前职务与以前的职务相同,也就是说这些雇员曾担任过别的职务,但现在又重新担任了以前的同一职务. hr@TEST0924> SELECT e ...
- Jmeter的使用简介及实例
一.安装及配置环境1.安装 java环境 该软件需要java环境,安装jdk,在百度自行查找安装 环境变量配置:变量名JAVA_HOME 值:jdk的安装路径 ...
- 八、持久层框架(MyBatis)
一.基于MyBatis的CRUD 1.首先是配置文件Category.xml修改 一次性修改配置文件Category.xml,提供CRUD对应的sql语句. <?xml version=&quo ...
- this 锁与 static 锁
一. this 锁 同步函数其实用到的锁就是 this 锁,为什么他用到的是 this 锁呢?为了证实这个结论我 们本节将会有两个实验性的程序来作为支撑,说服自己和读者证明同步函数用到的就是 this ...