基于MPF的动态天气背景QQ界面

        本文拟使用MPF来制作带有动画天气切换的QQ界面,MPF是一款采用C++写的优秀的界面引擎,其实现了WPF依赖属性事件系统(事件的隧道、冒泡等)以及控件模板定制,最大程度使得绘制、控件的状态变化对用户透明,相对于目前市面上的界面库有其自己的特点,目前其提供了内核(suicore.dll)和控件(suiwgx.dll)两个库,废话不多说,下面进入正题。

首先,使用Visual Studio2005建立一个win32工程(MPF本身不依赖任何版本的Visual Studio工具,我们也可以使用20082010都可以),工程名称为QQDemon,然后在Main函数里填入如下 代码:

         //加载资源文件

         suic::LoadRes("default.sres","def");

         suic::StringstrApp =_T("layout/QQ/QQDemonApp.xml");

          // 载入布局资源并运行系统

          suic::Application::RunApplication(newQQWindow(),strApp.c_str());

         启动代码够简单吧,下面对如上代码做一个解释,由于MPF分为核心引擎库和第三方的控件库(居于MPF内核扩展的控件),suic::LoadRes("default.sres","def");载入默认的样式、资源或布局文件,此文件支持加密;最后suic::Application::RunApplication(newQQWindow(),strApp.c_str());就是载入布局文件,主窗体使用分配的QQWindow窗体。QQWindow继承于内核的Window对象。

下面对"layout/QQ/QQDemonApp.xml"描述的布局做一个简单说明,因为,QQ2013主窗体支持动态背景天气变化,因此,在窗体布局里需要加入FlashBox用于显示动态天气变化Flash;注意,FlashBox必须位于窗体布局的第二层(第一层为主窗体布局),其它的诸如标题,搜索栏等位于其上,布局代码片段如下(完成请查看资源包):

        <PanelName="MainPanel"HorizontalAlignment="Stretch"VerticalAlignment="Stretch"Background1="{bk}" >

           <!--背景动画-->

           <FlashBoxName="TitleFlash"Width="620"Height="342"Source="swf/sun.swf"HorizontalAlignment="Right" />

           <PanelName="TopPanel"HorizontalAlignment="Stretch"VerticalAlignment="Top"Height="125" >

               <!--标题栏-->

               <StackLayoutHorizontalAlignment="Stretch"VerticalAlignment="Top"Height="22" >

                       <LabelName="CapText"GlowTextColor="#FFFFFF"Foreground="#222222"Font="{CapFont}"Text="QQ2013"Margin="4,0,0,0"

                          HorizontalAlignment="Stretch"VerticalAlignment=" Stretch"VerticalContentAlignment="Center" />

 

                   <ButtonName="SkinBtn"Style="{SkinButton}" ToolTip="更改外观" />

                   <SystemMinButton Name="SysMin"ToolTip="最小化" />

                   <SystemCloseButtonName="SysClose"ToolTip="最大化" />

               </StackLayout>

    对于QQ的登录界面也是同样原理,完成后的效果先启动QQ登录界面,如下:

   

点击做了简单的输入验证处理,只有输入了QQ号码和密码才能进入主窗体,否则提示错误,效果如下:

输入了QQ号码和密码后,进入QQ的主面板窗口,效果如下:

进入后天气默认为晴天(因为测试用,没有连接实时天气),为了达到和QQ的相同的文字发光效果,需要在元素绘制属性加入GlowTextColor="#FFFFFF",标识绘制白色的发光文字效果,布局代码片段如下:

<!--标题栏-->

    <StackLayoutHorizontalAlignment="Stretch"VerticalAlignment="Top"Height="22" >

<LabelName="CapText"GlowTextColor="#FFFFFF"Foreground="#222222"

    下面为了实现动态的天气变化效果,加入一个定时器,5秒后天气效果切换到下雨,因为MPF支持窗体定时器(传统的WM_TIMER消息)和线程定时器,我们这里简单使用窗体定时器,在Window里的OnLoaded里启动定时器,为什么要在OnLoaded事件里启动窗口定时器呢,那是因为MPF只有接收到OnLoaded事件后真实的窗体才存在,所以,设置的定时器也才有效果,代码如下:

    voidQQWindow::OnLoaded(suic::LoadedEventArg&e)

{

       __super::OnLoaded(e);

       LoginWindowPtrlogin(suic::Application::LoadComponent(newQQLoginWindow(),"layout/QQ/QQLogin.xml"));

 

    // 窗口居中显示

    CenterWindow();

   

    if (login)

    {

        login->SetOwner(this);

        login->ShowDialog();

 

        //登录不成功,直接关闭主窗口

        if (!login->IsLogin())

        {

            AsyncClose();

            return;

        }

    }

 

    // 初始化用户信息

    InitUserInfo();

    _timerId = SetTimer(1000);

}

上面红色部分就是启动了窗口定时器,变化频率为1秒钟,定时器代码如下:

if (_weather == 0 ||_weather == 5)

{

SetBackground(FindResource(_weather == 0 ?_T("bk") :_T("rain_bk")));

 ui::FlashBoxPtrflash(FindName(_T("TitleFlash")));

    flash->LoadMovie(_weather == 0 ?_T("swf/sun.swf") :_T("swf/rain.swf"));

suic::WidgetPtrweather(FindName(_T("Weather")));

weather->SetBackground(newsuic::ImageBrush(_T("images/QQ/Weather/Big_8.png")));

   

KillTimer(_timerId);

}

我们5秒后切换到雨天效果,并关闭定时器,因此,此后的界面都处于雨天效果状态,变化后的界面效果如下:

 

大家可以下载Demon实际运行看看效果,如果需要源码的,可以到群206378966进行咨询。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值