M8 SDK蹒跚学步(1)



掌叔
2009-01-14 09:48:44

摘自:[url]http://www.meizu.com/[/url]
作者:looyea

前1-5肯定是原来SDK附带例子的分析了,以后会慢慢增加对SDK学习的相关内容。也希望已经开发程序的人员,把自己的代码拿出来分享一下。
er。。。除了开头那个/* */内的内容意外,所有程序代码中/* */标注起来的内容为个人笔记,欢迎高手指正,小白提问,喷子退散!

/************************************************************************/
/*
* Copyright (C) Meizu Technology Corporation Zhuhai China
* All rights reserved.
* 中国珠海, 魅族科技有限公司, 版权所有.
*
* This file is a part of the Meizu Foundation Classes library.
* Author: 欧桂斌
* Create on: 2008-12-1
*/
/************************************************************************/

//////////////////////////////////////////////////////////////////////////
//这个示例用到了MZFC类库中的应用程序类CMzApp、窗口类CMzWnd,及一些UiWin派生的控件类
// 使用MZFC创建窗口应用程序的最基本步骤:
// 1. 从CMzWnd派生主窗口类(添加控件,及控件的响应处理)
// 2. 从CMzApp派生主应用程序类
// 3. 定义应用程序全局变量
//////////////////////////////////////////////////////////////////////////


//请先创建一个Win32智能设备的空项目
//设置好项目的头文件目录及输入库目录指向MZFC库的相应目录
//在这个项目里添加一个sample.cpp文件,并把这片代码粘贴进去,即可编译运行

// 引用mzfc库头文件
#include

/// 本项目演示了使用MZFC中的:
/// 应用程序的启动,窗口的创建,
/// 及Ui按钮控件、命令消息的处理

/* 宏定义,定义了测试变量101, 作为按钮的ID,以后就用它标识这个按钮了,哈哈 */
#define MZ_IDC_TESTBTN1 101

// 从CMzWnd派生主窗口类
class CSample1MainWnd: public CMzWndEx
{
/*
MZFC的窗口类及其派生类的窗口类名的声明宏
有点像windows窗口类的注册的感觉
*/
MZ_DECLARE_DYNAMIC(CSample1MainWnd);
public:
// 主窗口中的子窗口变量:一个按钮
UiButton m_btn;

protected:
// 重载窗口初始化函数
virtual BOOL OnInitDialog()
{
// 先调用基类的初始化函数
/* 如果不能创建父级窗口就返回false出错 */
if (!CMzWndEx::OnInitDialog())
{
return FALSE;
}

// 初始化主窗口中的控件
/*
#define MZC_BUTTON_PELLUCID 0x0001
半透明按钮
*/
m_btn.SetButtonType(MZC_BUTTON_PELLUCID);
/*
virtual void UiWin::SetPos (
int x,
int y,
int w,
int h,
UINT flags = 0
) [virtual]
首先我们声明的UiButton是继承自UiWin类,
这个SetPos方法就是UiWin的,这里是子类继承了
父类方法。
四个参数分别是,xy坐标,长度(width宽)和宽度(height高)
最后一个参数因为有默认值,所以调用这个方法的时候不指定
值也是可以的。其值有三个选项0,SP_NOMOVE,SP_NOSIZE,
就是默认、不改变控件位置、不改变控件大小
*/
m_btn.SetPos(100,250,280,100);
/*
当前这个控件的ID号,就是最开始我们设定的那个,文档中给出的是:
nID 控件的ID,由于MZ_WM_COMMAND 消息中的LOWORD(wParam) = 控件ID, 因此要求控件的ID不大于65535.
以后就可以用这个ID标识这个设备了(button)
*/
m_btn.SetID(MZ_IDC_TESTBTN1);
/*
设定按钮上的显示的字符串
L代表的是LPCTSTR类型的字符串
这个函数仅仅接受这种类型的参数
而双引号里面的是char数组,所以要
强制类型转换
*/
m_btn.SetText(L"Exit Hello MZFC!");
/*
设置文字颜色
RGB是取颜色函数,用过Adobe产品的都知道
3个255就是白色
*/
m_btn.SetTextColor(RGB(255,255,255));

// 把控件添加至窗口中
AddUiWin(&m_btn);

/* 完成以上工作之后表明,当前这个窗口类创建成功 */
return TRUE;
}

// 重载MZFC的命令消息处理函数
/*
点击按钮后,会产生一个单击事件,如果不做处理会没有任何效果,因此这里添加事件处理函数
这个名字是固定的,这里是OnMzCommand,有两个参数
这两个参数的描述在MZ_WM_COMMAND中有说明
第一个wParam,其中的低16位代表的是触发事件的控件ID,不大于65535,就是FFFF
第一个wParam的高16位代表的消息通知
第二个参数LParam代表的是消息附加的数据,根据控件的不同,有不同的意思
这里是按钮,按照Document说明代表出发此消息时鼠标的坐标。
不过我们这个方法不用这么复杂,所以没有用到这个。
*/
virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
{
/*
无符号整形指针,哈哈,这里用到刚才我们的那个id了
首先取ID,低16位
*/

UINT_PTR id = LOWORD(wParam);
/* 判定ID */
switch(id)
{
/* 如果ID跟我们给那个按钮定义的ID一样的话,说明是我们的按钮触发的事件*/
case MZ_IDC_TESTBTN1:
{
/*
首先说说MzMessageBoxEx方法。它的作用是弹出一个提示对话框,这个函数在这里调用的时候有5个参数
第一个是窗口句柄,说白了,可以“权且”当成我们当前这个窗口类产生的实例的ID,就像那个Button的ID一样
第二个是对话框中的内容
第三个是弹出对话框中的标题,目前的设置是标题无效,为什么?看看效果你就知道了,呵呵,压根没有标题栏!
第四个是对话框按钮的类型,就好比windows经常弄的那个,什么yes no about,yes,yes no等等。根据Document
它有如下可选择的,具体的含义,顾名思义。
MZ_OK 、 MZ_OKCANCEL 、 MZ_ABORTRETRYIGNORE 、 MZ_YESNOCANCEL 、 MZ_YESNO 、 MZ_RETRYCANCEL
第五个是设置此窗口在收到Home键时的返回值,这个我们后述
这个函数的返回值就是你选中的按钮。具体是
“返回选中的按钮 YES-1,NO-2,OK-1,RETRY-1,CANCEL-2,ABORT-2,IGNORE-3”
因为当前的选项是这个对话框只有Yes 和 No按钮,根据上面的列表,如果点击的是yes就返回1
所以,下面这条语句的意思就是:
如果在弹出对话框中点中了yes按钮(显示在M8上的时候是“是”),就执行PostQuitMessage函数
*/
if(1 == MzMessageBoxEx(m_hWnd, L"你按了“退出”按钮,真的想退出吗!", L"退出", MB_YESNO, false))
PostQuitMessage(0);
/*
PostQuitMessage是……,是什么呢?M8 SDK的三个document都没有给~嘿嘿,这个不要紧
我们还有MSDN不是~,开开MSDN,搜之,哦,出来了很明显标注出来WinCE 5.0 -_-|||
MSDN指出:本函数的意思是一个线程Thread发出退出请求,后面括号里面那个int类型的参数表示退出代码
这里0表示啥毛病没有,退了~~
*/
}
break; /* 跳出当前的case 判断 */
}
}
};

