智能手機(jī)Smartphone開發(fā)從零起步_第1頁
智能手機(jī)Smartphone開發(fā)從零起步_第2頁
智能手機(jī)Smartphone開發(fā)從零起步_第3頁
智能手機(jī)Smartphone開發(fā)從零起步_第4頁
智能手機(jī)Smartphone開發(fā)從零起步_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、智能手機(jī)Smartphone開發(fā)從零起步    智能手機(jī)Smartphone開發(fā)從零起步          本文從零開始講述了進(jìn)行smartphone開發(fā)的整個(gè)過程,通過本文的閱讀,你可以從中獲得:    1、 安裝smartphone的開發(fā)環(huán)境    2、 配置smartphone的開發(fā)環(huán)境    3、 配置模擬器。    4、 連接模擬器到ActiveSync。    5、

2、 一個(gè)通用性好、擴(kuò)展性強(qiáng)的smartphone編程框架。    6、 在smartphone窗口中繪制文本,使用消息提示框等。    7、 安裝我們的smartphone程序。      下面所有描述均以Microsoft smartphone 2003 簡(jiǎn)體中文版操作平臺(tái)為例。      安裝開發(fā)環(huán)境    目前有兩種開發(fā)環(huán)境可供選擇,一種基于C+,另一種則是基于.NET架構(gòu)的VB.net和C#,鑒于C+的靈活,結(jié)構(gòu)相對(duì)比較清晰(最重要的一點(diǎn)是我在C+下面的開發(fā)經(jīng)驗(yàn)要比在V

3、S.NET上多一些),在下面的例子本文將選用第一種方案。      一、C+開發(fā)環(huán)境    1、安裝ActiveSync 3.7.1    這個(gè)軟件用于連接及同步桌面windows系統(tǒng)和smartphone設(shè)備,連接成功后,你會(huì)在桌面上看到一個(gè)smartphone設(shè)備的虛擬目錄,你可以在桌面windows下對(duì)這個(gè)目錄下的內(nèi)容進(jìn)行修改,所有的修改會(huì)同步更新到smartphone設(shè)備上。    2、安裝Microsoft eMbedded C+ 4.0 和Microsoft eMbedded C+ 4.0 S

4、P3    目前最新的有Microsoft eMbedded C+ 4.0 SP4,也可以安裝。    3、安裝SDK for Windows Mobile? 2003-based Smartphones    不用多說,所有smartphone相關(guān)的內(nèi)容都由它提供。    4、安裝 Localized Emulation Images for Windows Mobile? 2003-based           

5、;  Smartphone    對(duì)于Mobie設(shè)備開發(fā)而言,模擬器是非常重要的,它用來模擬真實(shí)的smartphone設(shè)備,讓你能夠在Windows桌面平臺(tái)上調(diào)試驗(yàn)證你的程序而不需要連接到一個(gè)真實(shí)設(shè)備,在smartphone的sdk中已經(jīng)包含了一個(gè)英文的模擬器,這里我們要安裝的是一個(gè)簡(jiǎn)體中文的版本,安裝文件是Smartphone             2003 SDK Chinese Simplified Emulation Images,它讓我們可以在

6、模擬器上顯示中文內(nèi)容。    5、Windows Mobile Developer Power Toys for smartphone    這里面提供了一些幫助你開發(fā)和調(diào)試的工具,常用的有"Emulator ActiveSync Connection             Tool",可以讓你連接ActiveSync到我們的模擬器,這樣我們就可以在桌面端實(shí)時(shí)顯示完整的目錄結(jié)構(gòu);還有"ActiveSync 

7、0;           Remote Display",一個(gè)有趣的工具,可以將你的smartphone顯示屏幕同步顯示在桌面窗口中。    安裝注意:    進(jìn)行安裝時(shí),1到3是必須安裝的,并且,牢記不要改變13的順序,也不能改變安裝程序所指定的默認(rèn)路徑,否則一旦安裝失敗,你可能需要重新安裝操作系統(tǒng)才能解決問題(痛苦呢),這主要是因?yàn)?         &

