技术开发 频道

用C#创建定制窗口界面一例

【it168技术文章】
简介
早在Visual Studio 6.0时代,在很多网站上都可以看到有关用VC/VB创建定制窗口的源码示例;但是,在.NET时代,这方面的小文章实在不多。本文基于一种早期用VC6制作定制窗口的思路,并结合C#的新特征来尝试创建一个定制的窗口界面,例子虽然丑陋,但却具有一般指导意义。你会看到在.NET环境下,用C#创建一个定制窗口更为容易。
实现过程
首先,你需要准备一些定制图像。在本文例子中,我使用的是jpeg格式的图像。
现在,打开Visual Studio 2005并创建一个新的C# Windows应用程序。为此,只需转到“File->New->Project->Visual C# Projects->Windows Application”,为你的工程确定一个名字,然后点击OK(当然,你也可以改变你的工程的存放位置)。一切顺利的话,呈现在你面前的将是一个毫无内容的空窗口。我们先对该表单进行一些设计修改,然后进行编码。首先,按F4键调出“属性”窗口。
在“属性”窗口中,我们必须改变一些缺省设置。首先,我们必须把窗口的FormBorderStyle属性设置为None。另外,我还把另一个TopMost属性设置为True,但这不是必需的(把这个属性设置为真后,应用程序窗口就可以一直位于其它窗口的顶部而不管其是否具有焦点)。
然后,添加标题栏。为此,选择菜单项“View->ToolBox”。我们需要添加一个PictureBox控件,因此你可以直接把它拖动到窗口表面。然后,调用其大小和位置,使其看上去大致如下图所示:
                                         
在调整PictureBox之前,我们必须添加图片。为此,我们可以从解决方案资源管理器中右击工程名,并选择“Add->New Folder”。命名文件夹为Images或任何另外你喜欢的命名。现在,右击我们刚才创建的文件夹,选择“Add->Add Existing Item…”,浏览到你想使用的图像并选择它们,按下OK后,它们即被包括到当前工程中。接下来,我们要选择PictureBox并且调整其属性。我们必须把这个控件的Image属性设置为我们想使用的在前面已经加入的图像。然后,要把另一个Dock属性改变为Top。现在,我们需要添加另一个PictureBox控件,用于表示关闭按钮。把这个新的PictureBox放到窗口右上角,并设置其Image属性为你想使用的图像(在本例子中,其文件名为closenormal.jpg)。
现在,让我们开始编码部分。首先,我们需要加入一些代码以便关闭窗口。为此,双击第二个PictureBox,然后Visual Studio将创建下列方法:
private void pictureBox2_Click_1(object sender,System.EventArgs e)
{
}
因为我们需要告诉该表单,当点击该picturebox时,它必须关闭;所以,我们需要加入如下的代码:
this.Close();
现在,这个示例程序可以进行第一次运行试验了。为此,你可以选择“Debug->Start Without Debugging”(或按下组合键Ctrl+F5)。
                                          
 
最后,让我们加入功能以便用户可以移动这个窗口。为此,我们必须处理鼠标动作事件MouseDown,MouseMove和MouseUp。在Designer视图下,选择第一个PictureBox(较大的那个),打开其属性窗口(或按F4),并点击加亮的按钮。在Mouse部分,双击MouseDown属性。Visual Studio已经为你创建了一个现成的函数以便处理在PictureBox上的MouseDown行为(不是表单上的):
private void pictureBox1_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
}
首先,我们需要声明一个变量来标记是否按下鼠标(名字为mouse_is_down)。我们必须在类定义后声明这个变量。然后,加入如下代码:
private bool mouse_is_down=false;
现在,转到pictureBox1_MouseDown方法并且添加下列代码:
mouse_is_down=true;
现在,你知道何时按下鼠标了。但是,如果用户按下鼠标然后即松开它的话,变量mouse_is_down还是为true。为了修正这个问题,我专门添加一个处理MouseUp事件的函数。在Mouse部分,双击MouseUp属性,然后添加下列代码:
mouse_is_down=false;
到目前为止,一切顺利。现在,让我们处理MouseMove行为。双击MouseMove,现在我们位于pictureBox1_MouseMove方法中了。如果鼠标按下,并且用户想移动窗口,我们要使之能够移动,这只要添加如下代码即可:
if ( mouse_is_down )
{
Point current_pos = Control.MousePosition;
this.Location=current_pos;
}
上面Point类型的变量代表鼠标的当前位置。
现在,让我们运行程序来看一下所发生的事情。
如你所见,窗口移动时,鼠标位置停留在窗口的左上角。为什么会这样呢?通过改变鼠标的位置,我们也改变了窗口的位置,并且把鼠标坐标设置为(0,0)(相对于窗口)。这种情况可以通过添加另外一些代码加以避免。为此,我们只须记下点击时的鼠标的位置。首先,我们需要在类的开始声明另一个Point类型的变量mouse_pos。
private Point mouse_pos;
在pictureBox1_MouseDown方法中,添加下列代码以记忆当执行点击时的鼠标的位置:
mouse_pos.X=e.X;
mouse_pos.Y=e.Y;
现在,让我们转到pictureBox1_MouseMove方法,并且添加:
if ( mouse_is_down )
{
Point current_pos = Control.MousePosition;
current_pos.X = current_pos.X - mouse_pos.X; //新加current_pos.Y = current_pos.Y - mouse_pos.Y; //新加
this.Location = current_pos;
}
好,现在可以再次运行示例程序了。
最后,让我们再作一下改进:
在pictureBox1_MouseDown方法中,加入下列代码行:
pictureBox1.Image=new Bitmap("..\\..\\Images\\up bar selected.jpg");
上面语句实现,在你点击时,改变pictureBox1的Image属性。
在PictureBox_MouseUp方法中,让我们改变回原来的图像:
pictureBox1.Image =new Bitmap("..\\..\\Images\\up bar.jpg");
注意:当你运行程序时,你的当前目录为“{path to application}\bin\Debug”。再让我们把表单的BackgroundImage属性设置为face.jpg图像(也是位于Images文件夹下)。而且,设置TransparencyKey为Gray(128,128,128)(注意,你可能需要把颜色深度设置为16位才能看到这种效果)。
这是最后的应用程序快照:
                 
 
小结
如何?赶快照着本文思路试验一下吧!可以看到,其大致实现思路和以前的VB6、VC6中的自定制窗口思想差不多(当然,还有其它实现思路),而且更为简单了。
0
相关文章