kanzi做3d时钟屏保

用kanzi做一个3d屏保

1. blender制作3d数字模型

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

2. 新建kanzi工程

导入fbx模型,创建节点,时分秒节点,最上面放一个按钮,用来点击

根据喜好给个火焰贴图,在shader里让uv随时间移动

screen背景透明

3. 代码

3.1 识别桌面分辨率

c 复制代码
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 设置窗口透明

c 复制代码
    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 绑定按键

c 复制代码
 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));
        }

点击屏幕控制开关

c 复制代码
void onBtnClicked(ButtonConcept::PressedMessageArguments& messageArguments)
    {
        (void)messageArguments;
        //kzLogDebug(("{} {} ", __FUNCTION__, isOpen));

        isOpen = !isOpen;

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

c 复制代码
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数字屏保

点击画面,屏保向上退出,在屏幕顶显示黑条

点击黑条,屏保向下出现

相关推荐
少林6598 小时前
谷歌地图高清卫星地图2026中文版下载|谷歌地图3D卫星高清版 V7.3.6.9796 最新免费版下载 - 前端工具导航
3d·谷歌地图
LeonDL1688 小时前
HALCON 深度学习训练 3D 图像的几种方式优缺点
人工智能·python·深度学习·3d·halcon·halcon训练3d图像·深度学习训练3d图像
xhload3d2 天前
图扑软件 | 带你体验 Low Poly 卡通三维世界
物联网·3d·智慧城市·html5·webgl·数字孪生·可视化·工业互联网·三维建模·工控·轻量化·中国风·卡通动画·写实风格·科技风·low poly
图扑数字孪生2 天前
基于 HT for Web 轻量化 3D 数字孪生数据中心解决方案
3d·数字孪生·三维可视化·数据中心·智慧机房
njsgcs2 天前
PolyGen:一个用于 3D 网格的自回归生成模型 论文阅读
3d
Angel Q.2 天前
PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿
数码相机·算法·3d·pnp
AgilityBaby2 天前
UE5打包项目设置Project Settings(打包widows exe安装包)
c++·3d·ue5·游戏引擎·unreal engine
广州智造2 天前
OptiStruct实例:消声器前盖ERP分析(2)RADSND基础理论
数据库·人工智能·算法·机器学习·数学建模·3d·软件构建
lingxiao168883 天前
3D拟合测量水杯半径
3d
学步_技术3 天前
自动驾驶系列—Monocular 3D Lane Detection for Autonomous Driving
人工智能·机器学习·计算机视觉·3d·自动驾驶