8、#160;  "Microsoft Windows CE platform manager 4.0"不能被完全卸載的緣故。            建議你在安裝了Microsoft eMbedded C+             4.0后,馬上啟動(dòng)它看一下,如果不能啟動(dòng),就不用再向下進(jìn)行了,不要使用Windows自帶的卸載程序,到網(wǎng)上找比較強(qiáng)大的卸載

9、工具來卸載eMbedded             C+,然后重新安裝即可。      二、VB.net或C#開發(fā)環(huán)境    1、安裝ActiveSync 3.7.1    2、安裝VS.net 2003    3、安裝SDK for Windows Mobile? 2003-based Smartphones    4、安裝 Localized Emulation Image

10、s for Windows Mobile 2003-based             Smartphone    5、安裝Windows Mobile Developer Power Toys for smartphone    其中,13是必須安裝的,4和5可選安裝,原因前面已經(jīng)說明了。    因?yàn)橄旅媾渲瞄_發(fā)環(huán)境我都是以C+環(huán)境而言的,因此,如果你使用VS.NET開發(fā),你會(huì)發(fā)覺有些地方會(huì)有差異,但涉及的基本概念和原理都是

11、一樣的。    對(duì)于VS.NET,你可以在 工具-選項(xiàng)-設(shè)備工具-設(shè)備里面發(fā)現(xiàn)并配置你的模擬器。祝你好運(yùn)。    配置開發(fā)環(huán)境    1、配置模擬器    1) 啟動(dòng)Microsoft eMbedded C+ 4.0    2) 選擇菜單tools->configure platform manager.    在Smartphone 2003中新增加一個(gè)設(shè)備CHS_SMARTPHONE 2003 Emulator    3) 選中新增的設(shè)備,點(diǎn)擊p

12、roperties    選擇Transpor為TCP/IP Transport for Windows CE;選擇Startup為Emulator             Startup Server,如下:    4) 配置Emulator Startup Server    在Image中選擇CHS Smartphone 2003(Virtual Radio),其余保持不變    5) 返回Devic

13、e Properties對(duì)話框,點(diǎn)擊test    如果配置正確的話,模擬器會(huì)被啟動(dòng)起來,如下:    6) 模擬器配置完成。    2、連接ActiveSync到模擬器    配置好模擬器后,我們已經(jīng)可以進(jìn)行開發(fā)了,但因?yàn)橹挥蠥ctiveSync能夠展示出設(shè)備的目錄結(jié)構(gòu),因此只有使ActiveSync連接了模擬器,那個(gè)模擬器在開發(fā)中才能夠代替一臺(tái)真正的smartphone手機(jī)。    將ActiveSync連接到模擬器一共有兩種辦法,一種是通過串口進(jìn)行環(huán)回,需要使用null modem 

14、60;           cable連接,另一種是使用以太網(wǎng)卡的Virtual             Switch服務(wù),讓ActiveSync以為模擬器是從以太網(wǎng)接口卡連接進(jìn)來的真實(shí)設(shè)備,因?yàn)槭褂肰irtual             Switch速度快,也不需要硬件電纜,因

15、此我們以這種連接方式為例。    鑒于這一部分是個(gè)難點(diǎn),在我們開發(fā)時(shí),很多同事都碰到了配置不成功的情況,因此,此處將列出詳細(xì)的步驟:    1) virtual switch服務(wù)確認(rèn)    打開你的網(wǎng)絡(luò)鄰居,觀察在"本地連接"的屬性對(duì)話框,確認(rèn)有如下服務(wù):"virtual PC Emulated Ethernet             Switch",這是你安裝模擬器的時(shí)候安裝程序自動(dòng)

16、幫你安裝的,如果沒有發(fā)現(xiàn),請(qǐng)重新安裝smartphone 2003 SDK。    2) 配置模擬器使用virtual switch服務(wù)    啟動(dòng)Microsoft eMbedded C+ 4.0,菜單tools->configure platform             manager.->CHS_SMARTPHONE 2003 emulator->Emulator Startup Server:   

