迷你5207专属论坛

注册

 

发新话题 回复该主题

[魅族M8] M8SDK学习之SetTimer和UiPicture的简单使用方法 [复制链接]

发表者
银光图片

一、SetTimer

经常我们会利用系统时针来进行一些定时处理,比如显示时间、M8Dock的动画处理效果、包括UiList的滚动效果,可见用处非常的大。我在写一个进度窗口时就用到了Timer事件,原理很简单,就是让一个滚动条不断的在滚动,如下图:

就是让一个这个方块在这个槽里面来回滚动,我的方法便是用窗口的OnTimer事件里进行处理。当然这仅仅是简单的实现了一个动画。

要在窗口里使用OnTimer事件,就必须调用SetTimer来设置时钟消息,这样OnTimer就会定时的响应消息了。代码如下:
  1. user32.dllSetTimer  UINT_PTR SetTimer(      
  2.     HWND hWnd,    
  3.     UINT_PTR nIDEvent,    
  4.     UINT uElapse,    
  5.    TIMERPROC lpTimerFunc);
复制代码
这是函数原型,有四个参数,含义如下:
1、HWND hWnd
这个参数是用于传入需要定制定时器的窗口句柄,必须设置这个句柄,系统在发送消息时才能到达。
2、UINT_PTR nIDEvent
这个参数用于设置一个定时器事件的ID,如果有多个定时器时通过这个ID来区分是哪一个定时器触发。
3、UINT uElapse
用于设置定时器的间隔时间,也就是多少时间触发一次,单位精确到毫秒,比如:设置为1000表示为1秒。设置后每隔一秒会触发一次OnTimer
4、TIMERPROC lpTimerFunc
这个便是回调函数,用于自定义一个处理函数,由于在魅族SDK提供的窗口封装中已经实现了整套处理机制,通常我们是不需要再设置这个参数了,写入一个NULL便可。如果需要这个参数就查MSDN吧,有非常详细的说明。

看完函数后,我们来看一行示例代码:
  1. uResult = SetTimer(m_hWnd,
  2.            IDT_MOUSETRAP,
  3.            60
  4.             NULL); // timer callback  
  5. if (uResult == 0)
  6. {
  7.      ErrorHandler("No timer is available.");
  8. }
复制代码

上面代码实现了一个定时器设置,其中IDT_MOUSETRAP为一个整型值,自己随便定一个值即可。通过检查uResult的值便可知是否成功设置了定时器。这样窗口中便会接收到Timer事件了。
接下来我们重写OnTimer,以响应定时器事件:
  1.   
  2. virtual void OnTimer(UINT_PTR nIDEvnet)  
  3. {
  4.     //做你想做的事情吧。
  5. }
复制代码
这个OnTimer会每60毫秒执行一次。好啦,定时器就是这么简单。

二、UiPicture

在实现进度窗口时,需要两副图片,一副是背景图片,一副是移动的小方块。那如何将图片显示呢?魅族SDK提供了UiPictureUiPicture2两个控件,可以非常简单方便的实现图片显示。使用也非常简单,就和其他的控件一样,举个例子:
  1.     
  2. m_Picture.SetID(MZ_IDC_PICTURE1);    m_Picture.SetPos(0,0,GetWidth(),GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR);    m_Picture.SetPaintMode(modeId[m_modeIndex]);    m_Picture.LoadImage(MzGetInstanceHandle(),RT_RCDATA,MAKEINTRESOURCE(IDR_JPG_PIC1));AddUiWin(&m_Picture);
复制代码

这是魅族SDK带的例子-11中截取的源代码,其中的m_Picture便是UiPicture控件,看见了吧非常的简单,就是有一行代码特殊一些:
m_Picture.LoadImage(MzGetInstanceHandle(),RT_RCDATA,MAKEINTRESOURCE(IDR_JPG_PIC1));
这个方法是通过调用资源文件中的图片资源,要调用这句之前就必须将图片放在资源文件里。有没有更方便一点的方法?比如说直接调用图片文件?有的,而且是同样的方法,只不过参数换换就好咯,我们打开UiPicture的头文件,便会发现:
  1. /// 从文件加载图片        
  2. void LoadImage(LPCWSTR filename, bool bUseAlpha=true);
