M8 SDK蹒跚学步(3)



掌叔
2009-01-14 15:47:29

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

#include

/// 本项目演示了使用MZFC中的:
/// 应用程序的启动,窗口的创建,
/// 及Ui按钮控件、命令消息的处理,
/// 文字按钮工具条,及弹出菜单,提示信息对话框
/// 及UiList列表控件的使用,MZ_WM_MOUSE_NOTIFY消息的处理

[attach]622[/attach]

/* 前面一样的内容我就直接掠过,可以直接看前两个 */
#define MZ_IDC_LIST 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:
UiToolbar_Text m_Toolbar;
/* 列表类, 创建了一个类型为UiList名字为m_List的变量 */
UiList m_List;

protected:
// 重载窗口初始化函数
virtual BOOL OnInitDialog()
{
// 先调用基类的初始化函数
if (!CMzWndEx::OnInitDialog())
{
return FALSE;
}

// 初始化主窗口中的控件

/*
首先初始化的是列表控件
注意一下最后绘制的结尾,就是高度那块,
因为不能够遮挡住下面的文本按钮菜单栏
所以要刨除那一块的高度。结果就是:
GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR
这个语句的执行结果就是,把这个控件绘制在
屏幕下方文本菜单栏以上的所有可用空间
*/
m_List.SetPos(0,0,GetWidth(),GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR);
m_List.SetID(MZ_IDC_LIST);
/*
顾名思义了,这一段是设置垂直滑块的
设置为真,则允许,假则不允许使用垂直滑块
*/
m_List.EnableScrollBarV(true);
/*
Document上的解释是:设置是否把控件收到的鼠标消息(MZ_WM_MOUSE_NOTIFY)发送给主窗口
当前的主窗口就是我们的这个窗口类了
如果是,那么当这个列表控件产生任何事件的时候,就会发送到我们的这个窗口类
而我们这个窗口类,因为事件处理函数
所以就能响应了。
*/
m_List.EnableNotifyMessage(true);
/* 添加到主窗口类了 */
AddUiWin(&m_List);

//add items to list
/* 下面开始给我们的列表添加列表项 */
CMzString str(128);

/*
终于见到指针了!!!这才有点C和C++的意思么。
这个是列表项的常量,后面%d同C中的一样,
表示这里要用一个十进制整数代替%d
*/
wchar_t *buf = L"列表项目 - %d";
/*
列表项类,生成一个实例
*/
ListItem li;
/* 循环50次,生成50个列表项 */
for (int i=0;i<50;i++)
{
wsprintf(str.C_Str(), buf, i);
/* 把列表项的文本设置成为我们刚才的那个 */
li.Text = str;

[attach]623[/attach]

/* 在列表里面添加一个列表项 */
m_List.AddItem(li);
}

m_Toolbar.SetPos(0,GetHeight()-MZM_HEIGHT_TEXT_TOOLBAR,GetWidth(),MZM_HEIGHT_TEXT_TOOLBAR);
m_Toolbar.SetButton(0, true, true, L"退出");
m_Toolbar.SetButton(1, true, true, L"删除");
m_Toolbar.SetButton(2, true, true, L"设置");
m_Toolbar.SetID(MZ_IDC_TOOLBAR1);
AddUiWin(&m_Toolbar);


return TRUE;
}