17、; 3) 配置你的ActiveSync能夠通過以太網(wǎng)連接設(shè)備    打開ActiveSync,菜單 文件-連接設(shè)置,選擇允許通過網(wǎng)絡(luò)(以太網(wǎng))以及遠(yuǎn)程訪問服務(wù)器(RAS)與此臺(tái)計(jì)算機(jī)建立連接。    4) 啟動(dòng)模擬器    注意,我們的中文模擬器需要從EC+內(nèi)部啟動(dòng),因?yàn)橥獠縎DK菜單上的模擬器是安裝SDK時(shí)默認(rèn)安裝的英文模擬器。    5) 連接ActiveSync與模擬器    1)、首先,進(jìn)入SDK工具:    2)、然后在命令行輸入:   

18、0;         emuascfg /sp "smartphone 2003" "chs_smartphone 2003 emulartor"    其中"smartphone 2003"是操作平臺(tái)名,"chs_smartphone 2003             emulartor"是設(shè)備/模擬器名。

19、等待運(yùn)行結(jié)束后,關(guān)閉命令窗口。    6) 進(jìn)入模擬器,打開ActiveSync程序,選擇同步    這時(shí),你能看到你安裝的ActiveSync在任務(wù)欄有了反應(yīng),最終,模擬器上顯示已連接。    結(jié)束    此時(shí),模擬器可以通過以太網(wǎng)接口利用virtual switch服務(wù)連接到ActiveSync上去了。    我們可以把這個(gè)模擬器當(dāng)作一個(gè)真的設(shè)備對(duì)待,可以給它安裝各種軟件,可以給它定義安裝主屏幕等等,對(duì)于開發(fā)來說,我們可以使用ActiveSync的瀏覽功能看到smartphone的目錄結(jié)構(gòu),

20、在開發(fā)涉及到文件改變的程序時(shí)非常有幫助。            一些基本概念    因?yàn)樵谏厦鏀⑹鲋猩婕傲艘恍㏒martphone的基本概念,作為入門的文章,下面,我對(duì)涉及到的一些概念進(jìn)行解釋。    1) Platform Manage    在安裝Microsoft eMbedded C+ 4.0時(shí)候會(huì)提示你首先要安裝Platform        &#

21、160;    Manage,這是整個(gè)開發(fā)系統(tǒng)中非常核心的組件,它負(fù)責(zé)開發(fā)工具與實(shí)際的設(shè)備或者模擬的設(shè)備間所有的通訊。正是因?yàn)樗帘瘟诵畔⒔粨Q的細(xì)節(jié),才使得開發(fā)中模擬器可以作為一個(gè)真實(shí)的設(shè)備對(duì)待。    2) ActiveSync Transport與TCP/IP Transport    上面選擇設(shè)備的Transport時(shí)候,有這樣兩種選擇,ActiveSync             Transport一般用于與

22、真實(shí)smartphone設(shè)備的連接,而TCP/IP             Transport既可以和真實(shí)設(shè)備也可以和模擬設(shè)備進(jìn)行連接,因?yàn)門CP/IP             Transport連接速度快且支持模擬設(shè)備,在開發(fā)調(diào)試的時(shí)候是首要選擇。    3) ActiveSync Startup Server與Emulator Startup Serve

23、r    所謂啟動(dòng)服務(wù)就是將編譯好的程序download到所連接的設(shè)備上然后執(zhí)行,ActiveSync Startup             Server利用當(dāng)前的ActiveSync連接來進(jìn)行,設(shè)置可以通過ActiveSync程序進(jìn)行;Emulator Startup             Server必須使用TCP/IP Transport支持。開發(fā)

24、調(diào)試的時(shí)候,一般選擇Emulator Startup Server。    4) Virtual Radio與Radio Required    在配置Emulator Startup Server時(shí)候,有這兩種Image選擇,其中,Radio             Required需要相應(yīng)的無線發(fā)送設(shè)備支持而Virtual Radio則不需要,在最終測(cè)試時(shí)候,往往會(huì)需要Radio      &

