你是否看腻了四四方方的窗体? 你是否觉得api离你很遥远? 错!api很简单,api就在你身边,谁都可以会。 每个api函数都有特定的功能,而且都是写好的,你只要拿来用。 就像到菜场买菜,想吃啥就买啥。 今天我就给大家上一堂奇形怪状的窗体课。 一、关于VBA里的窗体 VBA 里的窗体不像 VB 的窗体,要对窗体用api函数,首先你得找到此窗体。 就是获得它的句柄 ,所谓句柄就是指向窗体的指针的地址,可能有点 复杂。 别管那么多,你就把窗体但做是一把菜刀,你要用就 的握住刀柄。每个窗体的句柄是唯一的。 在vb里很简单用me.hwnd就可以了。在vba里就麻烦一点: 先用函数Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long dim hwnd as long If Val(Application.Version) < 9 Then hwnd = FindWindow("ThunderXFrame", Me.Caption)'97 Else hwnd = FindWindow("ThunderDFrame", Me.Caption)'2000 End If 找到窗体,才能用。 二、关于无边框显示 窗体的蓝色的边框是否不好看,你是否想自己来设计?首先你要去掉边框。 在vb里窗体有6种模式,在窗体属性里就可以选择,第一种就是无边框,第二种就是vba里的,右上角 只有一个叉 的。第三种就是常见的右上角有最大、最小化和叉的。可是vba里只有一种,没得选择。 因为vba的窗体时寄生 在Excel里的,不能独立。那有没有办法呢? 世上 没有不可能的事。 先用函数 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Const GWL_STYLE As Long = (-16) Private Const WS_CAPTION As Long = &HC00000 IStyle = GetWindowLong(hwnd, GWL_STYLE) 获得窗体的样式,GWL_STYLE是窗体的样式,获得后给他加个条件: IStyle = IStyle And Not WS_CAPTION Not WS_CAPTION就是无边框了。 接下来把新样式赋给他,用函数 Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long SetWindowLong hwnd, GWL_STYLE, IStyle 赋了新样式之后,你得重新画窗体,用重画函数: Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long DrawMenuBar hwnd 搞定了。 三、关于无边框窗体的拖动 没有边框了,窗体不能拖了怎么办?上次有人问我,我也提供了一种方法,可是太麻烦了。 api早就为我们想好了更简单的方法。 用一下两个函数: Private Declare Sub ReleaseCapture Lib "user32" () Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_NCLBUTTONDOWN = &HA1 Private Const HTCAPTION = 2 就能实现。将以下代码放到mousemove或mousedown事件下就 ok了。 If Button = 1 Then Dim hwnd As Long If Val(Application.Version) < 9 Then hwnd = FindWindow("ThunderXFrame", Me.Caption) Else hwnd = FindWindow("ThunderDFrame", Me.Caption) End If ReleaseCapture SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& End If 有人说啥意思啊?ReleaseCapture是为当前的应用程序释放鼠标捕获 SendMessage 是向窗体发送消息,WM_NCLBUTTONDOWN 就是标题栏点击左键 HTCAPTION 点击标题 ,合起来就是模拟鼠标点在标题栏上。 四、改变窗体的形状 开始讲重点了,要使 窗体变形,先得自己画出想要的形状,咋画?有函数: Private Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long 此函数用来画 矩形 ,x1,y1 就是矩形的左上角的坐标,x2,y2就是右下角的坐标。 有人说我不想画 矩形 阿。呵呵 任何图形都可以用矩形拼出来,就是微积分的思想了。 下面就以画圆形为例; 要画 一个半径为100的圆形,将圆分成100个矩形,我们将矩形的坐标放在sheet1里。 矩形的坐标怎么设呢?相信大家都有一定的数学基础把,要学好计算机,数学和英语是必备的。
七、总结 看过此帖,你是否也学会了呢? 会了可别忘了顶啊,以便让更多的人能学会。 普及API,人人有责!
[此贴子已经被作者于2007-5-24 9:09:25编辑过] |