无标题窗体的移动及其简单美化


      先看效果图吧。

最近做Web,发现网页三剑客总是会留下一些“最近打开项目”这样的痕迹在软件的界面上,心里总是觉得很不舒服,于是萌发了写一个清除器的念头。说动手就动手吧!

DW、FW、Fl 的这些痕迹都是存在于注册表中的,简单原理就是删除注册表里的值就ok了,这些应该没有什么好说的,所以我就不说了。今天我们主要来讲一下无标题栏的窗体拖动问题和使用图片来简单的美化界面的问题。

可能有很多人都认为无标题栏窗体的移动是非常简单的,网上很多的朋友也给出了一些方法,大多说人给出的方法是在窗体的privite部分创建一个私有过程 procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;就像这样的过程,这个原理就是发送消息给系统,欺骗鼠标点击的地方(也就是窗体的客户区)是窗体的标题栏,然而经过我的测试如果窗体上有其他的控件,比如一个TButton,那么TButton的事件是不会被触发的,不论采用哪种方式都是难以触发的,最少我的测试如此。所以此思路不可以。还有的人给出了使用MouseMove等一系列事件来进行窗体的Top和Left进行运算的。

上面第一种该方法不适合,人比较懒不想打太多的代码,所以第二种方法也就不适合了。

好了,不说废话了,我们一步一步来吧:

1。首先建一个窗体,将BorderStyle属性设置为bsSingle

2。放一个TImage,载入一张图片,如下图

          3。用PS打开TImage中载入的图片,来获取颜色

          4。然后双击Form1下的Color属性值,在弹出的颜色对话框中点击“规定自定义颜色”,然后在红、绿、蓝后面的方框里填写上PS的拾色器里面的R、G、B后面对应的数值,如下图:

          5。点击“添加到自定义颜色”,再在“自定义颜色”的方框上点击自己定义好的颜色,这时自定义的颜色会出现了一个一个黑色的边框,然后确定。这样,窗体的简单美化就完成了。

6。选择TImage组件,选择Events选项卡,选择OnMouseDown事件,为其添加代码如下:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
end;

这里我解释一下:

ReleaseCapture 释放鼠标的捕获状态

Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0); 发送鼠标左键获取到的状态为窗体的标题栏的系统消息,其达到欺骗操作系统所点击的地方是窗体的标题栏。

这样一个既可以拖动又可以响应其他组件的无标题栏窗体就完成了。

如果你还有耐心的话,也可以继续为窗体添加一些特效,比如窗体时圆角的、像MSN那样慢慢滚动上来的消息框一样让你的窗体滚动上来,这里我就不截图了,直接给出代码:

procedure TForm1.FormCreate(Sender: TObject);
var
  Hnd: THandle;
begin
  Hnd := CreateRoundRectRGN(0, 0, Width, Height, 15, 15);
  SetWindowRGN(Handle, Hnd, True);
  AnimateWindow(Handle, 1000, AW_SLIDE + AW_VER_NEGATIVE);
end;

【说明】1。先定义一个句柄变量Hnd;2。使用Win API函数CreateRoundRectRGN创建圆角矩形区域;3。使用API函数SetWindowRGN设置窗体为圆角的;4。AnimateWindow这个函数用来设置窗体的出场方式(这里的表述可能不太精确,还请见谅)这个函数有很多参数的,具体自己查吧。

最后我们再来编写程序的关闭时的渐隐效果,还是使用AnimateWindow函数来实现的,不过这个函数只是让窗体隐藏了,并没有真正的关闭,所以你还得使用一句关闭代码来关闭窗体,好了不费话了,直接给代码了:

AnimateWindow(Handle, 2000, AW_SLIDE + AW_BLEND + AW_HIDE);
Application.Terminate;

到此这篇文章就结束了,对于了解Win API 函数的高手来说很简单了,请不要见笑,谢谢!

http://www.lsworks.net/article/53.html

时间: 2024-10-20 23:13:48

无标题窗体的移动及其简单美化的相关文章

C#无标题窗体的拖动

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; namespace Example013_无标题窗体的拖动 { /// <summary> /// Form1 的摘要说明. /// </s

无标题窗体拖动(三种方法)

通过响应“wm_NCHitTest”消息来移动窗体.Windows发送“wM_NCHitTest”消息来确定鼠标操作是否发生在窗体的客户区,或边框的特殊区上(非客户区).如果Windows发现用户单击了窗体标题,系统将移动窗体,单击了窗体边框,则系统将开始改变窗体大小.例程如下: //声明一自定义事件,拦截“WM_NCHITTEST”消息 Procedure MoveForm(var M:TWMNCHITTEST);Message WM_NCHITTEST; Procedure TForm1.M

C# 无边框窗体边框阴影效果的简单实现

private const int CS_DropSHADOW = 0x20000;         private const int GCL_STYLE = (-26);                   [DllImport("user32.dll", CharSet = CharSet.Auto)]         public static extern int SetClassLong(IntPtr hwnd, int nIndex, int dwNewLong);   

无边框窗体、后台创建控件、简单通讯

一.无边框窗体 1.控制按钮如何制作: 就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要可以点击能触发点击事件就可以了 (1)美化一下的话那就可以把鼠标移入,移出,按下三个事件让按钮改变样式 (2)如何获取图片的相对路径 //鼠标移入时显示的图片 private void pictureBox1_MouseEnter(object sender, EventArgs e) { pictureBox1.BackgroundImage = Image.FromFile(Applicatio

Winform自定义无边框窗体

你还在为Winform原生窗体的丑陋而烦恼么?下面来看一下如何制作一个既漂亮又简单的窗体 先看一下效果图: 首先我们新建一个窗体FormM继承原生Form 看一下主要的代码 public partial class FormM : Form { public FormM() { InitializeComponent(); } /// <summary> /// 是否允许最大化 /// </summary> private bool maxVisible = true; [Desc

Qt:移动无边框窗体(使用Windows的SendMessage)

移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 [cpp] view plain copy void EditDialog::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_DragPosition = event->globalPos() - this->pos(); event->accept()

为活动统一设置无标题&amp;&amp;全屏

因为我们在做一些活动界面的时候,一般使用无标题的时候都会使用到全屏来显示一些活动内容,因此我们来利用创建style来实现: <?xml version="1.0" encoding="utf-8"?> <resources> <style name="theme_full_screen" parent="android:Theme.Black"> <item name="an

【Qt】移动无边框窗体

分类: Qt2013-05-08 22:55 3027人阅读 评论(7) 收藏 举报 移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 [cpp] view plaincopy void EditDialog::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_DragPosition = event->global

WinForm 无边框窗体和timer控件

一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入,移出,按下三个事件会让按钮改变样式 如何获取图片的相对路径Application.StartupPath + "\\..\\..\\images\\btn_close_highlight.png" \..\文件夹名称... 向上翻一个文件夹 2.如何让窗体动起来调用窗体移动的API 如果有其它控件覆盖了窗体,那么写好鼠标按下的事件委托