25、#160;      Required,開發(fā)和調(diào)試時(shí)候選擇Virtual Radio。      實(shí)踐開發(fā)    1、開發(fā)實(shí)例準(zhǔn)備    鑒于本篇的定位,本文的例子是一個(gè)很簡(jiǎn)單的程序,運(yùn)行后,程序主窗口會(huì)顯示一行歡迎信息;程序底部會(huì)有兩個(gè)菜單,一個(gè)是"關(guān)于",一個(gè)是"選項(xiàng)","選項(xiàng)"是一個(gè)彈出式菜單,上面有兩個(gè)菜單項(xiàng)"關(guān)于"和"退出"。    執(zhí)行"

26、;關(guān)于"菜單會(huì)顯示一個(gè)標(biāo)準(zhǔn)的信息對(duì)話框;執(zhí)行"退出"菜單,會(huì)首先顯示一個(gè)消息提示窗口,提醒你是否確認(rèn)要退出,你可以選擇"確定"退出本程序,也可以選擇"取消"返回到程序的主界面。    下面是軟件執(zhí)行時(shí)的情況:    2、第一步:建立通用框架    因?yàn)镾martphone不支持MFC,因此,我們需要建立一個(gè)基于Windows CE API的編程框架,有過桌面開發(fā)或者Pocket        &#

27、160;    PC開發(fā)經(jīng)驗(yàn)的人會(huì)很清楚這個(gè)過程,包括注冊(cè)窗口類、實(shí)例初始化、消息循環(huán)及窗口過程回調(diào)處理等,在Smartphone上也是一樣的。    1) 打開eMbedded C+ 4.0 ,F(xiàn)ile -> New ,建立一個(gè)Smartphone 2003 工程:    注意,選擇了WCE ARMV4 和WCE emulator 使我們可以編譯在模擬器和真實(shí)設(shè)備運(yùn)行的程序。    點(diǎn)擊OK按鈕進(jìn)入下一步。    2) 選擇建立一個(gè)空的工程。    確認(rèn)后此

28、工程被建立。    這里之所以不使用系統(tǒng)的標(biāo)準(zhǔn)框架是因?yàn)闃?biāo)準(zhǔn)框架采用的是老式的消息處理方案,使用了很多的switch             語句來處理消息,不夠靈活,也不方便程序的擴(kuò)展,因此,這里從一個(gè)空的工程開始,仿照MFC消息映射的做法來構(gòu)建一個(gè)結(jié)構(gòu)良好,代碼優(yōu)美的框架,作為我們開發(fā)smartphone程序的基礎(chǔ)。    3、選擇File->New新建一個(gè)C+源文件First.cpp和C+頭文件First.h,并同時(shí)加入First工程

29、。    4、編寫文件First.h和First.cpp如下,文件很短,關(guān)鍵的地方已經(jīng)使用紅色標(biāo)注出來了,如果你有興趣,可手工敲入下面的代碼,以加深你對(duì)這個(gè)基本過程的了解。    /=   / first.h 文件    / 避免頭文件的重復(fù)包含   #ifndef _CHUYUNFENG_FIRST_H_   #define _CHUYUNFENG_FIRST_H_    / 計(jì)算需要處理的消息數(shù)目   #define MSG_NUM

30、(x) (sizeof(x) / sizeof(x0)    / 整個(gè)程序的消息映射結(jié)構(gòu)   typedef struct tagMSG_MAP_MAIN      UINT nMsg;   LRESULT (*pMsgProcess)(HWND, UINT, WPARAM, LPARAM);    MSG_MAP_MAIN_S;    / 命令消息(WM_COMMAND)的消息映射結(jié)構(gòu),因?yàn)閮烧咛幚砗瘮?shù)   / 的參數(shù)不同,調(diào)用場(chǎng)合也

