ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] UI设计自制日历窗体(无需注册MSCOMCTL.OCX)

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-5 16:26 | 显示全部楼层
hisokou 发表于 2023-10-5 00:06
不错,值得参考

感谢您的肯定与支持!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-5 16:59 | 显示全部楼层
ggmmlol 发表于 2023-10-5 00:41
13楼的附件,用EXCEL2010测试时通过,但用Excel 2007测试时出现错误。现予以修正,见附件:

感谢您的深度测试和宝贵的反馈!您做的修改我已细心拜阅,现已整合到最新版里去了,请见附件!多谢斧正!


在这里也顺便给其他朋友说一下所修改的地方。主要就是两个API函数的声明和调用问题,GetWindowLongPtr和SetWindowLongPtr这两个函数在32位的Windows系统是没有的,这两个函数在32位系统上会调用它们之前的版本:
GetWindowLongA函数.png
GetWindowLongPtrA函数.png

日历窗口示例_2023-10-05更新.zip

55.23 KB, 下载次数: 61

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-5 17:00 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-10-5 17:05 | 显示全部楼层
micch 发表于 2023-10-5 13:49
电脑右下角日期点击弹出的日历是这样的。

感谢评论!

其实……一开始我想实现的就是这个效果,但……没法实现。

让我们一起期待能实现这个效果的高手吧!

TA的精华主题

TA的得分主题

发表于 2023-12-22 11:26 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-23 18:31 | 显示全部楼层
pao810 发表于 2023-12-22 11:26
在窗体的文本框里怎么调用?能给下代码吗?

感谢评论!

原先的示例代码是在工作表中调用和显示日历窗体,思路是获取活动单元格的位置信息(单位是点,points),将该位置信息转化为像素坐标(单位是像素,pixels),然后将日历窗体移动到单元格所在位置。

在窗体的文本框上调用和显示日历窗体的思路是一样的:获取文本框的点位置,转化为像素坐标,再把日历窗体移动到该坐标即可。

只是,直接简单的这样做会有一个明显的小问题:日历没法实时跟着窗体移动。如果要让日历实时跟着窗体移动,还要子类化窗体,处理 WM_WINDOWPOSCHANGED 消息,这样处理完全能实现,没问题,但会使得简单问题复杂化。

因为原先的示例代码就是已经把日历控件放在了一个窗体上,以窗体作为容器,这个窗体上只有日历这一个控件。[窗体+日历控件]作为一个整体,显示在工作表上。当时这么做的目的主要就是不想子类化Excel工作簿,拖慢Excel的运行速度(虽然肉眼难以分辨),直接子类化窗体会方便和安全得多。

如果窗体上有很多控件,比如文本框、命令按钮、复选框、列表框等等,日历只是其中一个。那么,可以以[日历控件]作为一个整体,显示在窗体上,这种情况下日历控件就是窗体的一个子窗口(Child Window),日历控件可以实时跟着窗体移动。

要实现上述功能,原先的代码已不适用,为此我将日历控件的代码从整体代码中剥离出来,写成了一个单独的类,可以像添加文本框、命令按钮一样在窗体的代码里面添加,想加多少个就加多少个。完整示例代码请见附件。以下是运行效果预览:

运行效果-日历隐藏状态

运行效果-日历隐藏状态

运行效果-日历显示状态

运行效果-日历显示状态

示例代码中有个code文件夹,里面有两个模块: UserFormSubclass.bas 和 SysMonthCal32.cls 。在窗体的代码中调用的例子以及代码注释如下图所示:

调用示例(以及代码注释)

调用示例(以及代码注释)

在之前的楼层以及示例代码中我提到的“这只是一个极简的例子,还有很多的可自定义的空间”,在此一并解释下:日历控件,包括很多其它的Windows提供的原生控件,都有很多样式可以选择。比如此例中,日历上方的星期几显示的缩写形式,也可以显示完整形式(“Mon”显示为“Monday”,“一” 显示为“星期一”等),还可以选择是否显示“今天”按钮和日期,点击“今天”按钮会跳转到当前日期。官网给的示例截图直接显示两个月的日历页面,还包含了当前周数,日历控件的大小包含了更多的空白部分(留白是平面设计上的一个常用技巧和基础设计原则):

官网给的示例截图

官网给的示例截图

附件中的代码依旧是极简的例子,自定义样式我就留给使用者自己实现了。毕竟,萝卜白菜,各有所爱。


如果喜欢,可以送两朵花或者评论留言让我知道(花了半天时间写的代码是值得的)。祝好!

CalendarDemo.zip

45.21 KB, 下载次数: 47

示例代码(2023-12-23)

TA的精华主题

TA的得分主题

发表于 2023-12-23 19:30 | 显示全部楼层
本帖最后由 pao810 于 2023-12-23 20:01 编辑

收到楼上分享,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-23 20:02 | 显示全部楼层
pao810 发表于 2023-12-23 19:30
窗体文本框的调佣代码能不能分享一下?谢谢

26楼给的代码就是窗体文本框的调用代码

TA的精华主题

TA的得分主题

发表于 2023-12-23 20:24 | 显示全部楼层
刚刚试了一下,想在多个文本框调用,不会弄,还有就是想在点击日期后自动隐藏控件

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-12-24 13:01 | 显示全部楼层
pao810 发表于 2023-12-23 20:24
刚刚试了一下,想在多个文本框调用,不会弄,还有就是想在点击日期后自动隐藏控件


已写好,请见附件。运行效果如下(这窗体界面随便画的,仅作示例,将就一下)

图1 Win10+Excel2019运行效果

图1 Win10+Excel2019运行效果


在此提一个要求:把你的Windows版本和Office软件版本号(以及32位还是64位),以及运行效果截图,回复此楼层。

比如我的是Windows 10 64位,Microsoft Office 2019 64位,运行效果截图如上。





祝好。

窗体多个文本框调用日历.zip

50.3 KB, 下载次数: 73

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 05:33 , Processed in 0.052135 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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