课题2:不规则窗体与背景设计
- 格式:ppt
- 大小:342.50 KB
- 文档页数:24
一、自定义窗体,一般为规则的图形,如圆、椭圆等。
做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下:System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath();shape.AddEllipse(0,0,this.Height, this.Width);this.Region = new Region(shape);即重绘窗体的规则。
二、利用背景图片实现1.设置窗体的背景图片,其中背景图片是24位(不包括24)以下的位图(BMP图片),并且要设置TansparencyKey的值,一般为你背景图片的背景色,即创建不规则图片时的底色,一般设为你图片中没有的颜色。
这种做法的不好的地方就是背景图片一定要16位或者更低的,而且还要确保客户端的显示。
如果监视器的颜色深度设置大于24 位,则不管TransparencyKey 属性是如何设置的,窗体的非透明部分都会产生显示问题。
若要避免出现这种问题,请确保“显示”控制面板中的监视器颜色深度的设置小于24 位。
当开发具有这种透明功能的应用程序时,请牢记应使您的用户意识到此问题。
实现步骤如下:1.新建windows application2.选择窗体,找到BackgroundImage属性,点击打开新的窗口,选择下面的导入资源文件,选择你的不规则的BMP图片3.找到窗体的TansparencyKey,将它设置为你背景图片的背景色(如黄色)4.找到窗体的FormBorderStyle,将其设置为none,即不显示标题栏5.运行<!--[endif]-->2.跟背景图片一样的图形,不过是动态加载,遍历位图以实现不规则窗体。
它的原理是这样的,在Form的load事件中写方法使得窗体的描绘区域发生改变。
实现步骤如下:1.建立winform应用程序2.找到窗体的Load事件,双击进行编辑3.编写方法,主要的代码如下:代码class BitmapRegion{public BitmapRegion(){ }///<summary>/// Create and apply the region on the supplied control///创建支持位图区域的控件(目前有button和form)///</summary>///<param name="control">The Control object to apply the reg ion to控件</param>///<param name="bitmap">The Bitmap object to create the regi on from位图</param>public static void CreateControlRegion(Control control, Bitma p bitmap){// Return if control and bitmap are null//判断是否存在控件和位图if (control == null || bitmap == null)return;// Set our control''s size to be the same as the bitmap //设置控件大小为位图大小control.Width = bitmap.Width;control.Height = bitmap.Height;// Check if we are dealing with Form here//当控件是form时if (control is System.Windows.Forms.Form){// Cast to a Form object//强制转换为FORMForm form = (Form)control;// Set our form''s size to be a little larger that th e bitmap just// in case the form''s border style is not set to non e in the first place//当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点form.Width = control.Width;form.Height = control.Height;// No border//没有边界form.FormBorderStyle = FormBorderStyle.None;// Set bitmap as the background image//将位图设置成窗体背景图片form.BackgroundImage = bitmap;// Calculate the graphics path based on the bitmap su pplied//计算位图中不透明部分的边界GraphicsPath graphicsPath = CalculateControlGraphicsP ath(bitmap);// Apply new region//应用新的区域form.Region = new Region(graphicsPath);}// Check if we are dealing with Button here//当控件是button时else if (control is System.Windows.Forms.Button){// Cast to a button object//强制转换为 buttonButton button = (Button)control;// Do not show button text//不显示button textbutton.Text = "";// Change cursor to hand when over button//改变 cursor的stylebutton.Cursor = Cursors.Hand;// Set background image of button//设置button的背景图片button.BackgroundImage = bitmap;// Calculate the graphics path based on the bitmap su pplied//计算位图中不透明部分的边界GraphicsPath graphicsPath = CalculateControlGraphicsP ath(bitmap);// Apply new region//应用新的区域button.Region = new Region(graphicsPath);}}///<summary>/// Calculate the graphics path that representing the figure in the bitmap/// excluding the transparent color which is the top left pix el./// //计算位图中不透明部分的边界///</summary>///<param name="bitmap">The Bitmap object to calculate our g raphics path from</param>///<returns>Calculated graphics path</returns>private static GraphicsPath CalculateControlGraphicsPath(Bitm ap bitmap){// Create GraphicsPath for our bitmap calculation//创建 GraphicsPathGraphicsPath graphicsPath = new GraphicsPath();// Use the top left pixel as our transparent color//使用左上角的一点的颜色作为我们透明色Color colorTransparent = bitmap.GetPixel(0, 0);// This is to store the column value where an opaque pixe l is first found.// This value will determine where we start scanning for trailing opaque pixels.//第一个找到点的Xint colOpaquePixel = 0;// Go through all rows (Y axis)// 偏历所有行(Y方向)for (int row = 0; row < bitmap.Height; row++){// Reset value//重设colOpaquePixel = 0;// Go through all columns (X axis)//偏历所有列(X方向)for (int col = 0; col < bitmap.Width; col++){// If this is an opaque pixel, mark it and search for anymore trailing behind//如果是不需要透明处理的点则标记,然后继续偏历if (bitmap.GetPixel(col, row) != colorTransparent) {// Opaque pixel found, mark current position//记录当前colOpaquePixel = col;// Create another variable to set the current pixel position//建立新变量来记录当前点int colNext = col;// Starting from current found opaque pixel, search for anymore opaque pixels// trailing behind, until a transparent pixel is found or minimum width is reached///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度for (colNext = colOpaquePixel; colNext < bitm ap.Width; colNext++)if (bitmap.GetPixel(colNext, row) == colo rTransparent)break;// Form a rectangle for line of opaque pixels found and add it to our graphics path//将不透明点加到graphics pathgraphicsPath.AddRectangle(new Rectangle(colOp aquePixel, row, colNext - colOpaquePixel, 1));// No need to scan the line of opaque pixels just foundcol = colNext;}}}// Return calculated graphics pathreturn graphicsPath;}}4.运行<!--[endif]-->三、调用类库实现主要就是根据一些坐标,然后根据这些坐标绘制窗体代码如下:代码public Form3(){InitializeComponent();//创建不规则窗体POINTAPI[] poin;poin = new POINTAPI[5];poin[0].x = 90;poin[0].y = 90;poin[1].x = this.Width;poin[1].y = 0;poin[2].x = Width;poin[2].y = this.Height / 2;poin[3].x = Width / 2;poin[3].y = Height / 2;poin[4].x = 0;poin[4].y = Width;Boolean flag = true;IntPtr hRgn = CreatePolygonRgn(ref poin[0], 8, 1); SetWindowRgn(this.Handle, hRgn, ref flag);this.BackColor = Color.BurlyWood;}[StructLayout(LayoutKind.Sequential)]private struct POINTAPI{internal int x;internal int y;}[DllImport("gdi32.dll")]private static extern IntPtr CreatePolygonRgn(ref POINTAPI lp Point,int nCount,int nPolyFillMode);[DllImport("user32.dll")]private static extern IntPtr SetWindowRgn(IntPtr hWnd,IntPtr hRgn, ref Boolean bRedraw);//设置窗体显示状态[DllImport("user32.dll")]private static extern int SetWindowPos(IntPtr hwnd,int hWndIn sertAfter,int x,int y,int cx,int cy,int wFlags);private void Start_Btn_Click(object sender, EventArgs e){//始终显示在前面SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 1);}private void button1_Click(object sender, EventArgs e){//最小化始终显示在前面SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 0);}当然,我们也可以自定义窗体的动作,如按着某个轨迹一定,下面的代码中的Backgroun dForm程序中就小试了一下,效果还不错,下面是这些程序的效果图(有点乱)和代码:代码是.Net 2.0的,也可以转换为其他版本的,只要运行主程序即可。
网上也看过很多做.NET窗体的例子,我只是把网上的这些东西综合了一下,主要有下面这些特点:1、边框是半透明的,透明度可根据需要自己更改;2、可以改变窗体的大小,改变后样式不变;3、窗体的边框是不规则的;4、重点解决了窗体会出现闪烁的问题,在窗体移动的时候也不会闪烁;5、使用方便,只要将AlphaFormPanel拖动到一般的窗体上就可以实现换肤;设计思路说明:一、.NET下处理一个窗体部分透明我所知道的有两种方法:1、用一张支持Alhpa通道的图片来处理半透明,这种方式处理出来的效果会很好,甚至可以用一张动态的图片来做背景。
相信有人看过那个游动的鱼的程序,鱼的边缘是半透明的,就是用这种方式做的。
这种方式整个窗体都是通过UpdateLayeredWindow画出来的,如果要在上面加控件的话,所有的控件都要自己来绘制,显然在具体的项目中用这种方式的话会大大增加开发的难度。
有兴趣的人可以看看这个程序:/Files/liutao409/游动的鱼.rar关键的代码就是根据这种支持Alhpa通道的图片来绘制窗体[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]public static extern int UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize,IntPtr hdcSrc, ref Point pptSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);public void SetBits(Bitmap bitmap){if (!haveHandle) return;if(!Bitmap.IsCanonicalPixelFormat(bitmap.PixelFormat)| !Bitmap.IsAlphaPixelFormat(bitmap.PixelFor mat))throw new ApplicationException("图片必须是32位带Alhpa通道的图片。
用设计各种形状的窗体界面一文章来源:互联网窗体是程序设计最常见,最普通,也是最容易受到程序员忽视的编程对象。
一般来说,在Visual Basic .Net针对窗体的编程是不需要人为介入的,因为可视化编程工具Visual Studio .Net已经按照窗体的缺省状态实现了。
但是在最近遇到的应用程序中。
我们发现越来越多的应用程序中使用到各种不同规则的窗体,这些不同规则的窗体给应用程序带来异常的情趣和不同平常的效果的同时,也促使使用者思考这样一个问题,如何创建这些窗体?在Visual Basic .Net中提供了一种简单、直接创建不规则窗体的方法,本文的主要内容就是探讨一下这些方法具体的实现过程。
下面就来详细介绍在Visual Basic .Net 中实现五种不同规格窗体的方法,即:椭圆形、扇形、圆形、环形和三角形。
掌握了这五种不同形状窗体的实现方法后,我想对于其他规则的窗体就不应该有什么问题了。
Visual Basic .Net中创建、使用MDI窗体也是本文的重要内容之一,MDI是Multi Document Interface的简称,即:多文档界面,MDI最早出现于Windows 2.0中,最先使用到MDI的应用程序是E xcel电子表格。
为了方便使用者同时能够操作多份电子表格,Excel 就采用了MDI来解决这个问题。
到了Windows3.1中,MDI在应用程序中得到了更大范围的应用。
其中Windows 3.1中的程序管理器和文件管理器都采用了MDI。
目前MDI在应用程序中依然被广泛采用。
下面就首先来介绍一下Visual Basic .Net创建不规则窗体的相关知识和具体实现方法。
一.简介Visual Basic .Net中定制不规则窗体时使用的类库:Visual Basic .Net中定制不规则窗体主要使用到Region类和G raphicsPath类,其中以GraphicsPath类最为重要。
设计窗体的一般步骤以设计窗体的一般步骤为标题,写一篇文章:一、确定窗体的目的和功能设计窗体的第一步是确定窗体的目的和功能。
在设计窗体之前,我们需要明确窗体的用途和所需实现的功能。
例如,如果窗体是用来收集用户信息的,我们需要确定需要收集哪些信息,以及如何展示和存储这些信息。
二、确定窗体的布局和结构在确定窗体的目的和功能之后,我们需要考虑窗体的布局和结构。
布局指的是窗体中各个元素的排列方式,结构指的是窗体中各个元素之间的关系。
一个好的布局和结构可以使窗体界面更加美观、易于使用和理解。
三、选择合适的控件和元素在确定布局和结构之后,我们需要选择合适的控件和元素来实现窗体的功能。
控件是窗体中的各个交互元素,例如按钮、输入框、下拉框等。
选择合适的控件可以提高用户的交互体验和效率。
四、设计窗体的样式和外观窗体的样式和外观对用户的第一印象至关重要。
一个好的样式和外观可以提高用户对窗体的好感度,使用户更愿意使用窗体。
在设计窗体的样式和外观时,我们需要考虑颜色、字体、图标等元素,以及它们在窗体中的排列和组合方式。
五、添加交互和验证功能窗体不仅要具备良好的外观,还需要具备交互和验证功能。
交互功能指的是用户与窗体之间的互动,例如点击按钮、填写表单等。
验证功能指的是对用户输入的验证,例如验证邮箱格式、密码强度等。
添加交互和验证功能可以提高用户的交互体验和数据的准确性。
六、测试和优化窗体设计完窗体后,我们需要进行测试和优化。
测试是为了确保窗体的各个功能正常运行,没有错误或异常。
优化是为了提高窗体的性能和用户体验,例如优化窗体的加载速度、响应时间等。
七、发布和维护窗体最后一步是发布和维护窗体。
发布窗体可以是将窗体部署到服务器上,供用户访问和使用。
维护窗体是为了修复窗体中的bug、添加新功能、改进用户体验等。
发布和维护窗体需要持续关注用户的反馈和需求,及时做出相应的调整和改进。
总结:设计窗体是一个复杂而又需要耐心和技巧的过程。
实验报告3—窗体设计(模板)⼴州⼤学学⽣实验报告开课学院及实验室:计算机楼407室 2011年 11 ⽉ 24 ⽇、12 ⽉ 8⽇学院商学院年级、专业、班姓名学号实验课程名称数据库管理系统I成绩实验项⽬名称窗体设计指导⽼师宋⽂⼀、实验⽬的1、掌握在Access2007数据库中创建简单窗体的各种⽅法;2、掌握布局视图的使⽤⽅法;3、掌握控件的设计⽅法;4、掌握创建统计分析窗体的⽅法;5、掌握窗体的设计⽅法。
⼆、实验内容及原理实验01.快速创建窗体。
通过“窗体”⼯具创建“管理员”窗体。
实验02.快速创建分割窗体。
创建数据来⾃于“读者”表的“分割窗体”窗体。
实验03.快速创建多个项⽬窗体。
通过“多个项⽬”⼯具创建“图书”窗体。
实验04.通过另存为快速创建窗体。
通过⽂件另存的⽅法创建“读者类型权限”窗体。
实验05.使⽤窗体向导创建窗体。
通过窗体向导创建“读者借阅明细”窗体,按读者显⽰借阅图书的历史明细情况。
实验06.使⽤窗体设计器创建窗体。
通过窗体设计器创建窗体“图书的馆藏信息”。
窗体上包括“图书馆藏信息”表的以下字段:图书编号、状态、馆藏地点;以及“图书”表的以下字段:索取号、书名、作者、出版社、出版⽇期、藏书量。
实验07.布局视图的使⽤。
打开“图书的馆藏信息”窗体,在布局视图下调整窗体及其控件的格式和排列:(1)各控件的字号改为12磅,线条样式为虚线、紫⾊、宽度为2磅;(2)将上⾯3⾏控件调整到底部位置;(3)各控件调整⾄合适⼤⼩,再将各控件的位置改变,将左边列的控件靠右对齐。
实验08.窗体和命令按钮控件的设计。
通过窗体向导快速创建“读者管理”窗体后,把“性别”字段的控件类型改为⽂本框。
并且,通过控件向导添加5个命令按钮:⾸记录、上⼀记录、下⼀记录、末记录、关闭。
窗体不显⽰记录选择器、导航按钮和滚动条。
实验09.组合框和⽂本框控件的设计。
创建“登录窗体”,在窗体上创建未绑定组合框和⽂本框:显⽰⽤户名的未绑定组合框,其⾏来源为“管理员”表中的“姓名”字段;显⽰密码的未绑定⽂本框,其输⼊掩码为“密码”;设置这两个控件的特殊效果为“凹陷”。
在以前版本的Visual Basic或Visual C++中,创建不规则窗体和控件是一件很复杂的事,不仅需要调用大量API函数而且工作量也不小。
不过,现在在Visual C#下,情况就完全不同了。
运用Windows Forms你就可以很轻易地创建出一个不规则的窗体以及窗体上的控件。
一个具有不规则窗体和控件的应用程序肯定会更吸引广大的用户,微软的Windows Media Player 7就显示出这一点。
作为程序员,您一定想在自己的程序中运用这点技术吧。
程序的窗体和控件都可以以非传统的方式被创建。
本文就向大家展示如何在应用程序中创建不规则窗体,以及如何在窗体上创建各式各样的自定义形状的控件。
注:创建不规则窗体和控件这个过程包含了大量的图形编程工作,所以不同的计算机因内存和显卡的不同可能会导致最终的效果有所不同。
因此,在发布你的应用程序前,务必在各种不同类型的计算机上做好测试工作。
实现方法首先,创建一个位图文件作为程序的窗体。
位图可以是任意形状的,但是位图文件区域一定要足够大,这样才能包含窗体上的所有控件。
然后,你可以通过设置一些属性使该图成为程序的窗体。
把程序中的标题栏去掉,否则整个界面将显得很不协调。
当然你去掉了标题栏也就去掉了它的最大化、最小化、关闭、移动窗体等功能。
为了使程序仍然具有这些功能,我们需在程序中添加一些代码,这样用户就仍然可以像以前一样和程序进行交互。
因此,你需要完成如下工作:1.创建一个作为窗体的位图文件。
2.创建一个Windows应用程序,用上述位图文件作为程序的窗体同时去掉其标题栏。
3.添加原标题栏具有的功能所需的代码。
具体步骤下面我就具体向大家介绍如何创建不规则窗体。
创建一个具有不规则形状的位图文件1.用任何画图程序就可以创建不规则形状的位图,你可以使用最容易也是最方便的画图程序。
2.用一种颜色画出一个不规则的区域作为程序的窗体,并用另一种颜色画出该位图的背景。
(你要使该不规则区域足够大。
《设计窗体》作业设计方案(第一课时)一、作业目标本作业旨在使学生掌握窗体设计的基本概念和基本操作,能够运用所学知识自主设计简单的窗体界面,为后续的程序设计打下坚实的基础。
二、作业内容1. 窗体概念学习:学生需掌握窗体的定义、作用及基本组成元素,理解窗体在程序中的作用和重要性。
2. 窗体设计基础:学习窗体的基本属性设置,如大小、位置、标题等,掌握控件的添加与调整,包括按钮、文本框、标签等基本控件的用法。
3. 实践操作:学生需自行设计一个简单的窗体界面,包括至少两个按钮控件和一个文本框控件。
要求界面布局合理,控件属性设置正确,能够实现基本的交互功能。
4. 代码编写:结合所学知识,编写实现窗体基本功能的代码,如按钮点击事件的响应等。
三、作业要求1. 窗体设计要符合规范,界面布局合理,控件摆放整齐。
2. 控件属性设置要准确,如大小、位置、颜色等要符合设计要求。
3. 代码编写要规范,注释清晰,能够实现窗体基本功能。
4. 作业需独立完成,不得抄袭他人作品。
5. 提交作业时需附上设计思路和代码说明。
四、作业评价1. 教师根据学生提交的作业进行评分,从界面设计、控件设置、代码编写等方面进行评价。
2. 对于优秀作品进行展示和表扬,鼓励学生在信息技术课程中多思考、多实践。
3. 对于存在问题的地方,教师需给出具体的改进意见和建议,帮助学生提高窗体设计水平。
五、作业反馈1. 教师需及时批改作业,给出评价和反馈意见。
2. 对于共性问题,可在课堂上进行讲解和演示,帮助学生解决问题。
3. 对于个别学生的问题,可通过个别辅导或线上答疑等方式进行解答。
4. 鼓励学生之间相互交流和学习,共同进步。
六、总结与拓展本作业设计方案通过具体的实践操作,旨在让学生掌握窗体设计的基本知识和技能,为后续的程序设计打下坚实的基础。
同时,通过评价和反馈,帮助学生发现问题并加以改进。
在今后的学习中,学生可进一步拓展窗体设计的深度和广度,学习更多高级的窗体设计和编程技巧。
《设计窗体》教学设计方案(第一课时)一、教学目标1. 知识与技能:学生能够了解窗体的基本观点和作用,掌握窗体的基本操作技能。
2. 过程与方法:通过实际操作,学生能够掌握窗体设计的流程和方法。
3. 情感态度价值观:培养学生自主探究和团队协作的精神,提高学生对信息技术的兴趣。
二、教学重难点1. 教学重点:学生能够设计和制作简单的窗体。
2. 教学难点:学生在设计窗体过程中,能够合理布局和美化窗体界面。
三、教学准备1. 准备教学用具:计算机、投影仪、窗体设计软件等。
2. 准备教学内容:设计窗体的相关案例和素材。
3. 安排时间表:根据教学计划,每周安排两节课时,共计八周时间进行窗体设计软件的教学。
4. 教学方法:采用理论讲解和实践操作相结合的方式,确保学生能够熟练掌握窗体设计软件的应用技巧。
5. 评估方式:通过学生完成的作品和教室表现,评估学生对窗体设计软件的实际掌握情况。
6. 预期效果:学生能够熟练掌握窗体设计软件的应用,能够独立完成简单的窗体设计任务,并能够在实际工作中应用所学知识。
7. 反馈机制:在教学过程中,及时收集学生的反馈意见和建议,以便不息改进教学方法和内容。
总之,通过以上安排和准备,我们将为学生提供一次全面的窗体设计软件教学体验,帮助他们掌握这一重要的计算机技能,为未来的职业发展打下坚实的基础。
四、教学过程:(一)导入新课1. 展示几个用Word制作的精美电子贺卡,引起学生的兴趣。
2. 展示一些不规范或不常用的计算机术语,让学生猜测术语的含义,以此来激发学生的好奇心。
3. 引出“窗体”的观点,介绍窗体的作用。
(二)探索新知1. 通过多媒体演示,展示窗体的制作过程。
2. 学生观察窗体的制作过程,思考以下问题:(1)窗体上都有哪些元素?(2)这些元素各自的作用是什么?(3)在制作窗体时,有哪些注意事项?(三)小组合作1. 将学生分成若干小组,每组选定一名组长。
2. 给每个小组发放一张电子表格,表格中包含一些基本信息,如姓名、性别、年龄等。
目标不规则窗体也称为异型窗体,像迅雷的飞鸟型窗体就是啦。
这篇文章就是要实现这样的窗体。
计划&方案根据上一篇文章继续扩展。
我们有几种方案实现不规则窗体。
迅雷就是用一张图片作为窗体的形状,那么图片的类型我们也要考虑进来。
现在是png图片的天下,自带背景透明;对于bmp图片,需要程序处理一下。
对于常规图形如圆形,只需要SetWindowRgn就可以搞定。
对于复杂图形,需要用一点技巧来做。
下面用例子来演示圆形和复杂图形的不规则窗体。
关于SetWindowRgn,参见官方文档。
实践一、圆形窗体这里还要借助另一个类CRgn,它作为SetWindowRgn的主要参数,通过CreateEllipticRgn方法初始化出圆形区域。
具体代码如:CRgn rgn;rgn. CreateEllipticRgn(0,0,96,96);SetWindowRgn(rgn,TRUE);接下来封装一个方法来加载png图片:void ShowPicture(){CImage img;HRESULT result = img.Load(_T("prime.png"));//加强透明化for(int i = 0; i < img.GetWidth(); i++){for(int j = 0; j < img.GetHeight(); j++){unsigned char* pucColor = reinterpret_cast<unsigned char *>(img.GetPixelAddress(i , j));pucColor[0] = pucColor[0] * pucColor[3] / 255;pucColor[1] = pucColor[1] * pucColor[3] / 255;pucColor[2] = pucColor[2] * pucColor[3] / 255;}}CDC *pDC = GetWindowDC();int nX = img.GetWidth();int nY = img.GetHeight();img.Draw( pDC->m_hDC,0,0);ReleaseDC( pDC );}二、复杂图形窗体引用vckbase的文章《Windows 中不规则窗体的编程实现》中“根据图像创建region”一节。