31、不同,因此這里需要單獨(dú)建立,類似的有   / WM_NOTOFY消息,本程序中不涉及   typedef struct tagMSG_MAP_CMD      UINT nMsg;   LRESULT (*pMsgProcess)(HWND, WORD, HWND, WORD);    MSG_MAP_CMD_S;    / 聲明程序中用到的全局變量   extern const TCHAR g_szAppName; 

32、0; extern HINSTANCE g_hInstance;   extern HWND g_hMainWnd;   extern const MSG_MAP_MAIN_S g_mainMsg;   extern const MSG_MAP_CMD_S g_cmdMsg;    / 窗口處理函數(shù)原型   LRESULT CALLBACK mainWndProc(HWND, UINT, WPARAM, LPARAM);    / 需要處理的主框架消息定義函數(shù) &#

33、160; LRESULT onCreate(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam);   LRESULT onPaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam);   LRESULT onCommand(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam);   LRESULT on

34、Destroy(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam);    / 需要處理的菜單命令消息定義函數(shù)   LRESULT onAbout(HWND hWnd, WORD idItem, HWND hwndCtl,WORD    wNotifyCode);   LRESULT onExit(HWND hWnd, WORD idItem, HWND hwndCtl,WORD    wNotifyCode); &#

35、160;  #endif /_CHUYUNFENG_FIRST_H_    /=   / First.cpp 文件    #include <windows.h>    #include <windowsx.h>   #include <aygshell.h>   #include "resource.h"    #include "First.h"  

36、0; / 定義程序中用到的全局變量   const TCHAR g_szAppName = _T("First");   HINSTANCE g_hInstance;   HWND g_hMainWnd;    / 程序中需要處理的消息映射,如果要增加,在此處增加一   / 對(duì)msgID,onMsgProcFun,然后寫對(duì)應(yīng)的消息處理函數(shù)即可。   const MSG_MAP_MAIN_S g_mainMsg =    

37、60; WM_PAINT, onPaint,   WM_COMMAND, onCommand,   WM_CREATE, onCreate,   WM_DESTROY, onDestroy   ;    /此處放置需要處理的命令消息   const MSG_MAP_CMD_S g_cmdMsg =       IDM_ABOUT, onAbout,   IDM_EXIT,onExit    ; &

38、#160;  /=   / WinMain,入口函數(shù),由操作系統(tǒng)調(diào)用   /=   int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE    hPrevInstance,   LPWSTR lpCmdLine, int nCmdShow)       WNDCLASS wc;   MSG msg;    / 注冊(cè)窗口類    wc.sty

39、le = 0; / 窗口樣式   wc.lpfnWndProc = mainWndProc; / 回調(diào)函數(shù)   wc.cbClsExtra = 0; / 擴(kuò)展的類數(shù)據(jù)   wc.cbWndExtra = 0; / 擴(kuò)展的窗口數(shù)據(jù)   wc.hInstance = hInstance; /實(shí)例句柄   wc.hIcon = NULL, / 圖標(biāo)   wc.hCursor = NULL; / 鼠標(biāo)   wc.hbrBackground = (HBRUSH) G

