winform 如何屏蔽窗体双击事件

itliyi 2009-08-21 09:38:59
如题
...全文
1140 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
谁伴我闯荡ING 2011-10-27
  • 打赏
  • 举报
回复
B M W 是正解!
顶下!
itliyi 2009-08-21
  • 打赏
  • 举报
回复
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Imaging;
namespace CustomForm
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class CustomForm : System.Windows.Forms.Form
{
public CustomForm()
{
InitializeComponent();
}

Image backBitmap=null;
Form frm2=new Form();
bool isMove=true;
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
public override Image BackgroundImage
{
get
{
return backBitmap;
}
set
{
backBitmap=value;
SetBackground(this.backBitmap);
this.Width=value.Width;
this.Height=value.Height;
}
}

protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if ((int)m.Result == HTCLIENT&&isMove)
m.Result = (IntPtr)HTCAPTION;
return;
break;
}
base.WndProc(ref m);
}

public bool IsMoveForm
{
get
{
return isMove;
}
set
{
isMove=value;
}
}

private void SetBackground(Image img)
{
try
{
Bitmap bitmap = (Bitmap) img;
if (bitmap.PixelFormat != PixelFormat.Format32bppArgb)
{
throw new ApplicationException("图片必须为32位图像");
}
IntPtr hObject = IntPtr.Zero;
IntPtr zero = IntPtr.Zero;
IntPtr hDC = Win32.GetDC(IntPtr.Zero);
IntPtr ptr2 = Win32.CreateCompatibleDC(hDC);
try
{
hObject = bitmap.GetHbitmap(Color.FromArgb(0));
zero = Win32.SelectObject(ptr2, hObject);
Win32.Size size2 = new Win32.Size(bitmap.Width, bitmap.Height);
Win32.Size psize = size2;
Win32.Point point3 = new Win32.Point(0, 0);
Win32.Point pprSrc = point3;
point3 = new Win32.Point(base.Left, base.Top);
Win32.Point pptDst = point3;
Win32.BLENDFUNCTION pblend = new Win32.BLENDFUNCTION();
pblend.BlendOp = 0;
pblend.BlendFlags = 0;
pblend.SourceConstantAlpha = 0xff;
pblend.AlphaFormat = 1;
Win32.UpdateLayeredWindow(this.Handle, hDC, ref pptDst, ref psize, ptr2, ref pprSrc, 0, ref pblend, 2);
}
catch (Exception exception1)
{
Exception exception = exception1;
throw exception;
}
finally
{
Win32.ReleaseDC(IntPtr.Zero, hDC);
if (hObject != IntPtr.Zero)
{
Win32.SelectObject(ptr2, zero);
Win32.DeleteObject(hObject);
}
Win32.DeleteDC(ptr2);
}
}
catch (ApplicationException exception4)
{
ApplicationException exception2 = exception4;
MessageBox.Show(exception2.Message, "请检测你的PNG文件");
}
catch (Exception exception5)
{
Exception exception3 = exception5;
MessageBox.Show(exception3.Message, "无法打开PNG文件.");
}
}

protected override System.Windows.Forms.CreateParams CreateParams
{
get
{
System.Windows.Forms.CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x80000;
return createParams;
}
}

private void CustomForm_Move(object sender, EventArgs e)
{
frm2.Location = this.Location;
}

private void CustomForm_Resize(object sender, EventArgs e)
{
frm2.SetBounds(this.Left, this.Top, this.Width, this.Height);
}

private void CustomForm_ControlAdded(object sender, ControlEventArgs e)
{
frm2.Controls.Add(e.Control);
}

private void InitializeComponent()
{
//
// CustomForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(536, 358);
base.Move+=new EventHandler(CustomForm_Move);
base.Resize+=new EventHandler(CustomForm_Resize);
this.ControlAdded+=new ControlEventHandler(CustomForm_ControlAdded);
base.FormBorderStyle=FormBorderStyle.None;
base.ClientSize = new System.Drawing.Size(560, 446);
//base.StartPosition=FormStartPosition.CenterScreen;

base.ControlBox=false;
frm2.ShowInTaskbar = false;
frm2.TransparencyKey = Color.Red;
frm2.BackColor = Color.Red;
frm2.FormBorderStyle = FormBorderStyle.None;
frm2.ControlBox = false;
//frm2.TopMost=true;
//this.TopMost=true;
frm2.Owner = this;
frm2.Opacity = this.Opacity;
frm2.MaximizeBox = false;
frm2.MouseDoubleClick += new MouseEventHandler(frm2_MouseDoubleClick);
frm2.DoubleClick += new EventHandler(frm2_DoubleClick);

frm2.Closing += new CancelEventHandler(frm2_Closing);
frm2.Show();

}