/*
MZFC的窗口类及其派生类的窗口类名的定义宏
前面有个,不过那个是声明
这个表示的是实现了的类
*/
MZ_IMPLEMENT_DYNAMIC(CSample1MainWnd)


// 从CMzApp派生主应用程序类
/*
这里CMzApp是一个标准mz应用程序,前面那个类是窗口,
窗口类不能执行,能够执行的类都是应用程序,在应用程序中
创建一个新的窗口类。
*/
class CSample1App: public CMzApp
{
public:
// 主窗口变量
/*声明了一个窗口类的变量,但是还没有实例化,换句话说,有了概念,没有实体,有了目标,资金没到位*/
CSample1MainWnd m_MainWnd;

// 重载Init函数
virtual BOOL Init()
{
/*
这个函数依然MSND之,查到两个,我以第二个WinCE 5.0的为准
为调用(这个函数的)线程初始化COM库,设置线程的并发模式,并且如果当前线程需要会为其创建一个新的apartment
两个参数:
第一个LPVOID,void类型的长指针,保留,设定为NULL,这里直接给0了
第二个DWORD,双字类型,设定线程的并发模式,我们这里默认的就是COINIT_MULTITHREADED,多线程!SB IP就不是……可惜了FreeBSD那么好的系统
关于这个函数还有更多的内容,下次我们再详说把。
*/
CoInitializeEx(0, COINIT_MULTITHREADED);
//创建主窗口
/* 首先,获取当前的工作区大小,白话文就是当前屏幕上能显示程序的面积 */
RECT rcWork = MzGetWorkArea();
/*之后创建我们前面那个窗口类,并设置为全屏显示*/
m_MainWnd.Create(rcWork.left,rcWork.top,RECT_WIDTH(rcWork),RECT_HEIGHT(rcWork), 0, 0, 0);
/*顾名思义了*/
m_MainWnd.Show();

return TRUE;
}
};


// 应用程序全局变量
/*创建一个程序实例,运行就全靠它了~*/
CSample1App theApp;


cool007zqw
2010-05-29 09:52:31

这帖子没人顶我觉得很可惜。


love_xiaolu
2010-06-12 14:17:36

可惜我不是用m8,不过还是支持了,


a68537699
2010-06-30 13:12:08

顶个吧~~


forgetmenot
2010-09-01 11:35:22

嗯,感觉有点少呢~顶下~这个我觉得挺好的呢~