40、etStockObject (WHITE_BRUSH);   wc.lpszMenuName = NULL; /菜單   wc.lpszClassName = g_szAppName; /窗口類的名字    if ( 0 = RegisterClass (&wc)   return 0; /注冊(cè)窗口類失敗    / 建立并顯示程序主窗口   g_hInstance = hInstance;   g_hMainWnd = CreateWindow (

41、g_szAppName, / 窗口類   _T("第一個(gè)演示程序"), /窗口標(biāo)題   WS_VISIBLE, /樣式   CW_USEDEFAULT, / x坐標(biāo)   CW_USEDEFAULT, / y 坐標(biāo)   CW_USEDEFAULT, / 初始寬度   CW_USEDEFAULT, / 初始高度   NULL, / 父窗口   NULL, /菜單,必須為NULL,WINCE窗口不支持菜單。 &#

42、160; hInstance, / 實(shí)例   NULL); /建立參數(shù)的指針,用于WM_CRATE消息期間。    if ( !IsWindow (g_hMainWnd) /建立窗口失敗   return 0;    ShowWindow (g_hMainWnd, nCmdShow);    UpdateWindow (g_hMainWnd);    / 消息循環(huán)    while (GetMessage (&msg, NULL, 0, 0) &#

43、160;     TranslateMessage (&msg);   DispatchMessage (&msg);      / WinMain函數(shù)成功則返回退出消息的wParam   return msg.wParam;      /=   / MainWndProc,窗口過程,回調(diào)函數(shù),由操作系統(tǒng)調(diào)用   /=   LRESULT CALLBACK mainWnd

44、Proc (HWND hWnd, UINT wMsg, WPARAM    wParam, LPARAM lParam)       / 處理我們需要處理的消息   int i;    for (i = 0; i < MSG_NUM(g_mainMsg); i+)       if (wMsg = g_mainMsgi.nMsg)   return (*g_mainMsgi.pMsgProcess)(hWnd, wMsg, wPa

45、ram, lParam);      / 有編寫對(duì)應(yīng)的函數(shù)則調(diào)用默認(rèn)的   return DefWindowProc (hWnd, wMsg, wParam, lParam);       /=   / onCreate,WM_CREATE 消息的處理函數(shù)   /=   LRESULT onCreate(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam)

46、60;     SHMENUBARINFO mbi;    / 初始化menubar結(jié)構(gòu)   memset(&mbi, 0, sizeof(SHMENUBARINFO);    mbi.cbSize = sizeof(SHMENUBARINFO); / 必須填充   mbi.hwndParent = hWnd;    mbi.nToolBarId = IDR_MAIN_MENUBAR;    mbi.hInstRes = g_hInsta

47、nce;    / 建立menubar控制   if (!SHCreateMenuBar(&mbi)       MessageBox (hWnd, _T("建立menubar失敗"),    g_szAppName, MB_OK);   DestroyWindow(hWnd);      /    return 0;      /= &#

48、160; / onPaint,WM_PAINT 消息的處理函數(shù)   /=   LRESULT onPaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam)      PAINTSTRUCT ps;    HDC hdc;    RECT rtClient;   GetClientRect (hWnd, &rtClient);    / 開始繪圖&

49、#160;  hdc = BeginPaint (hWnd, &ps);    / 在屏幕中間寫一句話   DrawText (hdc, _T("Smartphone第一個(gè)程序_"), -1,    &rtClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);    / 結(jié)束繪圖   EndPaint (hWnd, &ps);    return 0;   &#

50、160;  /=   / onCommand,WM_COMMAND 消息的處理函數(shù)   /=   LRESULT onCommand(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam)      /處理我們需要處理的命令消息   WORD wID, wNotifyCode;   HWND hwndCtl;   int i;   

51、/ 解析出參數(shù)   wID = (WORD) LOWORD (wParam);   wNotifyCode = (WORD) HIWORD (wParam);   hwndCtl = (HWND) lParam;    / 尋找消息映射結(jié)構(gòu),調(diào)用對(duì)應(yīng)的消息處理函數(shù)   for (i = 0; i < MSG_NUM(g_cmdMsg); i+)       if (wID = g_cmdMsgi.nMsg)   return (*

52、g_cmdMsgi.pMsgProcess)( hWnd, wID,    hwndCtl,wNotifyCode);      return 0;      /=   / onDestroy,WM_DESTROY 消息的處理函數(shù)   /=   LRESULT onDestroy (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam)   

53、   DestroyWindow(hWnd);   return 0;      /=   / onAbout,菜單消息IDM_ABOUT處理函數(shù)   /=   LRESULT onAbout(HWND hWnd, WORD idItem, HWND hwndCtl,WORD    wNotifyCode)      TCHAR szAboutMsg = _T("nnnttFirstnt

54、for smartphone    2003");   MessageBox(hWnd,szAboutMsg,_T("關(guān)于First"),MB_OK);    return 0;      /=   / onExit,菜單消息IDM_Exit處理函數(shù)   /=   LRESULT onExit(HWND hWnd, WORD idItem, HWND hwndCtl,WORD    wN

55、otifyCode)      if ( IDOK = MessageBox(hWnd, _T("真的要退出這個(gè)程序?"),   _T("退出確認(rèn)"),MB_OKCANCEL | MB_ICONASTERISK) )      PostQuitMessage(0);      return 0;      關(guān)鍵代碼分析:    代碼中最關(guān)鍵的地方就是使用消息

56、映射的辦法來處理消息,這主要體現(xiàn)在定義消息映射結(jié)構(gòu)和在窗口處理函數(shù)以及命令消息處理函數(shù)中進(jìn)行消息分發(fā)上面,實(shí)現(xiàn)可以參看代碼中的紅色部分。    5) 在框架上的開發(fā)。    我們構(gòu)建這個(gè)基本框架,是想使用這個(gè)框架進(jìn)行后續(xù)開發(fā)的,上述代碼中的綠色部分標(biāo)示出了增加WM_PAINT消息處理的整個(gè)過程:    1、 在.h文件中聲明消息處理函數(shù);    2、 在.c文件的消息映射結(jié)構(gòu)中增加一個(gè)消息映射對(duì);    3、 然后,在.c文件中實(shí)現(xiàn)此函數(shù)的功能即可。      3、

57、第二步:建立菜單    現(xiàn)在,我們來建立左右軟鍵對(duì)應(yīng)的菜單。    1) 確認(rèn)使用中文資源    因?yàn)橐褂觅Y源,因此,首先確認(rèn)我們項(xiàng)目所使用的是中文資源:選擇菜單項(xiàng) Project ->Settings,設(shè)置資源為中文:      2) 增加resource script文件并修改Evc的一個(gè)bugs    菜單File -> new ->增加一個(gè)resource script文件,名字為first.rc。      當(dāng)你在IDE中打開

