winform 无边框 窗体基本功能 拖动和系统右键菜单冲突

问题描述

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingRightMenuItem;namespaceClientFrom{publicpartialclassForm12:Form{privateconstintWM_SYSCOMMAND=0x0112;//点击窗口左上角那个图标时的系统信息privateconstintWM_NCHITTEST=0x0084;privateconstintWM_NCMBUTTONDOWN=0x00A7;privateconstintWS_SYSMENU=0x00080000;//系统菜单privateconstintWS_MINIMIZEBOX=0x20000;//最大最小化按钮privateconstintSC_MAXIMIZE=0xF030;//最大化信息privateconstintSC_MINIMIZE=0xF020;//最小化信息privateconstintGWL_WNDPROC=-4;privatestaticintLEFT=2,RIGHT=2,BOTTOM=2,TOP=2,TITLE_WIDTH=16;//边框和标题栏的大小privateintm_BorderWidth=4;privateintm_CaptionHeight=22;[DllImport("user32.dll",EntryPoint="GetWindowLong",CharSet=CharSet.Auto)]publicstaticexternintGetWindowLong(HandleRefhWnd,intnIndex);[DllImport("user32.dll",EntryPoint="SetWindowLong",CharSet=CharSet.Auto)]publicstaticexternIntPtrSetWindowLong(HandleRefhWnd,intnIndex,intdwNewLong);[DllImport("user32.dll")]privatestaticexternintGetSystemMenu(inthwnd,intbRevert);[DllImport("user32.dll")]privatestaticexternintAppendMenu(inthMenu,intFlagsw,intIDNewItem,stringlpNewItem);publicForm12(){InitializeComponent();//SetWindowLong(newHandleRef(this,this.Handle),-16,GetWindowLong(newHandleRef(this,this.Handle),-16)|WS_SYSMENU);//这里加上这段后下面的caseWM_NCHITTEST:就没反应了请问这儿怎么写}#regionWndProcprotectedoverridevoidWndProc(refMessagem){base.WndProc(refm);HandleRefhr=newHandleRef(this,m.HWnd);switch(m.Msg){caseWM_SYSCOMMAND:if(m.WParam==(IntPtr)SC_MAXIMIZE){m.WParam=(IntPtr)SC_MINIMIZE;}break;caseWM_NCHITTEST:if(m.Result==(IntPtr)HitTest.HTCLIENT){m.HWnd=this.Handle;Rectanglerect=this.Bounds;PointvPoint=newPoint((int)m.LParam&0xFFFF,(int)m.LParam>>16&0xFFFF);vPoint=PointToClient(vPoint);if(vPoint.X<=LEFT){if(vPoint.Y<=TOP){m.Result=(IntPtr)HitTest.HTTOPLEFT;}elseif(vPoint.Y>=ClientSize.Height-BOTTOM){m.Result=(IntPtr)HitTest.HTBOTTOMLEFT;}else{m.Result=(IntPtr)HitTest.HTLEFT;}}elseif(vPoint.X>=ClientSize.Width-RIGHT){if(vPoint.Y<=TOP){m.Result=(IntPtr)HitTest.HTTOPRIGHT;}elseif(vPoint.Y>=ClientSize.Height-BOTTOM){m.Result=(IntPtr)HitTest.HTBOTTOMRIGHT;}else{m.Result=(IntPtr)HitTest.HTRIGHT;}}elseif(vPoint.Y<=TOP){m.Result=(IntPtr)HitTest.HTTOP;}elseif(vPoint.Y>=ClientSize.Height-BOTTOM){m.Result=(IntPtr)HitTest.HTBOTTOM;}elseif(vPoint.Y>TITLE_WIDTH){m.Result=(IntPtr)HitTest.HTCAPTION;}}break;}}#endregion///<summary>///枚举鼠标拖动///</summary>publicenumHitTest:int{HTERROR=-2,HTTRANSPARENT=-1,HTNOWHERE=0,HTCLIENT=1,HTCAPTION=2,HTSYSMENU=3,HTGROWBOX=4,HTSIZE=HTGROWBOX,HTMENU=5,HTHSCROLL=6,HTVSCROLL=7,HTMINBUTTON=8,HTMAXBUTTON=9,HTLEFT=10,HTRIGHT=11,HTTOP=12,HTTOPLEFT=13,HTTOPRIGHT=14,HTBOTTOM=15,HTBOTTOMLEFT=16,HTBOTTOMRIGHT=17,HTBORDER=18,HTREDUCE=HTMINBUTTON,HTZOOM=HTMAXBUTTON,HTSIZEFIRST=HTLEFT,HTSIZELAST=HTBOTTOMRIGHT,HTOBJECT=19,HTCLOSE=20,HTHELP=21}}}

解决方案

解决方案二:
哎,粘了这么长的代码,不知道什么意思~!接分
解决方案三:
代码有点长了!你加点描述就好了!
解决方案四:
//SetWindowLong(newHandleRef(this,this.Handle),-16,GetWindowLong(newHandleRef(this,this.Handle),-16)|WS_SYSMENU);//这里加上这段后下面的caseWM_NCHITTEST:就没反应了请问这儿怎么写这段有问题
解决方案五:
[DllImport("user32.dll")]publicstaticexternboolReleaseCapture();[DllImport("user32.dll")]publicstaticexternboolSendMessage(IntPtrhwnd,intwMsg,intwParam,intlParam);publicconstintWM_SYSCOMMAND=0x0112;publicconstintSC_MOVE=0xF010;publicconstintHTCAPTION=0x0002;privatevoidbutton1_MouseDown(objectsender,MouseEventArgse){ReleaseCapture();SendMessage(this.Handle,WM_SYSCOMMAND,SC_MOVE+HTCAPTION,0);}

这是无边框拖动
解决方案六:
发的东西很好很完整放到VS2008里新建一个窗体就行了就能看到是什么意思就是//SetWindowLong(newHandleRef(this,this.Handle),-16,GetWindowLong(newHandleRef(this,this.Handle),-16)|WS_SYSMENU);//这里加上这段后下面的caseWM_NCHITTEST:就没反应了请问这儿怎么写这段有问题把注释去掉就不能响应caseWM_NCHITTEST:的功能了
解决方案七:
hhc123你的我试过了不好用privatevoidForm12_MouseDown(objectsender,MouseEventArgse){ReleaseCapture();SendMessage(this.Handle,WM_SYSCOMMAND,SC_MOVE+HTCAPTION,0);}
解决方案八:
接分,接分,接分,接分,
解决方案九:

解决方案十:
学习。。。
解决方案十一:
有没有牛人可以解决这个问题啊?急!!!呵呵~
解决方案十二:
同求答案。。加上任务栏左右键功能后不能改变大小,可以改变大小的时候却不能使用任务栏左右键功能。。

时间: 2024-11-10 01:10:17

winform 无边框 窗体基本功能 拖动和系统右键菜单冲突的相关文章

C#中实现拖动无边框窗体Form

拖动无边框窗体Form至桌面任何位置 首先建一个Windows应用程序 将Form1的 FormBorderStyle属性设置为Noe   创建控件panel1放在标题栏位置   代码         Point mouseOff;//鼠标移动位置变量         bool leftFlag;//标签是否为左键         private void panel1_MouseDown(object sender, MouseEventArgs e)        {            

WPF无边框窗体,点击任务栏无法最小化

问题描述 WPF设置成无边框窗体后,点击任务栏无法最小化.在Winform中可以用以下方式解决这个问题.[DllImport("user32.dll",EntryPoint="GetWindowLong",CharSet=CharSet.Auto)]publicstaticexternintGetWindowLong(HandleRefhWnd,intnIndex);[DllImport("user32.dll",EntryPoint="

winform 无边框中添加的pannel 怎么实现移动 与缩放

问题描述 winform 无边框中添加的pannel 怎么实现移动 与缩放 最近在做一个无边框的窗体界面,通过百度查询了实现窗体的移动与缩放,但是在窗体上添加了pannel 以后,运行后就不能够实现,点击控件处实现以上功能,请问怎么实现了 代码如何写了 小白求助!!!!!!! 解决方案 还有一种方法,就是让Panel不处理鼠标消息,也就是漏掉鼠标消息,可以拦截掉WM_NCHITTEST,然后再这个里面返回HTTRANSPARENT; 参考这里http://blog.csdn.net/suiyun

无边框窗体,窗体鼠标事件被禁止,求解决办法。

问题描述 protectedoverridevoidWndProc(refMessagem){constintWM_NCHITTEST=0x84;constintHTCLIENT=0x01;constintHTCAPTION=0x02;constintWM_SYSCOMMAND=0x112;constintSC_MAXMIZE=0xF030;constintWM_NCLBUTTONDBLCLK=0xA3;switch(m.Msg){case0x4e:case0xd:case0xe:case0x1

c#中无边框窗体改变大小?

问题描述 我是参考这里http://www.microsoft.com/china/community/Column/60.mspx我做的也是一个无边框的窗体现在已经实现了向右拉伸功能.方法(获得当前的鼠标横坐标(mousemove)FORM.WITCH=鼠标横坐标-location.X)如何实现向左拉伸?我思考的方法(FORM.WITCH=this.Right-当前鼠标横坐标,但是表现出来时窗体左边框没动右边框在增加缩小)不知道我是不是写错了.或者要实现无边框窗体的伸缩大小有没有另外的好方法?

vb无边框窗体-[VB 6.0]无边框窗体用[JS]实现左键+拖动=改变窗体大小

问题描述 [VB 6.0]无边框窗体用[JS]实现左键+拖动=改变窗体大小 设想:Form1(绝对的无边框,不是有边框去掉标题栏)中只有webbrowser一个控件,webbrowser与Form1大小一致. 求助:Form1会被webbrowser控件完全覆盖,Form1的鼠标事件不会因鼠标操作而触发,而webbrowser控件本身没有鼠标事件[有没有不讨论,就当没有]这种情况下如何实现左键+拖动=改变窗口大小,可否在webbrowser-document中建一与Form1同样大小的DIV,用

winform中如何处理无边框窗体的缩放和托动

在winform经常用到无边框的窗体,原因就是想使自己的程序界面完全的自定义,网上也有过不少的相关资料 今天我发了一下的午的时间整理了一下.觉得还不错,贴出来看看. 为了提高托动的缩放的效率,减少系统开销,一般软件都用支持只显示窗体四周的虚线的方法,这也是windows默认的设置 首先看下其它软件的窗体托动,先说QQ2009吧,QQ2009的主窗体在托动时如果在屏幕上来回快速托动,等停下来时你会发现,很有可能鼠标现在在窗体的位置已经不是按下的位置了.再说酷我音乐盒.鼠标在托动或缩放窗体时,如果鼠

vb.net如何在win7下不开启阴影效果,如何实现无边框窗体阴影

问题描述 vb.net如何在win7下不开启阴影效果,如何实现无边框阴影,求高手给代码,谢谢各位了 解决方案 解决方案二:WPF整

怎么将Word中常用功能移到鼠标右键菜单

下面以将"删除线"命令添加到鼠标右键菜单为例进行介绍. (1)单击"工具→自定义"命令,在打开的"自定义"对话框中选中"工具栏"选项卡. (2)在"工具栏"列表框中选中"快捷菜单"复选框,并激活"快捷菜单"工具栏,如图1-13所示. (3)单击"命令"选项卡,在"类别"列表栏中选中"格式"选项,再在"