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开发入门(九)——简单界面的布局技巧及屏幕适应
嘿嘿嘿,题目比较绕哈.本篇主要讨论一般情况下,页面的布局技巧,怎么将元素的展现尽量做到分辨率无关.基本的思路仍然是尽量少的标定具体的数字,而是用比列来标注各元素占据的空间. 这里我打算用易信的名片页来 ...
随机推荐
- 【洛谷p1258】小车问题
(……吓人,心有余悸) 小车问题[传送门] 洛谷算法标签:: (行吧它居然是个二分[解方程的我抖抖发瑟]) 作为一个写了一页演草纸才解出来的方程,显然我要好好写一写(希望不会半途而废) 思路: 先把其 ...
- bat语法需要注意的地方
if else 格式 if exist C:\Python27 ::空格 ( ::(与if在同一行 ...
- [java]转:String Date Calendar之间的转换
String Date Calendar之间的转换 String Date Calendar 1.Calendar 转化 String Calendar calendat = Calendar.ge ...
- 2017-4-28/PHP实现Redis
谈一谈Redis的数据结构,如果换做PHP,怎么实现?如果再考虑用上LFU或LRU,又该如何实现? Redis的数据结构有String.List.Set.Sorted Set.Hash等,而PHP ...
- 搭建GitLab服务器
前言 每一个开发工作者无非身处2中开发环境:1.开源环境 2.闭源开发环境,若你身处闭源环境或对自己代码安全性要求较高,搭建和使用自己GitLab服务器是必不可少的环节. 可以通过各种方式搭建自己的 ...
- Chargen UDP服务远程拒绝服务攻击漏洞修复教程
一.前置说明 chargen服务最初设计用于测试网络状态,监听19端口(包括TCP和UDP),其中UDP协议存在“Chargen UDP服务远程拒绝服务攻击漏洞”. chargen一般不会使用,所以直 ...
- Windows开启远程桌面服务(Win10)
进入控制面版,找到远程设置 应用确定后Windows服务即会被启动.
- 服务器性能调优(netstat监控大量ESTABLISHED连接与Time_Wait连接问题)
netstat监控大量ESTABLISHED连接与Time_Wait连接问题 问题描述: 在不考虑系统负载.CPU.内存等情况下,netstat监控大量ESTABLISHED连接与Time_Wait连 ...
- Struts 2 初步入门(六)之处理结果类型
Struts2 处理流程: 用户请求--->struts框架--->Action控制器--->struts框架--->视图资源 xml配置文件里: <result nam ...
- elasticsearch设置外部可访问
修改/config/elasticsearch.yml文件,增加如下配置: network.host: 0.0.0.0 浏览器访问http://192.168.17.134:9200/效果: 实际操作 ...