58、這個(gè)RC文件時(shí),會(huì)發(fā)現(xiàn)一個(gè)錯(cuò)誤,這是eMbedded             C+處理smartphone上的一個(gè)bugs,微軟對(duì)此的修正方案是,提供了一個(gè)newRes.h的文件,你將First.rc中的#include             "afxres.h"修改為 #include      

59、0;      "newRes.h"即可,newRes.h文件你可以自行在程序目錄下建立,下面是newRes.h文件內(nèi)容:    #ifndef _NEWRES_H_   #define _NEWRES_H_    #if !defined(UNDER_CE)   #define UNDER_CE _WIN32_WCE   #endif    #if defined(_WIN32_WCE) 

60、60; #if !defined(WCEOLE_ENABLE_DIALOGEX)   #define DIALOGEX DIALOG DISCARDABLE   #endif   #include <commctrl.h>   #define SHMENUBAR RCDATA   #if defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE >= 300)   #include <aygshell.h&

61、gt;   #define AFXCE_IDR_SCRATCH_SHMENU 28700   #else   #define I_IMAGENONE (-2)   #define NOMENU 0xFFFF   #define IDS_SHNEW 1    #define IDM_SHAREDNEW 10   #define IDM_SHAREDNEWDEFAULT 11   #endif / _WIN32_WCE_PSPC 

62、  #define AFXCE_IDD_SAVEMODIFIEDDLG 28701   #endif / _WIN32_WCE    #ifdef RC_INVOKED   #ifndef _INC_WINDOWS   #define _INC_WINDOWS   #include "winuser.h" / extract from windows header   #include "winver.h"  

63、60; #endif   #endif    #ifdef IDC_STATIC   #undef IDC_STATIC   #endif   #define IDC_STATIC (-1)    #endif /_NEWRES_H_    3、 增加menubar資源:    類型ID Caption   MenubarIDR_MAIN_MENUBAR     Left menuIDM

64、_ABOUT關(guān)于   Right menu IDM_OPTION 選項(xiàng)   Right menu subitem 1IDM_ABOUT 關(guān)于(和左建菜單是同一個(gè)ID)   Right menu subitem 2 IDM_EXIT退出    這是first.rc的內(nèi)容,大家可以看到,與我們桌面windows下的資源腳本文件相差無幾。    /   / first.rc , resource script for first.    #include &qu

