zoukankan      html  css  js  c++  java
  • 无标题窗体的移动及其简单美化


          先看效果图吧。

          最近做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

  • 相关阅读:
    gdb调试的基本使用
    重构改善代码--代码的坏味道
    17级单片机期中测试题目
    左右固定,中间自适应的三栏式布局五种写法
    存一些可能会用得到的vue的UI框架
    vue父子组件传值
    [Vue warn]: Missing required prop: "title"
    js中的值类型和引用类型的区别
    vue+node+mongoDB 火车票H5(四)---完成静态页面
    vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件
  • 原文地址:https://www.cnblogs.com/findumars/p/5010743.html
Copyright © 2011-2022 走看看