无边框窗体的移动和任务栏菜单的实现

简介:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace NetWork
{
public partial class Form2 : Form
{
private const int WM_SETREDRAW = 0x000B;
private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息
private const int WM_NCHITTEST = 0x84;//鼠标在窗体客户区(除了标题栏和边框以外的部分)时发送的消息
private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息

[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong);

[DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
public static extern int GetWindowLong(HandleRef hWnd, int nIndex);

[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

private void MenuShow()
{
int WS_SYSMENU = 0x80000; // 系统菜单
int WS_MINIMIZEBOX = 0x20000; // 最大最小化按钮
int WS_MAXIMIZEBOX = 0x00010000;

int windowLong = (GetWindowLong(new HandleRef(this, this.Handle), -16));
SetWindowLong(new HandleRef(this, this.Handle), -16, (windowLong | WS_SYSMENU | WS_MINIMIZEBOX) & (~WS_MAXIMIZEBOX));
}
public Form2()
{
InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
this.UpdateStyles();
MenuShow();
SendMessage(this.Handle, WM_SETREDRAW, 0, 0);
}

protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST: //如果鼠标移动或单击
base.WndProc(ref m);//调用基类的窗口过程——WndProc方法处理这个消息
if (m.Result == (IntPtr)HTCLIENT)//如果返回的是HTCLIENT
{
m.Result = (IntPtr)HTCAPTION;//把它改为HTCAPTION
return;//直接返回退出方法
}
break;
}
base.WndProc(ref m);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理
}

private void Form2_Load(object sender, EventArgs e)
{
}
}
}

其他窗体直接继承此窗体就ok




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2009/08/18/1549114.html,如需转载请自行联系原作者


目录
打赏
0
0
0
0
46
分享
相关文章
C# 移动窗口 适用于有标题栏和无标题栏窗体 超级简单版
适用于有标题栏和无标题栏窗体,适用于窗体内控件,当然 Form 也不例外,只要能添加 MouseDown、MouseMove 事件,无需添加 MouseUp 事件,也无需考虑 Form 是否有标题栏。 本方法采用 Control.MousePosition,而没有采用 MouseEventArgs e 获取数据,是因为这样无需考虑窗体有无标题栏和边框的大小,也无需考虑是窗体引发事件,还是窗体内控件引发事件。
921 0
|
10月前
[Qt5] 右键窗体弹出菜单,实现图像适应窗体大小
[Qt5] 右键窗体弹出菜单,实现图像适应窗体大小
141 0
Silverlight Rectangle控件鼠标移入时的提示框
  后台的话,直接对这个名为tip的TextBlock赋值即可。
741 0
WebBrowser控件应用:弹出新窗体和关闭窗口
原文:WebBrowser控件应用:弹出新窗体和关闭窗口   缘起:上次写了一个《WebBrowser控件的简单应用2》,提到了在NewWindow事件中打开新窗口的例子。有网友“队长 ”提出那个事件得到的参数是本页面的,而不是新页面的,经过测试,果然url参数不是新页面的。
1399 0
C# winform窗体关闭按钮
添加form的FormClosing事件           ///          /// 主窗口自带的关闭按钮         ///          ///          ///           private void MainForm_FormClosing(object s...
784 0
|
10月前
循环滑动的工具条
循环滑动的工具条
48 0
任务栏自动隐藏和鼠标划过显示
操作如下:任务栏---右键----属性---自动隐藏任务栏打勾。当鼠标划过屏幕下方时就会出面任务栏,没经过时就隐藏了。
847 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等