vc 在切分窗口之间实现拖放
c 实现拖拽打开方法
c#实现拖拽打开方法导读:就爱阅读网友为您分享以下“c#实现拖拽打开方法”的资讯,希望对您有所帮助,感谢您对的支持! 首先,这是个winform的程序,部署在市场部同事的笔记本上面,基于.Net2.0做的,它的功能大致如下:???加密合同文档(*.doc)在客户处解密此合同文档,进行编辑,再次加密回到公司可以通过密码打开它由于时间关系,只是很粗略的做了个大概。
打开vs2008,建立一个winform项目,设计程序界面如下:很简单的,待会儿在文章最后会有下载地址。
我们可以把任意文件,拖入程序界面,即可进行加密,在此暂不作说明,大家可以待会儿下载回去试试,很简单的。
下面分享一下加密代码吧:代码usingSystem;usingSystem.Collections.Generic; usingSystem.Text;usingSystem.Security.Cryptography; usingSystem.IO; namespaceFileLock{///<summary>///异常处理类///</summary>publicclassCryptoHelpException:ApplicationException {publicCryptoHelpException(stringmsg):base(msg){}}publicclassCryptoHelp{privateconstulongFC_TAG=0xFC010*********CF; privateconstintBUFFER_SIZE=128*1024;///<summary>///检验两个Byte数组是否相同///</summary>///<paramname="b1">Byte数组</param>///<paramname="b2">Byte数组</param>///<returns>true-相等</returns>privatestaticboolCheckByteArrays(byte[]b1,byte[]b2){if(b1.Length==b2.Length){for(inti=0;i<b1.Length;++i){if(b1[i]!=b2[i])returnfalse;}returntrue;}returnfalse;}///<summary>///创建RijndaelSymmetricAlgorithm///</summary>///<paramname="password">密码</param>///<paramname="salt"></param>///<returns>加密对象</returns>privatestaticSymmetricAlgorithmCreateRijndael(stringpass word,byte[]salt){PasswordDeriveBytespdb=newPasswordDeriveBytes(passwo rd,salt,"SHA256",1000);SymmetricAlgorithmsma=Rijndael.Create();sma.KeySize=256;sma.Key=pdb.GetBytes(32);sma.Padding=PaddingMode.PKCS7;returnsma;}///<summary>///加密文件随机数生成///</summary>privatestaticRandomNumberGeneratorrand=newRNGCryp toServiceProvider();///<summary>///生成指定长度的随机Byte数组///</summary>///<paramname="count">Byte数组长度</param>///<returns>随机Byte数组</returns> privatestaticbyte[]GenerateRandomBytes(intcount){byte[]bytes=newbyte[count];rand.GetBytes(bytes);returnbytes;}///<summary>///加密文件///</summary>///<paramname="inFile">待加密文件</param>///<paramname="outFile">加密后输入文件</param>///<paramname="password">加密密码</param>publicstaticvoidEncryptFile(stringinFile,stringoutFile,string password){using(FileStreamfin=File.OpenRead(inFile),fout=File.OpenWrite(outFile)){longlSize=fin.Length;//输入文件长度intsize=(int)lSize;byte[]bytes=newbyte[BUFFER_SIZE];//缓存intread=-1;//输入文件读取数量intvalue=0;//获取IV和saltbyte[]IV=GenerateRandomBytes(16);byte[]salt=GenerateRandomBytes(16);//创建加密对象SymmetricAlgorithmsma=CryptoHelp.CreateRijndael(pass word,salt);。
在VC++中实现无标题栏对话框的拖动
目前,很多基于对话框的应用程序中对话框都是不带框架的,也就是说对话框没有标题栏。
众所周知,窗口的移动都是通过鼠标拖动窗口的标题栏来实现的,那么现在应用程序中的对话框没有了标题栏,用户如何移动对话框呢?本实例针对这个问题提出解决的办法。
一、实现方法解决无标题栏窗口的拖动问题有两种方案,一种方案是使用常规思路来处理鼠标拖拽事件,当窗口获得WM_LBUTTONDOWN (OnLButtonDown)时,通过设置标志并调用CWnd::SetCapture ()函数来让当前窗口捕捉鼠标消息,应用程序进入移动模式,此时只要有WM_MOUSEMOVE消息过来,就可以据此移动框架窗口,最后当用户释放鼠标按钮,则WM_LBUTTONUP消息处理例程清除标志并调用CWnd::ReleaseCapture()函数将鼠标控制返还给Windows。
这种方法比较繁琐,首先要决定窗口准备移到哪?然后要想好如何重绘窗口等等,而且根据屏幕显示属性对话框"效果"页中"视觉效果"项的"拖动时显示窗口中内容"复选框是不是选中,拖动效果是不同的。
那么你怎么知道设置的信息呢?方法是调用SystemParametersInfo(SPI_GETDRAGFULLWINDOWS)。
Windows要程序员来事无巨细地处理这些繁琐的事情真是太糟了。
由于Windows本身知道通过鼠标点住标题栏可以移动窗口,那么能不能将鼠标在窗口客户区任何地方的点击拖动行为都模仿成好像是在标题栏中一样呢?答案是肯定的,这样就产生了第二种拖动窗口移动的方法。
实际上,用鼠标点住对话框背景进行拖动操作并不难,但是你必须了解在标题栏里拖动窗口的原理。
Windows首先确定鼠标点中了哪个窗口,然后向那个窗口发送一个WM_NCHITTEST消息找出此窗口的哪个"非客户区"(如边界、最大化/最小化按钮、菜单、标题等等)拥有鼠标光标。
vc实现拖放控件
基于对话框的文件拖拽载入2011年4月7日梁昭发表评论阅读评论不知道你是否对QQ文件传输比较好奇?将文件拖入对话窗口,就可以实现文件的传输...其实在MFC中实现起来比较简单,在Windows中已经将消息封装好了。
这一节我们主要来学习一下基于对话框的文件拖拽功能!(1)最容易出错且较易遗忘的一步:选中对话框的属性"Accept files",细心一点容易发现,基本上所有的控件都有这个属性,注意只要将对话框的这个属性设置就行了,其余控件的属性不要进行设置。
否则主窗口的Accept files可能不起作用。
(2)将对话框的WM_DropFiles消息映射添加进来,(3)使用Win32 API可以轻易地在自己的GUI程序中加入拖放支持。
你需要了解这样几个函数DragAcceptFiles函数原型:VOID DragAcceptFiles(HWND hWnd, BOOL fAccept);此函数告诉Windows窗口hWnd是否接受从shell拖放过来的文件,fAccept=TRUE表示接受拖放。
这意味着窗口hWnd必须能够处理WM_DROPFILES消息。
DragFinish函数原型:VOID DragFinish(HDROP hDrop);在Drag-and-Drop过程完成时调用,从而允许shell释放为传递文件名而开辟的内存空间。
hDrop是WM_DROPFILES消息的WParam参数。
DragQueryFile函数原型:UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);此函数用来获取拖放的文件名。
hDrop是WM_DROPFILES消息的WParam参数,lpszFile是用于容纳文件名的缓冲区,cch是该缓冲区的大小。
设置iFile=0xFFFFFFFF的话,此函数返回拖放的文件总数,记为count。
c#splitter控件使用简介
c#splitter控件使⽤简介
摘⾃:
1、先在窗体上放置部分⼀的控件,这⾥是TreeView控件,然后把它的 Dock 属性设置为 Left,使得控件停靠在窗体的左边。
2、现在往窗体上拖放⼀个Splitter 控件,也就是界⾯中的Splitter1,把它的 Dock 属性也设置为 Left,这样它就停靠在TreeView控件的右边缘了。
3、往窗体上拖放部分⼆的控件,这⾥是RichTextBox控件,然后把它的 Dock 属性设置为 Bottom,使得它停靠在窗体的下部。
4、往窗体上拖放另外⼀个 Splitter 控件,就是界⾯中的 Splitter2,把它的 Dock 属性设置为 Bottom,这样它就⾃动变成⽔平放置,并停靠在RichTextBox 控件的上⽅。
5、往窗体上拖放部分三,然后把它的 Dock 属性设置为 Fill。
现在运⾏程序,就可以通过两个 Splitter 控件来调整其它三个控件的⼤⼩了。
C#窗体实现文件拖拽功能-电脑资料
C#窗体实现文件拖拽功能-电脑资料1、首先要把你的窗体或者空间的AllowDrag属性设置为允许2、注册DragEnter事件3、获得文件路径,先通过e.Data.GetFormats()方法获得所有数据格式4、调用e.GetData()方法根据指定的数据格式获得文件路径5、有了文件路径,相信一切问题迎刃而解下面是例子:[csharp]private void textBox1_DragEnter(object sender, DragEventArgs e){//获得数据格式File.WriteAllLines("C:\\1.text", e.Data.GetFormats());//获得文件名string[] filename = (string[])e.Data.GetData("FileNameW",true);textBox1.Text = filename[0];string entesion = Path.GetFileName(textBox1.Text);if (!File.Exists(textBox1.Text.Trim())) { return; }//读取文件流using (FileStream fsOpen = File.OpenRead(textBox1.Text.Trim())){using (FileStream fs = new FileStream("C:\\" + entesion, FileMode.Create, FileAccess.Write)){byte[] buffer = new byte[1024 * 1024];while (true){int result = fsOpen.Read(buffer, 0, buffer.Length);if (result <= 0){break;}else{fs.Write(buffer, 0, result);}}fs.Flush();}}}运行结果:补充一点:在win7下可能是因为权限不均衡不触发DragDrop事件,所以我在里只用到DragEnter事件,你们可以试下DragDrop事件,可能用户体验要好点!。
MFC实现对象拖放
MFC实现对象拖放(2008-05-19 10:57:01)标签:ole mfc对象拖放it分类:程序人生对象拖放是指对某一指定的对象,利用鼠标拖动的方法,在不同应用的窗口之间、同一应用的不同窗口之间或同一应用的同一窗口内进行移动、复制(粘贴)等操作的技术。
利用对象拖放,可以为用户提供方便、直观的操作界面。
实现对象拖放技术,需要了解、使用MFC的CView、COleDataSource和COleDropTarget 等类,并利用这些类协同工作。
本文讨论了对象拖放技术,并研究了如何利用MFC实现该技术。
利用MFC实现对象拖放,编程比较容易,代码可读性好。
修改稿利用MFC实现对象拖放本文讨论了对象拖放技术,并研究了如何利用MFC实现该技术;利用MFC实现对象拖放,编程比较容易,代码可读性好。
1.对象拖放概念对象拖放是指对某一指定的对象,利用鼠标拖动的方法,在不同应用的窗口之间、同一应用的不同窗口之间或同一应用的同一窗口内进行移动、复制(粘贴)等操作的技术。
对象拖放是在操作系统的帮助下完成的。
要开始一次拖动,首先需要指定或生成被拖动的对象,然后指定整个拖放操作过程所使用的数据格式,并按指定的数据格式提供数据,最后启动对象拖放操作;当对象在某一窗口内落下时,拖放过程结束,接收拖放对象的窗口按指定的数据格式提取有关数据,并根据提取的数据生成对象。
2.MFC中用于对象拖放的类MFC(Microsoft Foundation ClassLibrary)为实现对象拖放提供了如下三个类。
为便于后边的讨论我们先来熟悉一下这些类。
2.1.COleDataSource。
用于启动一次拖放操作,并向系统提供拖放对象的数据。
类中的成员函数有如下三种:a.设定提供数据的方式和使用的数据格式。
提供数据的方式有两种,一种是即时方式,另一种是延迟方式;即时方式需要在拖动开始之前提供数据;延迟方式不需要立即提供数据,当系统请求有关数据时,由OnRenderData()等虚函数提供所需的数据。
C#WinForm控件的拖动和缩放的实现
C#WinForm控件的拖动和缩放的实现C# WinForm控件的拖动和缩放是个很有⽤的功能。
实现起来其实很简单的,主要是设计控件的MouseDown、MouseLeave、MouseMove 事件下⾯的⼏个步骤将逐步实现C# WinForm控件的拖动和缩放的功能。
1、定义⼀个枚举类型,描述光标状态1. private enum EnumMousePointPosition2. {3. MouseSizeNone = 0, //'⽆4. MouseSizeRight = 1, //'拉伸右边框5. MouseSizeLeft = 2, //'拉伸左边框6. MouseSizeBottom = 3, //'拉伸下边框7. MouseSizeTop = 4, //'拉伸上边框8. MouseSizeTopLeft = 5, //'拉伸左上⾓9. MouseSizeTopRight = 6, //'拉伸右上⾓10. MouseSizeBottomLeft = 7, //'拉伸左下⾓11. MouseSizeBottomRight= 8, //'拉伸右下⾓12. MouseDrag = 9 // '⿏标拖动13. }2、定义⼏个变量1. const int Band = 5;2. const int MinWidth=10;3. const int MinHeight=10;4. private EnumMousePointPosition m_MousePointPosition;5. private Point p,p1;3、定义⾃⼰的MyMouseDown事件1. private void MyMouseDown(object sender,System.Windows.Forms.MouseEventArgs e)2. {3. p.X=e.X;4. p.Y=e.Y;5. p1.X=e.X;6. p1.Y=e.Y;7. }4、定义⾃⼰的MyMouseLeave事件1. private void MyMouseLeave(object sender, System.EventArgs e)2. {3. m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;4. this.Cursor=Cursors.Arrow;5. }5、设计⼀个函数,确定光标在控件不同位置的样式1. private EnumMousePointPosition MousePointPosition(Size size,System.Windows.Forms.MouseEventArgs e)2. {3.4. if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height))5. {6. if (e.X < Band)7. {8. if (e.Y < Band) {return EnumMousePointPosition.MouseSizeTopLeft;}9. else10. {11. if (e.Y > -1 * Band + size.Height)12. {return EnumMousePointPosition.MouseSizeBottomLeft;}13. else14. {return EnumMousePointPosition.MouseSizeLeft;}15. }16. }17. else18. {19. if (e.X > -1 * Band + size.Width)20. {21. if (e.Y < Band)22. {return EnumMousePointPosition.MouseSizeTopRight;}23. else24. {25. if (e.Y > -1 * Band + size.Height)26. {return EnumMousePointPosition.MouseSizeBottomRight;}27. else28. {return EnumMousePointPosition.MouseSizeRight;}33. if (e.Y < Band)34. {return EnumMousePointPosition.MouseSizeTop;}35. else36. {37. if (e.Y > -1 * Band + size.Height)38. {return EnumMousePointPosition.MouseSizeBottom;}39. else40. {return EnumMousePointPosition.MouseDrag;}41. }42. }43. }44. }45. else46. {return EnumMousePointPosition.MouseSizeNone;}47. }6、定义⾃⼰的MyMouseMove事件,在这个事件⾥,会使⽤上⾯设计的函数1. private void MyMouseMove(object sender,System.Windows.Forms.MouseEventArgs e)2. {3. Control lCtrl =(sender as Control);4.5. if (e.Button==MouseButtons.Left)6. {7. switch (m_MousePointPosition)8. {9. case EnumMousePointPosition.MouseDrag:10. lCtrl.Left =lCtrl.Left+ e.X - p.X;11. lCtrl.Top =lCtrl.Top+ e.Y - p.Y;12. break;13. case EnumMousePointPosition.MouseSizeBottom:14. lCtrl.Height = lCtrl.Height + e.Y - p1.Y;15. p1.X=e.X;16. p1.Y=e.Y; //'记录光标拖动的当前点17. break;18. case EnumMousePointPosition.MouseSizeBottomRight:19. lCtrl.Width = lCtrl.Width + e.X - p1.X;20. lCtrl.Height = lCtrl.Height + e.Y - p1.Y;21. p1.X=e.X;22. p1.Y=e.Y; //'记录光标拖动的当前点23. break;24. case EnumMousePointPosition.MouseSizeRight:25. lCtrl.Width = lCtrl.Width + e.X - p1.X;26. // lCtrl.Height = lCtrl.Height + e.Y - p1.Y;27. p1.X=e.X;28. p1.Y=e.Y; //'记录光标拖动的当前点29. break;30. case EnumMousePointPosition.MouseSizeTop:31. lCtrl.Top = lCtrl.Top + (e.Y - p.Y);32. lCtrl.Height = lCtrl.Height - (e.Y - p.Y);33. break;34. case EnumMousePointPosition.MouseSizeLeft:35. lCtrl.Left = lCtrl.Left + e.X - p.X;36. lCtrl.Width = lCtrl.Width - (e.X - p.X);37. break;38. case EnumMousePointPosition.MouseSizeBottomLeft:39. lCtrl.Left = lCtrl.Left + e.X - p.X;40. lCtrl.Width = lCtrl.Width - (e.X - p.X);41. lCtrl.Height = lCtrl.Height+ e.Y - p1.Y;42. p1.X=e.X;43. p1.Y=e.Y; //'记录光标拖动的当前点44. break;45. case EnumMousePointPosition.MouseSizeTopRight:46. lCtrl.Top = lCtrl.Top + (e.Y - p.Y);47. lCtrl.Width = lCtrl.Width + (e.X - p1.X);48. lCtrl.Height = lCtrl.Height - (e.Y - p.Y);49. p1.X=e.X;50. p1.Y=e.Y; //'记录光标拖动的当前点51. break;52. case EnumMousePointPosition.MouseSizeTopLeft:53. lCtrl.Left = lCtrl.Left + e.X - p.X;54. lCtrl.Top = lCtrl.Top + (e.Y - p.Y);55. lCtrl.Width = lCtrl.Width - (e.X - p.X);56. lCtrl.Height = lCtrl.Height - (e.Y - p.Y);57. break;58. default:59. break;60. }61. if (lCtrl.Width<MinWidth) lCtrl.Width=MinWidth;62. if (lCtrl.Height<MinHeight) lCtrl.Height=MinHeight;67. m_MousePointPosition = MousePointPosition(lCtrl.Size, e); //'判断光标的位置状态68. switch (m_MousePointPosition) //'改变光标69. {70. case EnumMousePointPosition.MouseSizeNone:71. this.Cursor = Cursors.Arrow; //'箭头72. break;73. case EnumMousePointPosition.MouseDrag:74. this.Cursor = Cursors.SizeAll; //'四⽅向75. break;76. case EnumMousePointPosition.MouseSizeBottom:77. this.Cursor = Cursors.SizeNS; //'南北78. break;79. case EnumMousePointPosition.MouseSizeTop:80. this.Cursor = Cursors.SizeNS; //'南北81. break;82. case EnumMousePointPosition.MouseSizeLeft:83. this.Cursor = Cursors.SizeWE; //'东西84. break;85. case EnumMousePointPosition.MouseSizeRight:86. this.Cursor = Cursors.SizeWE; //'东西87. break;88. case EnumMousePointPosition.MouseSizeBottomLeft:89. this.Cursor = Cursors.SizeNESW; //'东北到南西90. break;91. case EnumMousePointPosition.MouseSizeBottomRight:92. this.Cursor = Cursors.SizeNWSE; //'东南到西北93. break;94. case EnumMousePointPosition.MouseSizeTopLeft:95. this.Cursor = Cursors.SizeNWSE; //'东南到西北96. break;97. case EnumMousePointPosition.MouseSizeTopRight:98. this.Cursor = Cursors.SizeNESW; //'东北到南西99. break;100. default:101. break;102. }103. }104.105. }7、制作⼀个初始化过程,将界⾯panel1上的所有控件都绑定MyMouseDown、MyMouseLeave、MyMouseMove事件,记得在Form初始化或者Form_Load时先执⾏它。
大白话C#--使用C#实现点击窗体任意位置进行拖动的功能
大白话C#—使用C#实现点击窗体任意位置进行拖动的功能大白话系列宗旨:打破自身基础高低的壁垒,用最简单白话的语言,让最低基础的童鞋也能轻松编程。
项目描述:对于一个软件来说,可以随意进行窗口拖动是一个很符合操作感同时也很实用的功能,本项目旨在通过在C#中进行代码添加,从而实现点击窗体任意位置都可以进行窗口拖动的功能。
环境:VS2010详细步骤(完整代码附在文档最后):【完整代码附在文档最后】一、新建C #项目1、找到并打开VS2010软件,新建项目。
2、在弹出的窗口中左侧选择Visual C#下的Windows,然后在右侧选择“Windows窗体应用程序”,然后在下侧修改项目名称。
点击确定,即创建了一个窗体。
二、进入代码编写【完整代码附在文档最后】1、选中窗体,在右侧属性界面处点击下图中“事件”按钮(标志为),里面是窗体的所有可操作事件。
2、在其中找到MouseDown事件,并双击,则跳转到该事件的响应函数代码部分。
如图,此时,代码部分为空。
【完整代码附在文档最后】3、在上述响应函数外新建一个坐标类型(Point类型)的变量offset,之后在响应函数内添加代码,添加完成后如下图:4、同样的方法,找到窗体的MouseMove事件。
在其响应函数内添加代码,添加完成后如下图:【完整代码附在文档最后】5、上述仅实现了窗体的非控件区域自由拖动,下面介绍点击控件区域的自由拖动功能。
(以DataGridView控件为例)首先给窗体添加DataGridView控件,并选中它。
6、按之前的方法,在界面的右侧分别选择控件的MouseDown和MouseMove事件,并添加代码如下:六、代码编写完成,启动调试。
【完整代码附在文档最后】附完整代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace Freedom{public partial class Form1 : Form{public Form1(){InitializeComponent();}#region除控件部分的窗体自由拖动代码private Point offset;//定义坐标类型的变量private void Form1_MouseDown(object sender, MouseEventArgs e){if (MouseButtons.Left != e.Button)return;Point cur = this.PointToScreen(e.Location);offset = new Point(cur.X - this.Left, cur.Y - this.Top);}private void Form1_MouseMove(object sender, MouseEventArgs e){if (MouseButtons.Left != e.Button)return;Point cur = MousePosition;this.Location = new Point(cur.X - offset.X, cur.Y - offset.Y);}#endregion#region控件区域的自由拖动代码private Point offset1;//定义坐标类型的变量private void dataGridView1_MouseDown(object sender, MouseEventArgs e) {if (MouseButtons.Left != e.Button)return;Point cur = this.PointToScreen(e.Location);offset1 = new Point(cur.X - this.Left, cur.Y - this.Top);}private void dataGridView1_MouseMove(object sender, MouseEventArgs e) {if (MouseButtons.Left != e.Button)return;Point cur = MousePosition;this.Location = new Point(cur.X - offset1.X, cur.Y - offset1.Y); }#endregion}}。
C#拖放
拖放操作当然并非只限于文字,有许多应用程序都会提供拖放图片的功能,以便提升操作的便利性。
事实上不管是拖放哪一种类型的数据,其间的方法都没有太大的差异。
程序范例CH8_DemoForm012.cs示范如何在两个PictureBox控件间拖曳图片,其功能特性如下所示:∙如图8.13所示,您可以使用拖放方式将左侧PictureBox控件中的图片移动至右侧的PictureBox控件中,反之亦然;即左右两个PictureBox控件都可以作为拖放来源与置放目标。
∙值得一提的是,如果您持续按Ctrl键,则可以使用拖放方式将左侧PictureBox控件中的图片复制到右侧的PictureBox控件中(如图8.14所示),反之亦然;即左右两个PictureBox控件都可以作为拖放来源与置放目标。
图8.13通过拖放操作来移动图片图8.14通过拖放操作来复制图片程序范例CH8_DemoForm012.cs在拖放操作方面的程序代码如下所示:// 声明一个常量以便侦测在拖曳期间 Ctrl 键是否被按下。
const byte CtrlMask = 8;private void CH4_DemoForm065_Load(object sender, EventArgs e){// 由于目前无法在设计工具中去设定 PictureBox 控件// 的 AllowDrop 属性,所以必须通过程序代码来加以设定。
picLeft.AllowDrop = true;picRight.AllowDrop = true;}// 处理左右两个 PictureBox 控件的 MouseDown 事件。
// 当鼠标指针位于控件的范围内而且鼠标按键被按下时便会引发此事件。
private void PictureBox_MouseDown(System.Object sender,System.Windows.Forms.MouseEventArgs e){if (e.Button == System.Windows.Forms.MouseButtons.Left){PictureBox pic = (PictureBox)(sender);//初始化拖放操作。
VC 拆分窗口
VC 拆分窗口VC++的拆分窗口分为两种:一是静态拆分,二是动态拆分一:静态拆分静态拆分用到两个函数:BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );静态拆分窗口的行列数在拆分窗口被创建时就设置好了,用户不能更改。
但是用户可以缩放各行各列。
一个静态拆分窗口最多可以包含16行16列。
在静态拆分窗口中很容易使用两个以上不同种类的视图,因为您可以在每个窗格中指定所用的视图类型。
给框架窗口添加静态拆分视图的过程如下:1. 给框架窗口类添加一个CsplitterWnd数据成员2. 覆盖框架窗口的OnCreateClient函数,并调用CsplitterWnd::CreateStatic来创建静态拆分视图。
3. 使用CsplitterWnd:: CreateView在每个静态拆分窗口的窗格中创建视图。
下面例子就是创建一个静态拆分:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CcreateContext* pContext){if(!m_wndSplitter.CreateStatic(this,1, 2) || !m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CtextView), Csize(128, 0), pContext) ||!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CpictureView), Csize(0, 0),pContext) )return FALSE;return TRUE;}递给CreateStatic的参数指定了拆分窗口的父亲以及拆分窗口包含的行列数。
C# WinForm下一步一步实现文件的拖入和拖出
else if (size < 1024 * 1024 * 1024)
{
strSize = String.Format("{0:###.##}MB", (float)size / (1024 * 1024));
}
else
{
strSize = String.Format("{0:###.##}GB", (float)size / (1024 * 1024 * 1024));
//Show file time
subItem = new ListViewItem.ListViewSubItem();
DateTime fileTime = System.IO.File.GetLastWriteTime(fileName);
subItem.Text = (string)fileTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); ;
subItem.Tag = fileTime;
itemName.SubItems.Add(subItem);
listViewFolder.Items.Add(itemName);
}
}
上面代码中有一段显示图标的代码由于和拖动无关,我就不贴出来了,感兴趣可以下载完整的代码去看。
}
ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem();
subItem.Text = strSize;
subItem.Tag = size;
itemName.SubItems.Add(subItem);
vc 在切分窗口之间实现拖放
在切分窗口之间实现拖放在许多象资源管理器界面风格的应用程序中,很多的情况下要用到在不同的视之间的拖放操作。
本文就具体给出了实现方法,望能给读者一参考。
(本文中用到的工程是左边具有目录树视、右边具有列表视)首先,两个视都应该有它们自己的实现函数来进行拖放操作。
只要不设置"SetCapture/ReleaseCapture",被拖放的条目就能从原来的视拖放到目的视。
如果被拖的条目(鼠标下的)离开了原来的视,那么目的视的ON_WM_MOUSEMOVE()-消息就获得了该条目的控制条件。
所以我们必须保证不同的视(原来的视以及目的视)能访问相同的成员变量,从而可以在app类里面定义。
接下来,我们就在app类里面定义一些成员变量:public://拖放成员变量:CImageList *cpDragImage;BOOL cDragging;CWnd *cpDragWnd;CWnd *cpDropWnd;HTREEITEM cTreeItemDrag;HTREEITEM cTreeItemDrop;int cListItemDragIndex;int cListItemDropIndex;CPoint cDropPoint;//列表视需要一个全局变量来验证目标的位置好,我们现在来完成我们的主框架类:为了能从列表视访问目录树视,我们用到了一个小小的帮助函数(但是如果你在项目向导里选择了"资源管理器风格"的话, "GetRightPane()"就不用在定义了),返回当前窗口指针。
CMyListView* CMainFrame::GetRightPane(){CWnd* pWnd = m_wndSplitter.GetPane(0, 1);CMyListView* pView = DYNAMIC_DOWNCAST(CMyListView, pWnd);return pView;}CMyTreeView* CMainFrame::GetLeftPane(){CWnd* pWnd = m_wndSplitter.GetPane(0, 0);CMyTreeView *pTree = DYNAMIC_DOWNCAST(CMyTreeView, pWnd);return pTree;}现在到目录树视了:为了能访问需要的成员变量,我们还是先定义了一个帮助函数从而可以轻易的访问我们的app类:CMyApp *CMyTreeView::GetApp(){return ( (CMyApp*)AfxGetApp() );}三个消息处理函数:ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag)把这个视所能设置的元素都设成是开始拖的状态,而目的视也许是本身,或是别的视。
VC++6.0中拖曳文件到文本框得到文件名(OnDropFiles)
VC++6.0中拖曳文件到文本框得到文件名(OnDropFiles)假设在一个对话框程序中,有两个文本框(IDC_EDIT_FILE1和IDC_EDIT_FILE2)和两个按钮(IDC_BTN_1和IDC_BTN_2),这两个文本框中要输入两个不同的文件名称,从而完成相应的操作(如比较两个文件的差异),我们不得不通过两个按钮来实现两次“打开文件”的过程(相信我,这个功能经常会使用到的)。
此时,我们可以使用OnDropFiles功能。
以下从不同角度(对话框、文本框)来完成这个工作。
不管从何种角度,让我们先来了解一下OnDropFiles到底是何物。
OnDropFiles是WINDOWS窗口的WM_DROPFILES消息的消息响应函数,值得注间的是,对于基于对话框的程序,默认是没有此消息项的(它隐身了),也就不能正确响应这个消息。
在开始之前,我们先让这个消息对基于对话框的程序显现出来:“类向导”->“类信息”,在Message Filter选项中选择Window, 确认后,再在“Message Maps”中就会出现WM_DROPFILES了:既然提到了OnDropFiles,函数DragQueryFile()函数不得不提。
通常,在OnDropFiles 函数中,我们通常都会不止一次地使用到这个函数,它能获取拖曳到当前窗口(对话框、文本框)中的文件数量及文件名称,以下是此函数的简单说明:UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);其中,参数说明如下:hDrop :用于区分”包含被拖拽文件名称结构”的句柄。
即存放所拖放文件名称的数据结构的句柄,也就是文件名缓冲区的句柄;iFile :文件索引编号(用于指明所要查询文件的序号,如果拖进多个文件,则索引编号从零开始),如果iFile值为0xFFFFFFFF 时,返回的是拖曳到窗体上的文件的个数。
WinForm实现两个容器之间控件的拖动及排列(图文)
WinForm实现两个容器之间控件的拖动及排列(图⽂)1. 启动程序,图如下:2. 拖动 Button 后的效果如下:3. 程序源代码如下:public partial class TestControlDrag : Form{/// <summary>/// 该指标指⽰被拖动的对象是否进⼊了控件的边界/// </summary>bool bMouseDown;public TestControlDrag(){InitializeComponent();// 默认为 false,即不接受⽤户拖动到其上的控件this.groupBox1.AllowDrop = true;this.groupBox2.AllowDrop = true;// 拖动对象进⼊控件边界时触发this.groupBox1.DragEnter += new DragEventHandler(groupBox_DragEnter);this.groupBox2.DragEnter += new DragEventHandler(groupBox_DragEnter);// 完成拖动时触发this.groupBox1.DragDrop += new DragEventHandler(groupBox_DragDrop);this.groupBox2.DragDrop += new DragEventHandler(groupBox_DragDrop);}private void TestControlDrag_Load(object sender, EventArgs e){CreateControls();}/// <summary>/// ⽣成⼀定数量的控件,本例中使⽤ Button/// 注册 Button 的⿏标点击事件/// </summary>private void CreateControls(){int x = 15;int y = 15;Button btn = null;for (int i = 1; i <= 15; i++){btn = new Button();btn.Left = x;btn.Top = y;btn.Text = "Button " + i;btn.Width = 100;btn.Height = 50;x += btn.Width + 15;if (btn.Width > groupBox1.Width - x){x = 15;y += btn.Height + 15;}btn.AllowDrop = true; // 默认为 false,即不可拖动btn.MouseDown += new MouseEventHandler(btn_MouseDown);this.groupBox1.Controls.Add(btn);}}/// <summary>/// 拖动对象进⼊本控件的边界/// </summary>void groupBox_DragEnter(object sender, DragEventArgs e){e.Effect = DragDropEffects.Move;bMouseDown = true;}/// <summary>/// 拖放操作完成/// </summary>void groupBox_DragDrop(object sender, DragEventArgs e){if (bMouseDown){// 从事件参数 DragEventArgs 中获取被拖动的元素Button btn = (Button)e.Data.GetData(typeof(Button)); GroupBox grp = (GroupBox)btn.Parent;grp.Controls.Remove(btn);((GroupBox)sender).Controls.Add(btn);RefreshControls(new Control[] { grp, (GroupBox)sender }); bMouseDown = false;}}/// <summary>/// 按下⿏标后即开始执⾏拖放操作/// 这⾥指定了拖放操作的最终效果为⼀个枚举值: Move/// </summary>void btn_MouseDown(object sender, MouseEventArgs e){Button btn = (Button)sender;btn.DoDragDrop(btn, DragDropEffects.Move);}/// <summary>/// 对控件中的项进⾏排列/// </summary>private void RefreshControls(Control[] p){foreach (Control control in p){int x = 15;int y = 15;Button btn = null;foreach (Control var in control.Controls){btn = var as Button;btn.Left = x;btn.Top = y;x += btn.Width + 15;if (btn.Width > control.Width - x){x = 15;y += btn.Height + 15;}}}}}。
关于拖放操作
listView1.Items.Add ( new ListViewItem ( s , 0 ) ) ;
}
此致通过对这三个事件的编程,已经完成了由TreeView组件到ListView组件的拖放操作。
三. 由ListView组件到TreeView组件的拖放操作:
treeView1.Nodes.Insert ( DropNode.Index+1 , DragNode ) ;
}
}
四. 二个组件进行拖放操作的完整源程序代码(dragdrop.cs):
在掌握了上面的这些步骤过以后,可以得到这二个组件相互进行拖放操作的完整代码和编译后程序的运行界面,如下:
private void treeView1_DragDrop ( object sender , DragEventArgs e )
{
//获得进行"Drag"操作中拖动的字符串
string dummy = "temp" ;
string s = ( string ) e.Data.GetData ( dummy.GetType ( ) ) ;
int nTondices.Count ;
//判断组件中是否存在项目
if ( nTotalSelected <= 0 ) return ;
IEnumerator selCol = listView1.SelectedItems.GetEnumerator ( ) ;
private void listView1_DragDrop ( object sender , DragEventArgs e )
VC下在对话框上实现接受文件拖放
VC下在对话框上实现接受文件拖放(Drop files) 收藏大部分Windows应用工具程序都能响应接受文件拖放,比如Word,Notepad等当把文件直接拖拽到该窗体或者是某个控件下,应用程序会直接打开这个文件,这样将极大的方便客户使用本文就是介绍这个的实现,跟以前一样,不看到代码一定会很不爽:1. 首先先将您的CDialog设置为Accept files,通过代码或者选项点击都可以实现2. 添加函数声明和消息映射//添加事件声明(尽量写在"AFX_MSG"宏外面.我记得写在里面会出现错误)afx_msg void OnDropFiles( HDROP hDropInfo );//添加消息映射(尽量写在"AFX_MSG_MAP"宏外面.我记得写在里面会出现错误)ON_WM_DROPFILES()3. 下一步就是函数的实现//实现(WINDOWS系统是支持多个文件同时拖放的)void CMyDlg::OnDropFiles( HDROP hDropInfo ){UINT cFiles = ::DragQueryFile( hDropInfo, 0xffffffff, 0, 0); //取得文件数CString szText;char szFile[MAX_PA TH];for( UINT count = 0; count < cFiles; count++ ){if(cFiles>0){::DragQueryFile(hDropInfo, count, szFile, sizeof(szFile));szText += szFile; //绝对路径+文件名存于szFileszText += "\r\n"; //取所有的文件到szText中,一行一个//break; //只取得第一个文件}}//相应操作}ps: 现在这个实现只实现Dialog的拖放操作,未能实现特定控件的拖放操作,但是理论上是可以用这个实现的,因为一般都是CWnd的子类(有些控件不是),那就请读者自己实现一把了本文来自CSDN博客,转载请标明出处:/equationdz/archive/2008/02/17/2100781.aspx我写了一个基于对话框的程序,里面有一个CEdit控件。
winform实现双击缩放和拖动
WinForm无边框窗体实现双击缩放及拖动有时候要实现无边框的winform窗体,由于没有边框了,所以缩放功能没有了,同时也不能拖动窗体。
在实际应用中,我们经常会有一个窗体的头部来显示Title,需要在这个头部左键双击实现缩放以及左键按住实现拖动。
缩放时,应该首先设置窗体的默认长、宽及与屏幕的左边距和上边距。
拖动时,根据鼠标位置移动窗体位置。
两个操作都是根据MouseDown事件来操作的,所以要理清思路。
双击缩放,在第一次点击时,设置过期时间,若在过期时间内在此点击,则改变窗体大小。
拖动时,需要MouseDown、MouseUp、MouseMove同时配合,在MouseDown是第一次触发时,记录当前鼠标位置,并设置属性左键按下标记leftFlag为true。
若leftFlag为true 移动鼠标,则在MouseMove事件下开始移动窗体,MouseUp事件中改变左键按下标记leftFlag为false。
过期时间:Timer timer = new Timer();点击次数:clickTime=0;左键按下标志:leftFlag=false;窗体初始化时设置过期时间:timer.Interval = 300;timer.Tick += (s, e1) =>{ timer.Stop(); clickTime = 0; };MouseMove事件:private void panel1_MouseMove(object sender, MouseEventArgs e){if (leftFlag){Point mouseSet = Control.MousePosition;mouseSet.Offset(mPoint.X, mPoint.Y); //设置移动后的位置Location = mouseSet;}}MouseUp事件:private void panel1_MouseUp(object sender, MouseEventArgs e){leftFlag = false;}MouseDown事件:private void panel1_MouseDown(object sender, MouseEventArgs e) {clickTime++;timer.Start();if (clickTime % 2 == 0){this.WindowState = this.WindowState ==FormWindowState.Maximized ?FormWindowState.Normal :FormWindowState.Maximized;clickTime = 0;}else{if (!leftFlag){mPoint.X = -e.X;mPoint.Y = -e.Y;leftFlag = true;}else{leftFlag = false;}}}。
VC 无标题窗口以及控件拖动的方法(修正)
VC++无标题窗口以及控件拖动的方法(修正)无标题窗口拖动:方法一:直接在OnNcHitTest中虚拟发送HTCAPTION消息[cpp] view plaincopyUINT CMainFrame::OnNcHitTest(CPoint point) { RECT rectWindows, rectClient;this->GetWindowRect(&rectWindows);this->GetClientRect(&rectClient); if (point.y > rectWindows.top && point.y < rectWindows.top + 25) { return HTCAPTION;//标题栏形式} else { returnCFrameWnd::OnNcHitTest(point); } } 方法二:直接在OnLButtonDown中虚拟发送WM_NCLBUTTONDOWN,HTCAPTION消息[cpp] view plaincopyvoidCMyDlg::OnLButtonDown(UINT nFlags, CPoint point){ if (point.y < 26)PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MA KELPARAM(point.x,point.y));CDialog::OnLButtonDown(nFlags, point); }方法三:通过在OnMouseMove中手动进行处理[cpp] view plaincopyvoid CMyDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handlercode here and/or call default static CPoint PrePoint = CPoint(0, 0); if(MK_LBUTTON == nFlags) { if(point != PrePoint) { CPoint ptTemp = point - PrePoint; CRect rcWindow;GetWindowRect(&rcWindow);rcWindow.OffsetRect(ptTemp.x, ptTemp.y); MoveWindow(&rcWindow);return ; } }PrePoint = point;CDialog::OnMouseMove(nFlags, point); } 控件拖动:控件拖动只能采用上述的第三种方法。
如何在VB_NET中实现拖放操作
尽管拖放操作随处可见,但是只有极少数程序员在他们所编写的程序中实现拖放功能,最可能的原因是他们认为实现拖放可能比想象的还要难。这篇文章列举了如何在窗体内、窗体之间,甚至应用程序之间移动文本、图片或者文件的例子,显示了在中实现拖放是非常容易得。
System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
If Not PictureBox1.Image Is Nothing Then
' Set a flag to show that the mouse is down.
End If
End Sub
Private Sub TextBox2_DragDrop(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DragEventArgs) Handles TextBox2.DragDrop
' Display the copy cursor.
e.Effect = DragDropEffects.Copy
Else
' Display the no-drop cursor.
e.Effect = DragDropEffects.None
If e.KeyState = 9 Then
e.Effect = DragDropEffects.Copy
C#Winform涉及的拖放操作总结
C#Winform涉及的拖放操作总结在开发程序的时候,为了提⾼⽤户的使⽤体验,或满⾜相关⽤户的功能,总是离不开拖放功能。
⽽本⽂是总结winform下的常⽤拖放操作。
主要有1.textbox接受拖放的⽂件2.listbox允许⽤户⾃定义排序3.listbox之间的拖放4.控件的拖放5.console的拖放问题⽤户在进⾏拖放操作时,经过的步骤⼤体如下:例如将A中的数据拖放的B中⿏标点击A中的数据(MouseDown)->⿏标移动(MouseMove)->出源数据边界,即出A(DragLeave)->进⼊⽬标边界,进⼊B(DragEnter)->在B中移动,选择放数据的位置,即拖动效果(DragOver)->抬起⿏标(MouseDown)->将A数据放到B中,拖放结束。
(DragDrop,所有的拖放都涉及DragDrop事件)。
下⾯的所有例⼦,都会使⽤到上⾯所列举的⼏个事件。
⼀、textbox接受拖放的⽂件。
为了⽅便⽤户的使⽤,这个应该是最常⽤到的操作。
加⼊这个功能,可以使⽤户省去“打开⽂件对话框,然后选择⽂件”的操作。
在这个例⼦中,我们不需要知道⽤户的点击,即选择了什么⽂件。
只需要了解⽤户拖动⽂件进⼊Textbox(DragEnter),并松开⿏标,完成拖放(DragDrop)。
主要涉及到两个事件。
DragEnter:在将对象拖⼊控件的边界时发⽣。
判断是否是⽂件拖放DragDrop:在完成拖放操作时发⽣。
判断⽂件类型,只添加txt⽂件⾸先添加⼀个textBox控件,将控件的属性设置为AllowDrop=True,Multiline=True代码如下:private void textBox1_DragEnter(object sender, DragEventArgs e){if (e.Data.GetDataPresent(DataFormats.FileDrop)){e.Effect = DragDropEffects.Copy;}}private void textBox1_DragDrop(object sender, DragEventArgs e){string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);foreach (string file in files){if(Path.GetExtension(file)==".txt") //判断⽂件类型,只接受txt⽂件{textBox1.Text += file + "\r\n";}}}⼆、listbox允许⽤户⾃定义排序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在切分窗口之间实现拖放在许多象资源管理器界面风格的应用程序中,很多的情况下要用到在不同的视之间的拖放操作。
本文就具体给出了实现方法,望能给读者一参考。
(本文中用到的工程是左边具有目录树视、右边具有列表视)首先,两个视都应该有它们自己的实现函数来进行拖放操作。
只要不设置"SetCapture/ReleaseCapture",被拖放的条目就能从原来的视拖放到目的视。
如果被拖的条目(鼠标下的)离开了原来的视,那么目的视的ON_WM_MOUSEMOVE()-消息就获得了该条目的控制条件。
所以我们必须保证不同的视(原来的视以及目的视)能访问相同的成员变量,从而可以在app类里面定义。
接下来,我们就在app类里面定义一些成员变量:public://拖放成员变量:CImageList *cpDragImage;BOOL cDragging;CWnd *cpDragWnd;CWnd *cpDropWnd;HTREEITEM cTreeItemDrag;HTREEITEM cTreeItemDrop;int cListItemDragIndex;int cListItemDropIndex;CPoint cDropPoint;//列表视需要一个全局变量来验证目标的位置好,我们现在来完成我们的主框架类:为了能从列表视访问目录树视,我们用到了一个小小的帮助函数(但是如果你在项目向导里选择了"资源管理器风格"的话, "GetRightPane()"就不用在定义了),返回当前窗口指针。
CMyListView* CMainFrame::GetRightPane(){CWnd* pWnd = m_wndSplitter.GetPane(0, 1);CMyListView* pView = DYNAMIC_DOWNCAST(CMyListView, pWnd);return pView;}CMyTreeView* CMainFrame::GetLeftPane(){CWnd* pWnd = m_wndSplitter.GetPane(0, 0);CMyTreeView *pTree = DYNAMIC_DOWNCAST(CMyTreeView, pWnd);return pTree;}现在到目录树视了:为了能访问需要的成员变量,我们还是先定义了一个帮助函数从而可以轻易的访问我们的app类:CMyApp *CMyTreeView::GetApp(){return ( (CMyApp*)AfxGetApp() );}三个消息处理函数:ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag)把这个视所能设置的元素都设成是开始拖的状态,而目的视也许是本身,或是别的视。
void CMyTreeView::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult){NM_TREEVIEW *pTreeView = (NM_TREEVIEW*)pNMHDR;*pResult = 0;//获得指向树型控件的指针:CTreeCtrl &cTree = GetTreeCtrl();GetApp()->cTreeItemDrag = pTreeView->itemNew.hItem;GetApp()->cTreeItemDrop = NULL;//建立一个被拖的条目的图象:GetApp()->cpDragImage = cTree.CreateDragImage(GetApp()->cTreeItemDrag); GetApp()->cpDragImage->BeginDrag(0, CPoint(-15,-15));POINT pt = pTreeView->ptDrag;ClientToScreen( &pt );GetApp()->cpDragImage->DragEnter(NULL, pt);//初始化:GetApp()->cDragging = TRUE;GetApp()->cpDragWnd = &cTree;GetApp()->cpDropWnd = NULL;}void CMyTreeView::OnMouseMove(UINT nFlags, CPoint point){HTREEITEM hitem;UINT flags;//获得指向树型控件的指针:CTreeCtrl &cTree = GetTreeCtrl();//如果是正在被拖动的话:if ( GetApp()->cDragging ){POINT pt = point;ClientToScreen( &pt );//移动图象:GetApp()->cpDragImage->DragMove(pt);if ( (hitem = cTree.HitTest(point, &flags)) != NULL ){GetApp()->cpDragImage->DragShowNolock(FALSE);cTree.SelectDropTarget(hitem);GetApp()->cTreeItemDrop = hitem;GetApp()->cpDragImage->DragShowNolock(TRUE);}}CTreeView::OnMouseMove(nFlags, point);}void CMyTreeView::OnLButtonUp(UINT nFlags, CPoint point){//获得指向树型控件的指针:CTreeCtrl &cTree = GetTreeCtrl();CTreeView::OnLButtonUp(nFlags, point);//I如果是正在被拖动的话:if ( GetApp()->cDragging ){//不再拖动了:GetApp()->cDragging = FALSE;GetApp()->cpDragImage->DragLeave(this);GetApp()->cpDragImage->EndDrag();delete GetApp()->cpDragImage;cTree.SelectDropTarget(NULL);//验证被拖动的图象已被放下:GetApp()->cDropPoint = point;ClientToScreen(&GetApp()->cDropPoint);GetApp()->cpDropWnd = WindowFromPoint(GetApp()->cDropPoint);//选择拖动目的资源的类型:if ( GetApp()->cpDragWnd->IsKindOf(RUNTIME_CLASS(CListView)) ){AfxMessageBox("source is list view", MB_OK);}elseif ( GetApp()->cpDragWnd->IsKindOf(RUNTIME_CLASS(CTreeView)) ) {AfxMessageBox("source is treeview", MB_OK);}elseAfxMessageBox("source is something else", MB_OK);}}接下来就是到了列表视了,做法和前面的差不多:CMyApp *CMyListView::GetApp(){return ( (CMyApp*)AfxGetApp() );}CMainFrame *CKAIView::GetFrame(){return ( ((CMainFrame*)GetParentFrame()) );}CMyTreeView *CMyListView::GetTree(){return ( GetFrame()->GetLeftPane() );}三个消息处理函数:ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag)把这个视所能设置的元素都设成是开始拖的状态,而目的视也许是本身,或是别的视。
void CMyListView::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult){NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;*pResult = 0;//获得指向列表控件的指针:CListCtrl &cList = GetListCtrl();//设置拖动资源:GetApp()->cListItemDragIndex = ((NM_LISTVIEW *)pNMHDR)->iItem;//建立一个被拖的条目的图象:POINT pt;pt.x = pt.y = 8;GetApp()->cpDragImage = cList.CreateDragImage(GetApp()->cListItemDragIndex, &pt); GetApp()->cpDragImage->BeginDrag(0, CPoint (8, 8));pt = ((NM_LISTVIEW *)pNMHDR)->ptAction;ClientToScreen( &pt );GetApp()->cpDragImage->DragEnter(NULL, pt);//初始化:GetApp()->cDragging = TRUE;GetApp()->cListItemDropIndex = -1;GetApp()->cpDragWnd = &cList;GetApp()->cpDropWnd = NULL;}void CMyListView::OnMouseMove(UINT nFlags, CPoint point){//如果是正在被拖动的话if( GetApp()->cDragging ){POINT pt = point;ClientToScreen(&pt);//移动图象:GetApp()->cpDragImage->DragMove(pt);//获得被放置的窗口:GetApp()->cpDragImage->DragShowNolock(FALSE);GetApp()->cpDropWnd = WindowFromPoint(pt);GetApp()->cpDropWnd->ScreenToClient(&pt);GetApp()->cpDragImage->DragShowNolock(TRUE);//获得树型控件:CTreeCtrl &cTree = GetTree()->GetTreeCtrl();cTree.SelectDropTarget(NULL);}CListView::OnMouseMove(nFlags, point);}void CMyListView::OnLButtonUp(UINT nFlags, CPoint point){//如果是正在被拖动的话:if( GetApp()->cDragging ){//结束拖动:GetApp()->cDragging = FALSE;GetApp()->cpDragImage->DragLeave(GetDesktopWindow());GetApp()->cpDragImage->EndDrag();//获得放置点的窗口:GetApp()->cDropPoint = point;ClientToScreen(&GetApp()->cDropPoint);GetApp()->cpDropWnd = WindowFromPoint(GetApp()->cDropPoint);//如果目的资源是本身的话就取消://选择拖动目的资源的类型:if ( GetApp()->cpDragWnd->IsKindOf(RUNTIME_CLASS(CListView)) ){AfxMessageBox("source is list view", MB_OK);}elseif ( GetApp()->cpDragWnd->IsKindOf(RUNTIME_CLASS(CTreeView)) ) {AfxMessageBox("source is treeview", MB_OK);}elseAfxMessageBox("source is something else", MB_OK);}CListView::OnLButtonUp(nFlags, point);}好了,到此为止,我们已经做好了所有的工作,可以实现在不同的视之间的拖动操作了。