void frm2_DoubleClick(object sender, EventArgs e)
{
throw new NotImplementedException();
}

void frm2_MouseDoubleClick(object sender, MouseEventArgs e)
{
throw new NotImplementedException();
}

private void frm2_Closing(object sender, CancelEventArgs e)
{
this.Close();
}
}
}


继承的这个窗体类 楼上朋友们说的 不行 呵呵 不过还是谢谢你们
风之影子 2009-08-21
  • 打赏
  • 举报
回复
把窗体的MaxinizeBox和MixinizeBox设为false
itliyi 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 libinguest 的回复:]
引用 6 楼 robin521 的回复:
双击事件为false



有这功能:我怎么不知道


还有楼主"嵌套的窗体"
双击就会移动吗?

你得找出移动的原因.
单点跟踪一下.
[/Quote]
移动 调试找不到啊 莫非要到父窗体调试?
itliyi 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dancingbit 的回复:]
关键在于为什么双击之后你的窗体会移动,默认情况下它会移动吗,这是一个需要额外处理的行为。

如果你指的是双击标题栏后窗体会放大的话,去掉标题栏就是了:form.FormBorderStyle=FormBorderStyle.None;
[/Quote]

不会放大 只会移动到左上角 再点击又移动到远处 前辈指点啊
dancingbit 2009-08-21
  • 打赏
  • 举报
回复
关键在于为什么双击之后你的窗体会移动,默认情况下它会移动吗,这是一个需要额外处理的行为。

如果你指的是双击标题栏后窗体会放大的话,去掉标题栏就是了:form.FormBorderStyle=FormBorderStyle.None;
风之影子 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 robin521 的回复:]
双击事件为false
[/Quote]


有这功能:我怎么不知道


还有楼主"嵌套的窗体"
双击就会移动吗?

你得找出移动的原因.
单点跟踪一下.
robin521 2009-08-21
  • 打赏
  • 举报
回复
双击事件为false
itliyi 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 libinguest 的回复:]
引用 2 楼 itliyi 的回复:
我现在窗体双击就移动 所以我想屏蔽掉



把你窗体的FormBorderStyle改为FixedDialog试试
[/Quote]

我现在是嵌套的窗体
风之影子 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 itliyi 的回复:]
我现在窗体双击就移动 所以我想屏蔽掉

[/Quote]

把你窗体的FormBorderStyle改为FixedDialog试试
yuan1238 2009-08-21
  • 打赏
  • 举报
回复
很简单吧!!把双击事件弄出来,里面写不会出现错误,有不会执行的东西 就OK了,比如写一个不可能的判断句,赋值i=0判断在i==1时出提示框
itliyi 2009-08-21
  • 打赏
  • 举报
回复
我现在窗体双击就移动 所以我想屏蔽掉
风之影子 2009-08-21
  • 打赏
  • 举报
回复
不执行窗体的双击事件就行.

你要做什么呢?
zhantianyou 2009-08-21
  • 打赏
  • 举报
回复
重寫窗體雙擊事件,直接把裏邊的的base.ondoublick()屏掉就行了
pinkle0 2009-08-21
  • 打赏
  • 举报
回复
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if(m.Msg == 0x84 && m.Result == (IntPtr)2) // 不让拖动标题栏
{
m.Result = (IntPtr)1;
}
if (m.Msg == 0xA3) // 双击标题栏无反应
{
m.WParam = System.IntPtr.Zero;
}
}
itliyi 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dancingbit 的回复:]
你为什么要继承这个窗体?这个窗体里面就是如此设计的。
另外写一个窗体吧。
[/Quote]
不会啊 指教 就是png透明效果 图片哪里透明窗体就哪里透明
前辈 急啊。。。
我这个也是网上下的
dancingbit 2009-08-21
  • 打赏
  • 举报
回复
你为什么要继承这个窗体?这个窗体里面就是如此设计的。
另外写一个窗体吧。
itliyi 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zl194 的回复:]
哪有这么复杂,鼠标坏了.换一个就行了.
[/Quote]png透明效果
itliyi 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yuanhuiqiao 的回复:]
Hook函数屏蔽最彻底
[/Quote]能不能详细点?谢谢
yuanhuiqiao 2009-08-21
  • 打赏
  • 举报
回复
Hook函数屏蔽最彻底
加载更多回复(1)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