65、ot;resource.h"    #define APSTUDIO_READONLY_SYMBOLS   /   /   / Generated from the TEXTINCLUDE 2 resource.   /   #include "newres.h"    /   #undef APSTUDIO_READONLY_SYMBOLS    /   / Chi

66、nese (P.R.C.) resources    #if !defined(AFX_RESOURCE_DLL) | defined(AFX_TARG_CHS)   #ifdef _WIN32   LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED   #pragma code_page(936)   #endif /_WIN32    #ifdef APSTUDIO_INVOKED   / &#

67、160; /   / TEXTINCLUDE   /    1 TEXTINCLUDE DISCARDABLE    BEGIN   "resource.h0"   END    2 TEXTINCLUDE DISCARDABLE    BEGIN   "#include ""afxres.h""rn"   "

68、;0"   END    3 TEXTINCLUDE DISCARDABLE    BEGIN   "rn"   "0"   END    #endif / APSTUDIO_INVOKED    /   /   / Menubar   /    IDR_MAIN_MENUBAR MENU DISCARDAB

69、LE    BEGIN   MENUITEM "關(guān)于", IDM_ABOUT   POPUP "選項(xiàng)"   BEGIN   MENUITEM "關(guān)于", IDM_ABOUT   MENUITEM SEPARATOR   MENUITEM "退出", IDM_EXIT   END   END    / 

70、0; /   / Data   /    IDR_MAIN_MENUBAR SHMENUBAR DISCARDABLE    BEGIN   IDR_MAIN_MENUBAR, 2,   I_IMAGENONE, IDM_ABOUT, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE,    IDS_MENUITEM40002, 0, NOMENU,   I_IMAGENONE, IDM_OPTION, TBSTATE

71、_ENABLED,    TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MENUITEM40007, 0, 1,   END    /   /   / String Table   /    STRINGTABLE DISCARDABLE    BEGIN   IDS_MENUITEM40002 "關(guān)于"   IDS_MENUITEM4000

72、4 "x"   IDS_MENUITEM40007 "選項(xiàng)"   END    #endif / Chinese (P.R.C.) resources   /      #ifndef APSTUDIO_INVOKED   /   /   / Generated from the TEXTINCLUDE 3 resource.   /    /&#

73、160;  #endif / not APSTUDIO_INVOKED    4、 在onCreate函數(shù)中建立此菜單    /=   / onCreate,WM_CREATE 消息的處理函數(shù)   /=   LRESULT onCreate(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM    lParam)      SHMENUBARINFO mbi;    /

74、初始化menubar結(jié)構(gòu)   memset(&mbi, 0, sizeof(SHMENUBARINFO);    mbi.cbSize = sizeof(SHMENUBARINFO); / 必須填充   mbi.hwndParent = hWnd;    mbi.nToolBarId = IDR_MAIN_MENUBAR;    mbi.hInstRes = g_hInstance;    / 建立menubar   if (!SHCreateMe

75、nuBar(&mbi)       MessageBox (hWnd, _T("建立menubar失敗"), g_szAppName, MB_OK);   DestroyWindow(hWnd);      / 確定menubar的位置,這些語句是可選的   RECT rect, rectDesk;   int cx, cy;   GetWindowRect (mbi.hwndMB, &rect);&

76、#160;  GetWindowRect (GetDesktopWindow (), &rectDesk);   cx = rectDesk.right-rectDesk.left;   cy = (rectDesk.bottom - rectDesk.top) - (rect.bottom -    rect.top);   SetWindowPos (hWnd, NULL, 0, 0, cx, cy, SWP_NOMOVE |    SWP_NOZORDER);    return 0;      4、第三步:實(shí)現(xiàn)菜單功能    1) 實(shí)現(xiàn) "退出"菜單項(xiàng)的功能    步驟如下:    ·在fir

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論