/* 窗口消息处理函数,第一个参数用一个无符号整形代表消息类型,后面的就都跟前两个例子一样了 */
LRESULT MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
/*
“MZFC库中Ui控件发出的鼠标通知消息”,这里所谓的通知是什么恩?
“控件上发生的鼠标按下、移动、放开操作都会通过此消息通知它所在的窗口”
而我们刚才设定了所在的窗口是我们这个窗口类的实例,
所以消息才会被传送到这里。
WParam低16位控件ID,高16位通知类型
lParam:消息发生时鼠标的坐标(相对于控件的左上角)x = LOWORD(lParam), y = HIWORD(lParam)
*/
case MZ_WM_MOUSE_NOTIFY:
{
/*取控件ID,取得通知类型*/
int nID = LOWORD(wParam);
int nNotify = HIWORD(wParam);
/*取鼠标坐标*/
int x = LOWORD(lParam);
int y = HIWORD(lParam);
/* 如果是那个列表发出的消息,并且通知类型是鼠标左键按下 */
if (nID==MZ_IDC_LIST && nNotify==MZ_MN_LBUTTONDOWN)
{
/* 如果鼠标左键不实在滚动列表的时候被按下 并且列表没有在鼠标按下后移动过 */
/* 这么写的目的是防止你在滚动列表的时候选中列表中的项目 */
if (!m_List.IsMouseDownAtScrolling() && !m_List.IsMouseMoved())
{
/* 计算鼠标坐标,得到列表按下的是那个项目 */
int nIndex = m_List.CalcIndexOfPos(x, y);
/* 设定那个按下的项目为选中, 这里实际上有个排他性在里面,因为仅仅允许一个列表项被选中,一定会有多选的情况。以后研究明白了再说*/
m_List.SetSelectedIndex(nIndex);
/* 重绘那个被选中的项目,高亮了,呵呵 */
m_List.Invalidate();
m_List.Update();

[attach]624[/attach]

}
return 0;
}
/* 如果是列表控件发出的消息,并且消息类型是鼠标移动 */
if (nID==MZ_IDC_LIST && nNotify==MZ_MN_MOUSEMOVE)
{
/* 取消选择的列表项,并且重绘整个列表 */
m_List.SetSelectedIndex(-1);
m_List.Invalidate();
m_List.Update();
return 0;
}
/* 下面的代码原本就是被注释掉了的,我这里看了一下,也不难,根据上面的内容,读者完全可以理解 所以掠过*/
//if (nID==MZ_IDC_LIST && nNotify==MZ_MN_LBUTTONDOWN)
//{
// if (!m_List.IsMouseDownAtScrolling() && !m_List.IsMouseMoved())
// {
// m_List.SetSelectedIndex(-1);
// m_List.Invalidate();
// m_List.Update();
// }
// return 0;
//}
}
return 0;
}
/*
若消息类型不是MZ_WM_MOUSE_NOTIFY,
那么交给父类的这个函数进行处理,并且返回父类的值,
否则列表不会对其他消息做出反应呵呵
*/
return CMzWndEx::MzDefWndProc(message,wParam,lParam);
}

// 重载MZFC的命令消息处理函数
/* 命令处理函数就是专门针对按钮和菜单的 */
virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
{
UINT_PTR id = LOWORD(wParam);
switch(id)
{
case MZ_IDC_TOOLBAR1:
{

int nIndex = lParam;
/* 如果选中了 退出 按钮 */
if (nIndex==0)
{
CMzString str(128);
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;
}
/* 如果选中了 删除 按钮 */
if (nIndex==1)
{
// pop out a PopupMenu:
CPopupMenu ppm;
struct PopupMenuItemProp pmip;

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);
int nID = ppm.DoModal();
if (nID==IDC_PPM_OK)
{
// do what you want...
/*
并且点击了确定这个弹出菜单的按钮
那么获取列表中被选择的那一项的索引
让列表移除这个索引,
*/
int nSel = m_List.GetSelectedIndex();
m_List.RemoveItem(nSel);
/* 让列表处于未被选中的状态,就是列表中没有任何一个列表项被选中,画成高亮 */
m_List.SetSelectedIndex(-1);
/* 跟前面一样,重绘列表 */
m_List.Invalidate();
m_List.Update();
/* 这里我自己加一个messagebox */
CMzString str(128);
wchar_t *buf = L"您删除了列表项%d!";
wsprintf(str.C_Str(), buf, nSel);
MzMessageBoxEx(m_hWnd, str.C_Str(), L"Test", MB_OK);

[attach]625[/attach]

}
if (nID==IDC_PPM_CANCEL)
{
// do what you want...
/* 如果cancel了,那么什么也不做 */
}
return;
}
if (nIndex==2)
{
CMzString str(128);
wsprintf(str.C_Str(), L"您按了"%s"按钮!", (LPWSTR)m_Toolbar.GetButtonText(2));
MzMessageBoxEx(m_hWnd, str.C_Str(), L"Test", MB_OK);
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(MzGetThemeColor(TCI_WINDOW_BG));
m_MainWnd.Show();

return TRUE;
}
};


// 应用程序全局变量
CSample1App theApp;