Windows Mobile上实现可拖动的窗口

本文介绍如何在Windows CE上创建可自定义大小并能通过模拟方式实现拖动的窗体。通过禁用默认的窗体控制按钮并设置窗体边界样式,结合自定义的标题栏和鼠标事件处理,实现了窗体的自由拖动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转:http://www.cnblogs.com/qilinzhi/archive/2008/04/19/1160977.html

在Windows CE上的Form可以控制它的大小,但是不能像winform上的窗体一样随意拖动,并且当控制Form大小后Form只会显示其工作区,而不会显示它的caption。
为了实现窗体拖动,我们可以使用模拟的方式实现,用鼠标的事件来模拟拖动。最下面有示例代码下载。

为了实现可以拖动的窗体,首先要为窗体做如下设置:
将要拖动的Form的如下属性全部设为false
ControlBoxMinimizeBoxMaximizeBox
FormBorderStyle设为FormBorderStyle.None
这样才能使窗体以自定义的大小显示。

由于浮动的窗体不会显示caption,所以我们要自己模拟一个capting,首先我们写一个继承于Panel的类TitleBarPanel,用作captiong,代码如下:

1 public class TitleBarPanel:System.Windows.Forms.Panel
2 {
3internalboolmouseDown=false;
4internalPointoldPoint=Point.Empty;
5
6protectedSystem.Windows.Forms.LabeltitleLabel;
7
8
9publicTitleBarPanel(stringtitle)
10{
11this.titleLabel=newLabel();
12titleLabel.Top=0;
13this.Controls.Add(this.titleLabel);
14this.titleLabel.Font=newSystem.Drawing.Font("Tahoma",8F,System.Drawing.FontStyle.Bold);
15this.titleLabel.ForeColor=System.Drawing.Color.White;
16this.titleLabel.Location=newSystem.Drawing.Point(4,2);
17this.titleLabel.Size=newSystem.Drawing.Size(100,16);
18this.titleLabel.Text=title;
19}

20
21
22overrideprotectedvoidOnMouseDown(MouseEventArgse)
23{
24mouseDown=true;
25oldPoint=newPoint(e.X,e.Y);
26((FloatingDialog)this.Parent).Moving=true;
27}

28
29
30overrideprotectedvoidOnMouseMove(MouseEventArgse)
31{
32if(mouseDown)
33{
34intdx,dy;
35dx=e.X-oldPoint.X;
36dy=e.Y-oldPoint.Y;
37
38this.Parent.Location=newPoint(this.Parent.Left+dx,this.Parent.Top+dy);
39
40this.Parent.Refresh();
41}

42}

43
44overrideprotectedvoidOnMouseUp(MouseEventArgse)
45{
46mouseDown=false;
47((FloatingDialog)this.Parent).Moving=false;
48this.Parent.Refresh();
49}

50}

其中有一个Label用于caption显示的标题。
mouseDown属性用于表示鼠标是否处于按下状态。
该类重写了OnMouseDown,OnMouseMove,OnMouseUp事件,用于实现拖动。
在MouseDown事件触发的时候,将当olePoint设为当前点,并将包含该标题的窗体的moving属性设为true。
FloatingDialog的代码在下面。
当MouseMove事件触发时,如果鼠标是按下状态,就计算出位移量dx,dy,并将窗体的位置加上算出的偏移量。接着调用Refresh方法刷新窗体,使窗体触发OnPaint方法重画。
OnMouseUp触发时,将mouseDown设为false,并将窗体的moving属性设为false,并刷新窗体。


为了实现可拖动的窗体,我写了一个基类FloatingDialog,只要继承于该类的窗体即可实现拖动。代码如下:

public class FloatingDialog:Form
{
privateSystem.ComponentModel.IContainercomponents=null;
/**////<summary>
///清理所有正在使用的资源。
///</summary>
///<paramname="disposing">如果应释放托管资源,为true;否则为false。</param>

protectedoverridevoidDispose(booldisposing)
{
if(disposing&&(components!=null))
{
components.Dispose();
}

base.Dispose(disposing);
}


protectedTitleBarPaneltitlePanel;

protectedPenblackPen=newPen(Color.Black);
privateboolmoving=false;

internalboolMoving
{
get{returnmoving;}
set{moving=value;}
}


publicFloatingDialog(stringtitle)
{
InitializeComponent(title);
}


publicvoidInitializeComponent(stringtitle)
{
this.SuspendLayout();

//实例化TitlePanel
this.titlePanel=newTitleBarPanel(title);

//使Form浮动
this.FormBorderStyle=FormBorderStyle.None;
this.ControlBox=false;
this.MinimizeBox=false;
this.MaximizeBox=false;

//设置titlepanel
this.titlePanel.Bounds=newRectangle(0,0,this.Width,16);
this.titlePanel.BackColor=System.Drawing.SystemColors.ActiveCaption;
this.Controls.Add(this.titlePanel);

this.AutoScaleDimensions=newSystem.Drawing.SizeF(96F,96F);
this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Dpi;
this.AutoScroll=false;
//this.ClientSize=newSystem.Drawing.Size(240,100);


this.ResumeLayout(false);
}


protectedoverridevoidOnPaint(PaintEventArgse)
{
Graphicsg
=e.Graphics;

if(!titlePanel.mouseDown)
{
base.OnPaint(e);
}


Rectangler
=this.ClientRectangle;
//r.X=1;
//r.Y=1;
r.Height-=1;

r.Width
-=1;
g.DrawRectangle(blackPen,r);


}

}

该类中有三个属性,titlePanel, blackPen, moving.
titlePanel即为前面写的TitleBarPanel类,为窗体的标题。
由于窗体浮动显示的时候是没有边框,所以要自己画一个边框上去,balckPen就是用来画边框的。
moving用于表示窗体是否在移动。
该类重写了OnPaint事件,用于画边框。

剩下的工作就是添加一个FloatingForm窗体,并继承于FloatingDialog类,
在主Form中调用如下方法:

public void AddFloatingForm()
{
this.SuspendLayout();

FloatingFormfloatingForm
=newFloatingForm();
floatingForm.Location
=newPoint((this.Width-floatingForm.Width)/2,50);

this.Controls.Add(floatingForm);
floatingForm.Show();
floatingForm.BringToFront();

this.ResumeLayout();
}

即可实现FloatingForm拖动

示例代码:下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值