掌叔
2009-01-14 09:55:48
摘自:[url]http://www.meizu.com/[/url]
作者:looyea
这次把我自己写的东西用绿色标注了,标准的C++注释颜色,呵呵
同时上传了一些图片说明效果。
有兴趣的筒子们,可以自己试试。目前虽然有了SDK,但是一切都杂乱无章。也希望有了自己写过程序的同志们开源,供大家研究。发扬一下风格。GPL许可证就可以。
另外,5个例子都看完,突然发现——没有指针!!!我只好无语……
有人问C#好不?其实也可以,不过Mz显然没有C#的lib,所以只好在C#里面调用C++代码了,回头编译的时候需要打上危险代码编译那段选项。
个人习惯的是Java,C,C++,
// 引用mzfc库头文件
#include
/*
跟Sample01 一样都是定义了一些宏变量
前两个用来标注控件ID
后两个用来表征事件(OK 和 Cancel)
*/
#define MZ_IDC_TESTBTN1 101
#define MZ_IDC_TOOLBAR1 102
#define IDC_PPM_OK 103
#define IDC_PPM_CANCEL 104
// 从CMzWnd派生主窗口类
class CSample1MainWnd: public CMzWndEx
{
/* 动态声明 */
MZ_DECLARE_DYNAMIC(CSample1MainWnd);
public:
// 主窗口中的子窗口变量:一个按钮
UiButton m_btn;
/* 新建了一个文本工具栏,当然还有图形的,就是默认的M8画面下的那4个图标*/
UiToolbar_Text m_Toolbar;
protected:
// 重载窗口初始化函数
virtual BOOL OnInitDialog()
{
// 先调用基类的初始化函数
/* 如果初始化窗口成功就可以创建了,否则不创建这个窗口实例 */
if (!CMzWndEx::OnInitDialog())
{
return FALSE;
}
// 初始化主窗口中的控件
/* 跟前文书一样,说的都是初始化一个按钮,只不过,这次按钮上显示的文字是"Hello MZFC!" */
m_btn.SetButtonType(MZC_BUTTON_PELLUCID);
m_btn.SetPos(100,250,280,100);
m_btn.SetID(MZ_IDC_TESTBTN1);
m_btn.SetText(L"Hello MZFC!");
m_btn.SetTextColor(RGB(255,255,255));
// 把控件添加至窗口中
/* 把按钮添加到窗口中去,之后运行就可以看到下面图片的按钮了,权且成为hello按钮 */
AddUiWin(&m_btn);
[attach]613[/attach]
/*
这一步是设置画面最下方的菜单了。
*/
/*
先说这个设定位置的一句,无疑来说跟前一方一样,不过这里有点小技巧需要注意一下
首先是MZM_HEIGHT_TEXT_TOOLBAR这个变量知名了文本按钮工具条的高度,也就是我们画面下放那一横条的高度
那么GetHeight函数是系统调用,取得当前屏幕的高度
我们知道,屏幕的左上角坐标是(0,0),那么用屏幕的高度减去文本按钮工具条的高度就是文本按钮起始位置的纵坐标
所以这里的SetPosition含义就是,从横坐标0,纵坐标文本按钮工具条起始坐标开始,绘制屏幕宽度那么宽,
文本按钮工具条的高度那么高的文本按钮工具条。
*/
m_Toolbar.SetPos(0,GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR,GetWidth(),MZM_HEIGHT_TEXT_TOOLBAR);
/*设定完位置之后,开始给文本按钮工具条添加按钮*/
/*
SetButton是添加按钮到工具条的函数,它的四个参数依次是
按钮索引,是否显示,是否启用,按钮文本
所谓所以,就是排列的顺序,从左到右分别是012,代表了123
是否显示,顾名思义
是否启用,如果不启用,那么就应该是灰色的……(我没测试,凭以往windows开发经验断言的)
最后的文本就不说了
*/
m_Toolbar.SetButton(0, true, true, L"退出");
m_Toolbar.SetButton(1, true, true, L"菜单");
m_Toolbar.SetButton(2, true, true, L"隐藏按钮");
/* 给这个菜单 设置ID*/
m_Toolbar.SetID(MZ_IDC_TOOLBAR1);
/*添加到窗口中,之后运行程序就可以看到如下的文本按钮菜单栏了*/
AddUiWin(&m_Toolbar);
[attach]614[/attach]
return TRUE;
}
// 重载MZFC的命令消息处理函数
/* 这一段同第一个sample的一样 */
virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
{
/*首先转换ID*/
UINT_PTR id = LOWORD(wParam);
switch(id)
{
/*如果是按钮(hello MZFC)那个*/
case MZ_IDC_TESTBTN1:
{
/*
那么弹出一个对话框,上书“您太伟大了”,
标题是按钮的文本转化成C语言的字符串(记住,目前对话框标题没有被启用)
只有一个确定按钮
最后是home键按下时候此窗口的返回值,false,不返回home
*/
MzMessageBoxEx(m_hWnd, L"You are great!", m_btn.GetText().C_Str(), MB_OK, false);
[attach]615[/attach]
}
break;
/* 如果是我们屏幕最下方的工具栏 */
case MZ_IDC_TOOLBAR1:
{
/* 先转换索引 */
int nIndex = lParam;
/*
如果是第一个,就是退出那个
还记得上个例子么?我们说lParam在按钮情况是鼠标的xy坐标
这里就是文本菜单工具栏的索引值了
*/
if (nIndex==0)
{
/* Mz基础类库自己的字符串类型,先创建一个字符串变量,长度128 */
CMzString str(128);
/*
这个函数是把一个指定的字符串的值赋给另外一个指定的字符串变量
我们要给刚才str变量赋值,值是“您按下了xxx按钮”
其中那个xxx在函数中是个%s表示会被另外一个字符串替代
那么是谁替代了?就是刚才那个文本按钮工具栏中退出按钮的文本,
说白了就是“退出”俩字。
GetButtonText()方法取的是按钮上的文本,整数参数是文本的索引,还记得吧,
退出那个索引是0.
*/
wsprintf(str.C_Str(), L"您按了"%s"按钮!", m_Toolbar.GetButtonText(0).C_Str());
/* 这个就不多说了……意思一样的 */
MzMessageBoxEx(m_hWnd, str.C_Str(), L"Test", MB_OK);
PostQuitMessage(0);
return;
[attach]616[/attach]
}
if (nIndex==1)
{
/* 如果是中间那个菜单按钮按下了呢? */
// pop out a PopupMenu:
/* 首先创建一个弹出菜单 ppm */
CPopupMenu ppm;
/* 然后声明一个弹出菜单项属性的结构体 */
struct PopupMenuItemProp pmip;
/*
结构体是做什么呢?
首先里面的按钮类型说明了是半透明的
之后按钮文本是取消,就把开头取消那个ID给它
如果是确定就把确定的ID给它
最后添加到弹出菜单中
不过看代码,应该是深拷贝的,不然不能一个结构体用两次
*/
pmip.itemCr = MZC_BUTTON_PELLUCID;
pmip.itemRetID = IDC_PPM_CANCEL;
pmip.str = L"取消";
ppm.AddItem(pmip);
pmip.itemCr = MZC_BUTTON_ORANGE;
pmip.itemRetID = IDC_PPM_OK;
pmip.str = L"确定";
ppm.AddItem(pmip);
/*
跟第一个例子一样,获取工作区,是个长方形的区域,当前就是我们的屏幕
*/
RECT rc = MzGetWorkArea();
/*
这一段同文本按钮工具栏的意思一样,获取一个合适的坐标
只不过那个是设定位置,我们这里是在这个位置直接创建
*/
rc.top = rc.bottom - ppm.GetHeight();
ppm.Create(rc.left,rc.top,RECT_WIDTH(rc),RECT_HEIGHT(rc),m_hWnd,0,WS_POPUP);
/*
DoModal方法就是是当前窗体处于模态,什么意思?
说白了就是你只能按下我这个弹出菜单上一个按钮,
其他屏幕上其他区域都是无效
返回值是按下控件的ID
*/
int nID = ppm.DoModal();
[attach]617[/attach]
if (nID==IDC_PPM_OK)
{
// do what you want...
/*这里我们自己写一个对话框把,原来的程序没有的*/
MzMessageBoxEx(m_hWnd, L"您按下了确定按钮", L"Test", MB_OK);
[attach]618[/attach]
}
if (nID==IDC_PPM_CANCEL)
{
// do what you want...
/*这里我们自己写一个对话框把,原来的程序没有的*/
MzMessageBoxEx(m_hWnd, L"您按下了取消按钮", L"Test", MB_OK);
[attach]619[/attach]
}
return;
}
if (nIndex==2)
{
/*
记得前面第三个按钮的文本写着“隐藏”按钮是不是?
这里SetVisible方法是设置一个控件是否可见
如果是true则可见,否则就是不可见
IsVisible方法是查看当前控件是否可见,true可见,反之false
叹号表示取反,如果是真,那么取反就是假,反之是真
所以这句话的意思就是说,把那个hello mzfc的按钮设置成为
跟当前可见状态相反的可见状态,如果原来可见,就不可见;
如果原来不可见,现在变成可见
*/
m_btn.SetVisible(!m_btn.IsVisible());
/*
这个是让那个hello按钮所在的区域无效,
具体的概念可以参照一下window程序设计
这里简单的说,刚才那个hello按钮的区域必须重新绘图
*/
m_btn.Invalidate();
/*
这里Update方法就是重新绘制了,当然了因为
设定了visible属性,所以会根据这个属性进行绘制
如果true就设置,否则就画出那个hello按钮下面的画面
*/
m_btn.Update();
/*
我们的文本按钮也要变化,不然客户会发蒙的
如果hello按钮是可见的,那么设置当前文本是隐藏按钮
否则,是显示按钮
*/
if (m_btn.IsVisible())
m_Toolbar.SetButtonText(2, L"隐藏按钮");
[attach]620[/attach]
else
m_Toolbar.SetButtonText(2, L"显示按钮");
[attach]621[/attach]
/* 重绘工具栏,一边我们刚才改过的文字能够正确显示 */
m_Toolbar.Invalidate();
m_Toolbar.Update();
return;
}
}
break;
}
}
};
MZ_IMPLEMENT_DYNAMIC(CSample1MainWnd)
/* 往下这些不说了,跟上一个例子一样的,呵呵 */
// 从CMzApp派生主应用程序类
class CSample1App: public CMzApp
{
public:
// 主窗口变量
CSample1MainWnd m_MainWnd;
// 重载Init函数
virtual BOOL Init()
{
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.SetBgColor(RGB(0,0,0));
m_MainWnd.Show();
return TRUE;
}
};
// 应用程序全局变量
CSample1App theApp;