ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 84872|回复: 136

[原创]千奇百怪的窗体——想学吗?跟我来!

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-1-11 12:35 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:窗体

你是否看腻了四四方方的窗体? 你是否觉得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编辑过]

[原创]千奇百怪的窗体——向学吗?跟我来!

[原创]千奇百怪的窗体——向学吗?跟我来!

[原创]千奇百怪的窗体——向学吗?跟我来!

[原创]千奇百怪的窗体——向学吗?跟我来!

yFlfzi0b.rar

24.3 KB, 下载次数: 2060

[原创]千奇百怪的窗体——向学吗?跟我来!

XGbMW3ZA.rar

58.08 KB, 下载次数: 2266

[原创]千奇百怪的窗体——向学吗?跟我来!

评分

7

查看全部评分

TA的精华主题

TA的得分主题

发表于 2007-1-11 12:45 | 显示全部楼层

普及API,人人有责!

向你学习了,API是好东西!

TA的精华主题

TA的得分主题

发表于 2007-1-11 12:45 | 显示全部楼层
关闭后没有还原显示Excel界面.

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-11 12:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-1-11 13:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-1-11 13:07 | 显示全部楼层

.

[原创]千奇百怪的窗体——向学吗?跟我来!

[原创]千奇百怪的窗体——向学吗?跟我来!

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-11 13:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

总算传完了,不容易啊,传了n回。网络有问题

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-11 17:43 | 显示全部楼层

哈:看来对api感兴趣的人不多阿!

没有api ,vb 、vc就像少了一只手啊!

TA的精华主题

TA的得分主题

发表于 2007-1-12 09:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-1-12 11:23 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-27 13:52 , Processed in 0.059737 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表