做過(guò)界面開(kāi)發(fā)的人想必都清楚如果要用VC++來(lái)開(kāi)發(fā)漂亮的程序界面其難度真是苦不堪言, 當(dāng)然VC++可以作出漂亮的界面但要投入大量的人力和時(shí)間其代碼量可以用海量來(lái)形容。BUG自然也就不計(jì)其數(shù)。本文主要介紹如何采用VC++結(jié)合FLASH在短時(shí)間內(nèi)以及很少的人力投入的情況開(kāi)發(fā)出精美漂亮的軟件界面。在本例中VC++主要進(jìn)行相關(guān)數(shù)據(jù)邏輯及業(yè)務(wù)處理,F(xiàn)LASH則進(jìn)行相關(guān)的界面表現(xiàn)。FLASH和VC++之間采用XML流通信。VC++的XML解析庫(kù)為開(kāi)源的TinyXml解析庫(kù)。 本實(shí)例的開(kāi)發(fā)環(huán)境為visual studio 2003 + FLASH8.0。其效果圖如下:

下面將進(jìn)行詳細(xì)介紹:
1、首先建一個(gè)基于MFC的對(duì)話(huà)框應(yīng)用程序。
2、在對(duì)話(huà)框中插入名為Shockwave Flash Object的ActiveX控件.
3、為該FLASH控件添加相應(yīng)的變量即FSCommand消息處理函數(shù).
4、在OnInitDialog()函數(shù)添加如下代碼將相關(guān)數(shù)據(jù)傳給FLASH界面
1
// TODO: 在此添加額外的初始化代碼
2
//加載flash界面
3
char szBuf[256];
4
string szXml;
5
6
CString szFlashPath(m_FlashCtrl.GetModulePath());
7
szFlashPath += "演示界面.swf";
8
9
m_FlashCtrl.LoadMovie(0, szFlashPath);
10
MoveWindow(0, 0, 490, 345);
11
m_FlashCtrl.MoveWindow(0, 0, 490, 345);
12
13
//設(shè)置標(biāo)題欄
14
TiXmlElement xRoot("win_app");
15
sprintf(szBuf, "%u", 0xf0000006);
16
xRoot.SetAttribute("style", szBuf);
17
xRoot.SetAttribute("event", 13);
18
19
TiXmlElement xItem("item");
20
xItem.SetAttribute("title", "我的測(cè)試程序");
21
xRoot.InsertEndChild(xItem);
22
szXml << xRoot;
23
m_FlashCtrl.SetVariable("_root.g_Protocol.win_data", szXml.c_str());
24
25
//設(shè)置組合框的數(shù)據(jù)
26
xRoot.Clear();
27
szXml.clear();
28
xRoot.SetAttribute("event", 76);
29
30
TiXmlElement xQuery("query");
31
xQuery.SetAttribute("sel_item", 1);
32
//xRoot.InsertEndChild(xQuery);
33
34
xItem.RemoveAttribute("title");
35
xItem.SetAttribute("info", "武林外傳");
36
xQuery.InsertEndChild(xItem);
37
38
xItem.SetAttribute("info", "西游記");
39
xQuery.InsertEndChild(xItem);
40
41
xItem.SetAttribute("info", "三國(guó)演義");
42
xQuery.InsertEndChild(xItem);
43
44
xItem.SetAttribute("info", "紅樓夢(mèng)");
45
xQuery.InsertEndChild(xItem);
46
47
xItem.SetAttribute("info", "魔法英雄");
48
xQuery.InsertEndChild(xItem);
49
xRoot.InsertEndChild(xQuery);
50
51
szXml << xRoot;
52
m_FlashCtrl.SetVariable("_root.g_Protocol.win_data", szXml.c_str());
53
54
//設(shè)置列表框數(shù)據(jù)
55
xRoot.Clear();
56
xQuery.Clear();
57
szXml.clear();
58
xRoot.SetAttribute("event", 77);
59
xQuery.SetAttribute("sel_item", 1);
60
61
xItem.SetAttribute("info", "漢皇重色思傾國(guó)");
62
xQuery.InsertEndChild(xItem);
63
64
xItem.SetAttribute("info", "御宇多年求不得");
65
xQuery.InsertEndChild(xItem);
66
67
xItem.SetAttribute("info", "楊家有女初長(zhǎng)成");
68
xQuery.InsertEndChild(xItem);
69
70
xItem.SetAttribute("info", "養(yǎng)在深閨人未識(shí)");
71
xQuery.InsertEndChild(xItem);
72
73
xItem.SetAttribute("info", "天生麗質(zhì)難自棄");
74
xQuery.InsertEndChild(xItem);
75
76
xRoot.InsertEndChild(xQuery);
77
78
szXml << xRoot;
79
m_FlashCtrl.SetVariable("_root.g_Protocol.win_data", szXml.c_str());
5、在OnFsCommand()中處理FLASH發(fā)來(lái)的消息.
1
void CUIShowDlg::OnFsCommand(LPCTSTR command, LPCTSTR args)
2

{
3
try
4
{
5
int nEvent = 0;
6
TiXmlDocument xmlData;
7
xmlData.Parse(command);
8
if (xmlData.Error())
9
{
10
throw (__LINE__);
11
}
12
13
TiXmlElement *pRoot = xmlData.FirstChildElement();
14
if (NULL == pRoot)
15
{
16
throw (__LINE__);
17
}
18
pRoot->Attribute("event", &nEvent);
19
20
switch(nEvent)
21
{
22
case 0xff000000: //移動(dòng)窗口消息
23
SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);
24
break;
25
case 0xff000001: //關(guān)閉窗口
26
EndDialog(0);
27
break;
28
case 0xff000003: //最小化窗口
29
ShowWindow(SW_MINIMIZE);
30
break;
31
default:
32
break;
33
}
34
}
35
catch (
)
36
{
37
TRACE("\r\n收到無(wú)效的命令 : %s", command);
38
}
39
}
40
到此一款精美的軟件界面已經(jīng)開(kāi)發(fā)完成。有興趣的朋友可以下載我的源代碼看看。
/Files/beifangying/UIShow.rar