复制代码
这个LoadImage是个重载方法,实现了两种方式的图片加载,对的,只要将上面的代码换成:
  1. m_Picture.LoadImage(L"DISK\\PIC\\Image1.jpg", true);
复制代码
这样就能将Image1.jpg显示出来啦,非常简单吧。

另外魅族还提供了UiPicture2这个控件,有什么不同呢?看看例子中的代码便知:
  1.     
  2. //设置控件m_Picture2的属性,使用ImagingHelper加载图片    
  3. m_Picture2.SetID(MZ_IDC_PICTURE2);    m_Picture2.SetPos(0,0,GetWidth(),GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR);    m_Picture2.SetPaintMode(modeId[m_modeIndex]);    m_ImgHelper.LoadImageFromRes(MzGetInstanceHandle(),RT_RCDATA,MAKEINTRESOURCE(IDR_JPG_PIC2),true,true);m_Picture2.SetImage(&m_ImgHelper);
复制代码

可以发现这里面使用了m_ImgHelper,这个是ImagingHelperImagingHelper是用于载入图像的帮助类,然后m_Picture2调用的是SetImage()方法,很明显了,UiPicture便是用ImagingHelper作为图片提供者来实现图片显示的。直接点就是UiPicture直接封装了ImagingHelper,而UiPicture2便没有封装,从而提供了一个更灵活的方式。

两种方式大同小异,在具体实现时可以视情况使用,最后提一个方法SetPaintMode(),这个方法在前面两代码中都有使用,作何用处呢?查看头文件:
  1. /// 设置图片绘制模式:::MZ_PAINTMODE_NORMAL, MZ_PAINTMODE_xxxx, 等.        
  2. void SetPaintMode(int nMode);
复制代码

用于设置图片绘制模式的,比如在窗口中需要显示一副背景图片,但是前景图片比窗口小,这时就可以将绘制模式设置为拉伸,这样只要将UiPicture设置为填充整个窗体即可,因为图片会填充整个UiPicture,也就填充了整个窗口了。绘制模式有下面几种:
  1. /// 普通方式,图片居中显示
  2. #define MZ_PAINTMODE_NORMAL                0x0000
  3. /// 拉伸图片至整个控件矩形
  4. #define MZ_PAINTMODE_STRETCH        0x0001
  5. /// 平铺图片至整个控件矩形
  6. #define MZ_PAINTMODE_TILE                0x0002
  7. /// 只水平拉伸
  8. #define MZ_PAINTMODE_STRETCH_H                0x0003
  9. /// 只竖直拉伸
  10. #define MZ_PAINTMODE_STRETCH_V                0x0004
  11. /// 只水平平铺
  12. #define MZ_PAINTMODE_TILE_H                0x0005
  13. /// 只竖直平铺
  14. #define MZ_PAINTMODE_TILE_V                0x0006
复制代码

这个在Uipicture.h中开头可以查到。如果想知道具体的效果查看SDK的例子-11或者自己写一个程序试试吧。



作者:5207
出处:http://www.mini188.com
本文版权归作者所有,欢迎转载请注明出处,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本主题由 皇帝 5207 于 2010-12-27 22:53:31 执行 设置高亮 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
沙发

问一下~ 为什么我载入图片会出现丢色的现象呢?
  不管是用外部载入还是资源文件~~

代码如下~
  m_Picture.SetID(MZ_IDC_PICTURE1);
    m_Picture.SetPos(0,0,GetWidth(),GetHeight());
    m_Picture.SetPaintMode(MZ_PAINTMODE_STRETCH);
    m_Picture.LoadImage(L"Disk\\A-try\\Editbj.jpg",true);
    AddUiWin(&m_Picture);
TOP
凳子

回复 2# sprone 的帖子

没有遇到过。

能显示的话就不应该是控件本身的问题,有可能是其他操作引起。
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
地板

回复 3# 5207 的帖子

啊?  其他操作??   那我也不好怎么问了哈~~
额~  大大什么时候有时间能够看看我的代码不?
我QQ:100311632
  希望大大有时间的时候能够看看~  感激不尽~~
TOP
5#

回复 4# sprone 的帖子

加QQ群吧:58105627
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
6#

回复 2# sprone 的帖子

我也有这个问题。试了png和jpg都一样。
TOP
发新话题 回复该主题