设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 11082|回复: 25
打印 上一主题 下一主题

[Access本身] Access中自绘自定义“控件”

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-3-16 14:17:53 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 站到终点站 于 2015-3-16 20:17 编辑

       在论坛也混了蛮长时间了,一直没有发表过什么专题性质的文章。主要是论坛上高手如云,很多学习过程中的问题在论坛上都能找到答案,特别是论坛的精华帖。通过不断学习,我也开始对一些问题形成了些自己的想法。比如最近一段时间碰到一个问题:关于Access中动态添加控件的问题,Access中要给Form动态添加控件之类的,必须切换到窗体的设计模式,即使通过VBA代码也必须这么做。以往碰到这个问题,一般的做法是在窗体中先添加固定数目的控件,然后窗体加载时将其隐藏,当需要动态添加时就将其显示出来,但是这个方法一旦超出当初添加控件的数目时,就没办法解决了,并且控件添加多了对窗体加载速度也有一定影响。另外的话也可以通过一些ActiveX控件来做到这些,不过要找到适合Access且适合自己需求的ActiveX控件并不是件容易的事情,鉴于此我就想怎么才能在窗体上动态添加控件。
       其实这个问题纠结了差不多有1年了,当初也想到来自绘这个途径,但是有好几个问题都不懂,所以解决不了。这些问题包括:
1、自绘的话,用什么在窗体上自绘?      肯定不能用Access的控件,线条、框什么的都不能用,因为这些都不能动态添加到窗体上。只有选择通过API来绘图,可以使用的包括GDI、GDI+。但是我那时对GDI和GDI+是一点了解都没有,所以画了很长时间研究VBA中用API、GDI跟GDI+。
2、要用API绘图就要有窗体句柄、要获得设备环境(DC),Access里怎么获取这些了?
     可能有些人马上会想到Access窗体有个hwnd属性啊,不就可以了吗?其实这里面还有些曲折,后面我会详细说。这里大家所要了解的是Access的窗体下面还包含了好几个,包括窗体页眉、主体跟窗体页脚,它们都有句柄,要进行绘图的话,你得获取对应的句柄,而不是直接使用Access窗体的hwnd属性。
3、以上2个问题解决了,还只是完成了在窗体上自绘,要怎样才能将这些自绘窗体像控件一样使用到其他窗体上了?
     可能大家看完这个问题,对Access有些了解的朋友会马上想到子窗体。但是当时我是想了1个星期才想到用子窗体,因为当初对这个问题我的想法是怎么在Access中做自定义控件,而没有想到怎么将窗体放到窗体里面这个方法。使用子窗体作为类似“控件”容器的承载体,这就解决的自定义控件的“容器”问题。
     好了,说完这几个问题,那么我再总结下要读懂本文内容所需要储备的知识,如果你还对以下内容完全不了解的话,我建议你首先百度下或者找找相关的书什么的了解下,当然你也可以继续读下去,因为我会尽力讲的通俗易懂。不过如果你感觉阅读的很吃力的话,那你最好还是补一补相关的内容再来。
1、VBA中如何使用API?
2、GDI是用来干什么的?如何使用GDI?GDI句柄跟设备环境的关系,如何用GDI绘图?
3、Access窗体的构成。
4、Access子窗体是什么?怎么使用子窗体?
5、VBA中的类模块是什么?怎么使用类模块?类模块属性、方法、事件怎么建立?
6、Access窗体与类模块的关系;
7、使用VBA代码怎么调用自定义“控件”?
8、集合在类模块中的使用;
     另外我也想说明一下,由于本贴内容可能会比较长,我会分批将所写内容更新进来,由于平时工作比较忙,可能一次更新的内容也不会太多,所以希望大家也不要急躁,慢慢看慢慢消化。另外相应的代码部分也有很多在调试之中,但是大部分主体的代码已经完成,我暂时不把源代码随帖子一起发布,我会将其中的大部分代码写到本贴里面并讲解,希望有兴趣的将贴看下去。


下面我们就开始讲怎么在Access来做一个类似TabControl的“控件”。
首先,我们来看下最终的效果,示例中包含了2个窗体,frmTest是个测试窗体,TabControl就是我们所谓的当作控件来使用的子窗体。另外还有些模块跟类模块,有些模块是无用的,因为我在做这个的时候,借鉴了部分代码,只是没有删除,我在后面会说到有哪些模块跟代码会使用到的,所以这里就不再说明各个模块的作用了。
双击打开frmTest,默认会建立3个框,相当于3个Tab,点击添加按钮,会自动添加Tab,点删除按钮会从最后依次删除Tab,在某个Tab上点击,会弹出一个对话框显示当前Tab的序号。


实例附件已上传,可以下载,部分代码还需要修改:













本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖1 订阅订阅
25#
发表于 2017-10-15 19:10:39 | 只看该作者
请问楼主,我在做申明时,为啥函数“DrawText”等调试不通过啊?
24#
发表于 2017-10-15 19:01:33 | 只看该作者
请问楼主,为何我在申明 “GetTextExtentPoint32”,“DrawText”等GDI函数时,调试不通过,显示函数未定义。
23#
发表于 2017-7-19 09:32:08 | 只看该作者
1111111111111111111111111111111
22#
发表于 2015-5-1 20:42:07 | 只看该作者
老师是在ACCESS2003下开发的?
21#
发表于 2015-5-1 20:31:22 | 只看该作者
强人,学习了

点击这里给我发消息

20#
发表于 2015-3-18 13:16:28 | 只看该作者
太好了,有空我也写一点心得,大家一起把access玩死{:soso_e120:}

点评

现在已经快被Access玩死了,所以转向jQuery了。^_^  发表于 2015-3-24 16:42

点击这里给我发消息

19#
发表于 2015-3-18 07:01:01 来自手机 | 只看该作者
赞一个
回复

使用道具 举报

点击这里给我发消息

18#
发表于 2015-3-17 09:02:20 | 只看该作者
占个位
回复

使用道具 举报

点击这里给我发消息

17#
发表于 2015-3-16 21:56:27 | 只看该作者
强贴,我也来摆个板凳
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-2-27 04:05 , Processed in 0.240093 second(s), 42 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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