当前位置: 首页 > article >正文

kanzi做3d时钟屏保

在这里插入图片描述
用kanzi做一个3d屏保

1. blender制作3d数字模型

下载一些好看的字体文件,用blender建模字体模型,导出fbx格式

2. 新建kanzi工程

导入fbx模型,创建节点,时分秒节点,最上面放一个按钮,用来点击
在这里插入图片描述
根据喜好给个火焰贴图,在shader里让uv随时间移动
在这里插入图片描述
screen背景透明
在这里插入图片描述

3. 代码

3.1 识别桌面分辨率

Application* createApplication()
{
    //获取win 桌面分辨率
     // 获取桌面窗口的句柄
    HWND hDesktopWnd = GetDesktopWindow();

    // 获取桌面窗口的设备上下文句柄
    HDC hDesktopDC = GetDC(hDesktopWnd);

    screenWidth = GetSystemMetrics(SM_CXSCREEN);
    screenHeight = GetSystemMetrics(SM_CYSCREEN);
    printf("screenWidth:%d, screenHeight:%d\n", screenWidth, screenHeight);

    // 释放设备上下文句柄
    ReleaseDC(hDesktopWnd, hDesktopDC);

    return new DesktopTime;
}

3.2 设置窗口透明

    virtual void onProjectLoaded() KZ_OVERRIDE
    {
        // Project file has been loaded from .kzb file.

        // Add initialization code here.

        // 使用FindWindow函数查找窗口句柄
        hwnd = FindWindow(L"KanziWindow", NULL);
        //Transparent background
        LONG ret = ::GetWindowLong(hwnd, GWL_EXSTYLE);
        ret = ret | WS_EX_LAYERED;
        ::SetWindowLong(hwnd, GWL_EXSTYLE, ret);
        ::SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 255, LWA_COLORKEY | LWA_ALPHA);


3.3 绑定按键

 kanzi::TimerSubscriptionToken timerid = addTimerHandler(this->getMessageDispatcher(), kanzi::chrono::milliseconds(20), KZU_TIMER_MESSAGE_MODE_REPEAT, bind(&DesktopTime::onTimeOutEventHandler, this));

        Button2DSharedPtr btn = getScreen()->lookupNode<Button2D>("#Button 2D");

        if (btn) {
            btn->addMessageHandler(Button2D::PressedMessage, bind(&DesktopTime::onBtnClicked, this, std::placeholders::_1));
        }

点击屏幕控制开关

void onBtnClicked(ButtonConcept::PressedMessageArguments& messageArguments)
    {
        (void)messageArguments;
        //kzLogDebug(("{} {} ", __FUNCTION__, isOpen));

        isOpen = !isOpen;

3.4 定时器更新时间和动画坐标

void onTimeOutEventHandler()
    {
        m_anim->Update(20);

        PageHostSharedPtr p = getScreen()->lookupNode<PageHost>("#RootPage");
        if (p) {
            //获取系统时间
            SYSTEMTIME st;
            GetLocalTime(&st);

            //设置时间
            p->setProperty(DynamicPropertyType<int>("DesktopTime.hour1"), st.wHour >= 10 ? (int)(st.wHour / 10) : 0);
            p->setProperty(DynamicPropertyType<int>("DesktopTime.hour2"), st.wHour >= 10 ? st.wHour % 10 : st.wHour);

            p->setProperty(DynamicPropertyType<int>("DesktopTime.minute1"), st.wMinute >= 10 ? st.wMinute / 10 : 0);
            p->setProperty(DynamicPropertyType<int>("DesktopTime.minute2"), st.wMinute >= 10 ? st.wMinute % 10 : st.wMinute);

            p->setProperty(DynamicPropertyType<int>("DesktopTime.sec1"), st.wSecond >= 10 ? st.wSecond / 10 : 0);
            p->setProperty(DynamicPropertyType<int>("DesktopTime.sec2"), st.wSecond >= 10 ? st.wSecond % 10 : st.wSecond);

            p->setProperty(DynamicPropertyType<int>("DesktopTime.ScreenPosY"), m_y - screenHeight);
        }  

4. 效果

运行程序,桌面显示全屏3d数字屏保
点击画面,屏保向上退出,在屏幕顶显示黑条
点击黑条,屏保向下出现
请添加图片描述


http://www.kler.cn/a/459382.html

相关文章:

  • Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验
  • 深入解析Android JNI:以Visualizer为例
  • 永磁同步电机负载估计算法--自适应龙伯格观测器
  • 自动化办公 | 根据成绩进行自动评级
  • SpringBoot返回文件让前端下载的几种方式
  • excel怎么删除右边无限列(亲测有效)
  • 【算法day27】动态规划:基础2
  • 微软Win11内核迎新变,Rust语言助力提升系统安全可靠性
  • 第25天:信息收集-项目系统一键打点资产侦察企查产权空间引擎风险监测利器部署
  • 29. 书籍叠放
  • 大模型系列——旋转位置编码和长度外推
  • Django 模型中使用 `UniqueConstraint` 实现唯一性约束
  • 碰一碰发视频后端源码技术开发详解,支持OEM
  • VectorCAST入门指导
  • vue3大屏实现;使用使用CSS Grid实现大屏
  • wxWidgets 3.2.6发布 —— 发布于2024年9月9日
  • 【机器学习】-深度学习模型
  • 计算机网络 (16)数字链路层的几个共同问题
  • node.js之---单线程异步非阻塞 I/O
  • 【C++】unordered系列关联式容器及其底层结构
  • 网络安全|如何正确识别网络钓鱼攻击?
  • 【信息系统项目管理师】第14章:项目沟通管理-基础和过程 考点梳理
  • python Celery 是一个基于分布式消息传递的异步任务队列系统
  • 物联网如何改变我们的生活:从智能家居到智慧城市
  • IEDA 使用auto Dev编码助手配置Deep Seek V3
  • Conmi的正确答案——JAVA获取远程HTTP客户端访问的IP