TAHA
09-21-2009, 09:28 PM
براي اينكه بتوانيد براي گوشيهاي مجهز به ويندوز موبايل برنامهنويسي كنيد، يا بايد از چارچوب فشرده داتنت (NET CF.) استفاده كنيد يا با زبان اصلي اين سيستمعامل (++C) كار كنيد. در اين مقاله پس از مرور مقدمات، با حال و هواي برنامهنويسي براي سيستمعامل ويندوز موبايل با استفاده از زبان Visual C++ 2005 آشنا خواهيد شد و اركان يك برنامه ساده تحت ويندوز موبايل 5 را خواهيد شناخت. براي اين منظور به نرمافزار ويژوال استوديوي 2005 مراجعه مينماييم و سورسكد يك مثال را به طور دقيق بررسي و آن را كمي دستكاري خواهيم كرد. براي تأليف اين مقاله از اطلاعات سايت MSDN مايكروسافت استفاده كردهام
چارچوب برنامهنويسي در پلتفرم ويندوز موبايل
چنانكه ميدانيد، سيستمعامل CE براي تجهيز آن دسته از وسايل ديجيتالي كه از نوتبوك كوچكترند (مانند كامپيوترهاي جيبي، دوربينهاي ديجيتالي، صفحات نمايش LCD، چاپگرها) و نيز وسايل بسيار كوچك (مانند ساعت مچي) به يك سيستمنرمافزار متمركز، طراحي و به بازار معرفي شده است.
سيستمعامل ويندوز موبايل زيرمجموعه خاصي از ويندوز CE است و براي نصب روي گوشيهاي موبايل سازگار با اين سيستم و نيز آن دسته از Pocket PCها و كامپيوترهاي جيبي طراحي شده است كه به تلفن همراه مجهزند.
ويندوز موبايل نيز دو نوع دارد: يكي براي كامپيوترهاي جيبي و ديگري براي تلفنهاي هوشمند (اسمارتفون). در نسخه 5 ويندوزموبايل هر يك از اين دو نوع فرعي به ترتيب Windows Mobile Pocket PC Phone Edition و Windows Mobile Smartphone Edition نامگذاري شدهاند و در نسخه جديد آن (نسخه 6) كه به تازگي معرفي گرديده است، به ترتيب Windows Mobile Standard Edition و Windows Mobile Professional Edition ناميده شدهاند.
در اين مقاله مقصود ما از پلتفرم ويندوز موبايل Mobile PC يا Tablet PC نيست. اين دو نوع سيستم جديد در حقيقت اشكال تغييريافته همان ويندوز معمولي دسكتاپ هستند كه قابليتهاي مربوط به پشتيباني از ارتباطات سيار، بيسيم و فناوري جوهر ديجيتال به آنها افزوده شده است.
شكل 1 نموداري را نشان ميدهد كه چهار خانواده متفاوت از ابزارهاي ديجيتالي يعني Mobile/Tablet PC ،Pocket PC ،smartphone و Smart Objects را نشان ميدهد. چنانكه ملاحظه ميكنيد، هرچه حجم، اندازه و كارايي وسيله بيشتر شود، سهولت جابهجا كردن آن كمتر ميشود. دو نوع ويندوز موبايل كه در اين مقاله درباره آنها صحبت ميكنيم، در ميانه اين طيف قرار ميگيرند.
http://pnu-club.com/imported/2009/09/225.gif
شکل 1
براي برنامهنويسي روي هر يك از دو نوع فرعي ويندوز موبايل، يك SDK يا كيت توسعه نرمافزاري توسط مايكروسافت ارايه شده كه به صورت رايگان از سايت اين شركت قابل دريافت است.
برنامهنويسي براي گوشيهاي مجهز به اين سيستمعامل روي كامپيوترهاي پيسي معمولي و با استفاده از ابزارهايي مثل ويژوال استوديو صورت ميگيرد و از اين حيث تفاوتي با برنامهنويسي براي پلتفرمهاي ديگر وجود ندارد، اما از آنجا كه اين برنامه بايد نهايتاً روي گوشيهاي موبايل يا كامپيوترهاي جيبي اجرا شوند، لازم است برنامه نهايي روي اين ابزارها ريخته شود. به اين عمل اصطلاحاً استقرار نرمافزار (Deployment) ميگويند.
پلتفرم برنامهنويسي
ويندوز موبايل 5
InROM
NET CF 1.0 SP3.
MFC 3.0/ATL 4.0
State and Notification Broker
DirectShow
(raw camera access)
Direct 3D Mobile
Direct Drow
Picture Picker
Contact Picker
Windows Media 10OCX
Managed Telephony
Managed Outlook Mobile
Managed Messaging
(SMS, Mail)
Managed Config Mgr
GPS API
(Get Device ID (unpriv
Query Policy
Install
NET CF 2.0.
SQL Mobile 2005
MFC 8.0/ATL8.0
جدول 1
عمليات اشكالزدايي نيز ميتواند همزمان در حالي كه گوشي از طريق يك مجراي ارتباطي مانند USB به PC متصل است، صورت گيرد. از آنجا كه دسترسي به گوشيها يا PDAهاي واقعي گاهي امكانپذير نيست، نرمافزار ويژوالاستوديوي مايكروسافت اين امكان را فراهم آورده است كه برنامهنويسان كدهاي خود را روي يك گوشي ياPocket PC مجازي به نام Emulator بريزند و آزمايش كنند.
در اين مقاله ما به نسخه پنج ويندوز موبايل استناد ميكنيم. بنابراين خوب است بدانيم كدام رابطهاي اصلي برنامهنويسي (API) در اين پلتفرم موجودند و كدام يك بايد جداگانه نصب شوند.
جدول 1 بهطور خلاصه نشان ميدهد كه روي يك گوشي يا كامپيوتر جيبي مجهز به ويندوز موبايل 5 كدام رابطهاي برنامهنويسي موجودند. اينها زير ستون In ROM فهرست شدهاند. مقصود اين است كه APIهاي مذكور از قبل روي ROM وسيله مستقر شدهاند و آماده استفاده هستند.
در زير ستون Install مشاهده ميكنيد كه چارچوب داتنت 2، نسخه 2005 ديتابيس SQL Mobile و نسخه هشتم دو API مخصوص برنامهنويسي در محيط ++C را بايد جداگانه نصب كنيد. داتنت 2 (نسخه كامپكت) برنامه نصب جداگانهاي دارد. بانك اطلاعاتي SQL Mobile نيز به همين ترتيب است و جديدترين نسخههاي MFC و ATL نيز هنگام نصب ويژوال استوديوي 2005 به طور خودكار روي پيسي شما مستقر ميشود و هنگام استقرار نرمافزار توليدي روي گوشي، روي آن منتقل ميشود.
همه اين APIها را ميتوانيد در كيت توسعه نرمافزاري ويندوز موبايل بيابيد. شكل 2 كل معماري برنامهنويسي روي ويندوز CE، موبايل، Tablet و XP Embedded را در كنار يكديگر نشان ميدهد و ميتوانيد محل كاربرد دقيق هريك از APIهاي مورد بحث را در اين دياگرام ملاحظه كنيد.
مقايسه NET CF. و Native Code
به طور كلي دسترسي به كد ويندوز موبايل از دو طريق امكانپذير است: يكي استفاده از نسخه فشرده داتنت (NET Compact Framework.) و ديگري كد بومي (Native Code) ويندوز موبايل. نسخه فشرده داتنت زيرمجموعهاي از نسخه استاندارد آن است كه برخي از قابليتهاي آن به دليل ناسازگاري با معماري ويندوز CE يا به قصد كاستن از اندازه و حجم زيربناي نرمافزار حذف شدهاند.
هر يك از اين دو روش، مزايا و معايبي دارند. مزيت استفاده از داتنت فشرده، سهولت برنامهنويسي، امكان توليد سريع نرمافزار، اشكالزدايي آسان از برنامه، عدم نياز به مديريت مستقيم حافظه، سهولت برنامهسازي ويژوال، استفاده از متدولوژي شيءگرا، عدم نياز به دستكاري مستقيم رجيستري ويندوز و شباهت كدها به حال و هواي برنامهنويسي براي كامپيوترهاي معمولي دسكتاپ و سرور است.
http://pnu-club.com/imported/2009/09/226.gif
شکل 2
عيب اصلي استفاده داتنت فشرده، پايين آمدن سرعت اجراي برنامهها و كارايي و انعطافپذيري آنها است. همچنين داتنت2 در مقايسه با كد بومي ويندوز موبايل تنها درصد كوچكي از API ويندوز را پوشش ميدهد و مابقي بايد با استفاده از تكنيك P/Invoke و دسترسي غيرمستقيم و با واسطه كد بومي پوشش داده شود. به زبان سادهتر، خيلي از كارهايي كه در كد بومي ميتوان انجام داد را در محيط داتنت فشرده نميتوان انجام داد؛ مگر با كمك گرفتن از همان كد بومي.
متقابلاً، مزيت استفاده از كد بومي ويندوز موبايل بالارفتن سرعت اجراي برنامهها، دسترسي كامل به تمام بخشها و قابليتهاي سيستمعامل و دسترسي مستقيم به حافظه براي افزايش كارايي و انعطافپذيري برنامه است. ايراد اصلي كار با كد بومي، دشوار بودن آن است.
موفقيت در مديريت مستقيم حافظه نيازمند تبحر در فنون برنامهنويسي سطح پايين (Low Level) و آشنايي نسبي با زبان ماشين است. همچنين دستكاري رجيستري ويندوز هنگام نصب برنامه اغلب اوقات اجتنابناپذير است.
توليد برنامه با اين روش زمانبر و خستهكننده است و برنامهنويس بايد شكيبايي پيشه كند. علاوه بر اينها، كار با منطق شيءگرا در محيط كد بومي اصلاً به آساني محيط داتنت نيست و تنها با مدد گرفتن از فناوري مياني MFC ميتوان حال و هواي برنامهنويسي شيءگرا را به تجربه كار در محيط داتنت نزديك كرد. البته تا دو سال پيش برنامهنويسي با كد بومي حتي از اين هم سختتر و مستلزم نصب و بهكارگيري ابزار ++eMbedded Visual C بود.
مقايسه ويندوز موبايل 5 و ويندوز موبايل 2003
از ديدگاه برنامهنويسي
Windows Mobile 5.0
Windows Mobile 2003
رابط برنامهنويسي
Runs. no debug or deploy
Runs. no debug or deploy
EVC 3.0
Runs. no debug or deploy
Yes
EVC 4.0 application
Runs. no debug or deploy
Yes
VS 2003 + CF 1.0
Yes
Yes
VS 2003 + CF 1.0
Yes
Yes
VS 2003 + CF 2.0
جدول 2
به بيان ديگر، علاوه بر ويژوال استوديو بايد ابزار كمكي ديگري هم نصب ميكرديد. خوشبختانه از زمان معرفي Windows CE 5 و ويندوز موبايل متناظر آن برنامهنويسي در محيط كد بومي به مراتب آسانتر شده است؛ زيرا ويژوال استوديوي 2005 شما را از نصب و بهكارگيري ++eMbedded Visual C يا برادرش eMbedded Visual Basicمعاف ميكند.
جدول 2 مقايسهاي ميان ويندوز موبايل 5 و ويندوز موبايل 2003 از ديدگاه برنامهنويسي است (CF و EVC به ترتيب معرف داتنت فشرده و ويژوال سي پلاس پلاس الحاقي هستند).
اين جدول نشان ميدهد كه هنگام مراجعه به هر يك از اين دو سيستمعامل، دسترسي به كدام يك از مدلهاي برنامهنويسي امكانپذير، اختياري يا اجباري است.
زبان اصلي؛ ++C
در اين مقاله به سراغ روش سختتر، يعني استفاده از كد بومي ويندوز موبايل ميرويم. روش آسانتر (كار با داتنت فشرده) در مقاله جداگانهاي در همين شماره از مجله توضيح داده شده است. زبان اصلي كد بومي ويندوز ++C است. اين زبان فوقالعاده دشوار و پيچيده است؛ زيرا با منطق و زباني نزديك به زبان ماشين كار ميكند، اما چرا كد بومي ويندوز موبايل با اين زبان نوشته شده است؟ علت اين است كه ويندوز CE اساساً براي وسايل ديجيتالي كوچك طراحي شده است و چون اين وسايل جاي كمي براي پردازش و ذخيرهسازي دادهها دارند، بايد زيربناي نرمافزارها (footprint) بسيار كوچك باشد.
http://pnu-club.com/imported/2009/09/227.gif
شکل 3
بنابراين لازم بوده است از زباني نزديك به زبان ماشين استفاده شود تا برنامهها با حداقل حجم و حداكثر كارايي و سرعت اجرا شوند. خالي از لطف نيست كه بدانيد حجم اغلب برنامههايي كه با اين روش براي ويندوز موبايل توليد ميكنيد، به كوچكي ويروسهاي كامپيوتري هستند كه روي پيسيها پرسه ميزنند! متأسفانه بار اصلي اين مدل برنامهنويسي به دوش سازنده نرمافزار است و راه گريزي وجود ندارد.
http://pnu-club.com/imported/2009/09/228.gif
کد 1
در اين مقاله ميكوشيم فضاي پيچيده برنامهنويسي ++C را كمي ساده كنيم و با حال و هواي كدنويسي در اين محيط مأنوس شويم. براي اجراي مثالي كه در ادامه مقاله تشريح شده است، بايد از ابزار Visual C++ 2005 استفاده كنيد كه همراه ويژوال استوديوي 2005 نصب ميشود.
توصيه ميكنم براي محكمكاري، SDK ويندوز موبايل 5 را نيز دانلود و نصب كنيد تا مشكلي پيش نيايد. نزديك به هشتاد مثال برنامهنويسي با كد بومي ويندوز موبايل نيز در اين SDK موجود است. نصب داتنت 2 يا SQL Mobileدغدغه اين مقاله نيست.
http://pnu-club.com/imported/2009/09/229.gif
کد 2
برنامههاي تحت ويندوز موبايل عمدتاً پنج نوع هستند: Win32 Exe ،Win32 DLL ،MFC ،ATL و يك نوع Console Application را نيز ميتوان اضافه كرد. نوع اول مهمترين است و مثال اين مقاله نيز از همين نوع است. نوع دوم براي توليد سرويسهاي سيستمعامل (مانند پلاگينهاي قابل نصب روي دسكتاپ كوچك ويندوز موبايل) مناسب است.
معماري MFC در حقيقت براي كساني در نظر گرفته شده است كه مايلند از متدولوژي شيءگرا و مزاياي آن در ويندوز موبايل راحتتر استفاده كنند وATL نيز براي توليد كامپوننتها يا استفاده از كامپوننتهاي پيشساخته در نظر گرفته شده است.
http://pnu-club.com/imported/2009/09/230.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_code03.gif)
کد 3
صرفنظر از گرامر خاص زبان ++C، گفتمان اصلي حاكم بر اين زبان، مديريت حافظه است. هنگامي كه با اين زبان برنامه مينويسيد، پنجاه درصد كد شما چيزي نيست جز مديريت بيتها و بايتها در حافظه و تنها نيمي از سورس كد واقعاً به كار اصلي مد نظر شما اختصاص دارد. بنابراين در اغلب مواقع، علت كار نكردن يا درست كار نكردن برنامهِ شما اشتباهات سهوي برنامهنويسي در مديريت حافظه است، نه چيز ديگر.
اصولاً دشواري گرامر ++C نيز به عناصر و گزارههاي مرتبط با حافظه مربوط ميشود. معروفترين آنها، «اشارهگرها» هستند كه به «كابوس برنامهنويسان» مشهورند. بنابراين خوب است قبل از ورود به دنياي برنامهنويسي موبايل، حتماً به تكنيكهاي اساسي مديريت حافظه مسلط شويد.
چهار ستون يك برنامه تحت ويندوز CE
استخوانبندي يك برنامه تحت ويندوز موبايل كاملاً شبيه اسكلت اصلي برنامهاي است كه براي ويندوز CE نوشته شده باشد؛ زيرا همانطور كه قبلاً گفتيم، ويندوز موبايل پيادهسازي خاصي از ويندوز CE و در حقيقت زيرمجموعهاي از قابليتهاي آن است. هرچند سيستمعامل CE با ويندوز معمولي متفاوت است، معماري اين سيستمعامل از همان معماري معروف ويندوز دسكتاپ الگو گرفته است. بنابراين اگر با منطق دروني سيستمعامل ويندوز آشنا باشيد، برنامهنويسي براي ويندوز موبايل برايتان موضوعي آشنا خواهد بود.
http://pnu-club.com/imported/2009/09/231.gif
کد 4
همه نرمافزارهاي مبتني بر ويندوز CE، كار خود را هنگامي شروع ميكنند كه سيستمعامل تابع WinMain را از درون كد برنامه فراخواني ميكند. بنابراين يكي از چهار ستون اصلي برنامههاي نوشته شده براي ويندوز موبايل، همين تابع است. اين تابع به نوبه خود بهطور مستقيم دو تابع ديگر را فراخواني ميكند كه به ترتيب وظيفه ثبت كلاس برنامه در حافظه، توليد پنجره نرمافزار و مقداردهي اوليه آن را به عهده دارند.
مرسوم است كه تابع ثبت كلاس برنامه را InitApplication يا MyRegisterClass مينامند و تابع توليد پنجره نرمافزار و مقداردهي اوليه آن را InitInstance نامگذاري ميكنند. تابع WinMain همچنين به طور غيرمستقيم موجب به كار افتادن يك تابع چهارم هم ميشود كه WndProc نام دارد و قلب تپندهِ برنامههاي تحت ويندوز است. اين تابع مسئول پاسخگويي به پيامهاي سيستمعامل است و كنش و واكنشهاي سه جانبه ميان برنامه، ويندوز، و كاربر را مديريت ميكند. روال به اين صورت است:
1- سيستمعامل تابع WinMain را فراخواني مينمايد و كد نرمافزار را در حافظه بارگذاري ميكند.
2- تابع WinMain يك قلاب (Handle) يا اشارهگر به Instance (يا نمونه اجرا شده از كد برنامه در حافظه) نرمافزار را برميگرداند و آن را داخل يك متغير سراسري كه در دسترس همه توابع برنامه باشد، قرار ميدهد.
3- سپس تابع InitApplication فراخواني ميشود. محتوا و نام اين تابع را برنامهنويس به دلخواه تعيين ميكند، اما اين تابع بايد حتماً بعد از انجام كارهاي مقدماتي مورد نظر برنامهنويس تابع توكار RegisterClass را احضار كند تا كلاس پنجره برنامه در حافظه ثبت شود.
4- در مرحله بعدي تابع InitInstance فراخواني ميشود. محتوا و نام اين تابع را نيز برنامهنويس تعيين ميكند، اما حتماً بايد تابع توكار CreateWindow در اين مرحله فراخواني شود تا پنجره نرمافزار توليد شود تا در مراحل بعدي به نمايش درآيد. اين تابع يك قلاب يا اشارهگر به پنجره برنامه برميگرداند كه بايد در يك متغير سراسري نوشته شود تا بعداً توسط ساير توابع برنامه قابل استفاده باشد.
5- سرانجام WinMain كليد اتوماسيون نرمافزار را ميزند و حلقه بيپايان پيامهاي سهجانبه ميان كاربر، ويندوز، و برنامه آغاز ميشود و تنها دكمه خروج ميتواند به اين حلقه پايان دهد. به اين ترتيب برنامه روح پيدا ميكند و كار اصلي خود را شروع مينمايد.
http://pnu-club.com/imported/2009/09/232.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_code05.gif)http://pnu-club.com/imported/2009/09/233.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_code06.gif)
کد 5
کد 6
اين حلقه را مثلثي مديريت ميكند كه از سه تابع توكار GetMessage ،TranslateMessage و DispatchMessage تشكيل ميشود. تابع سيستمي نخست، پيامهايي را دريافت ميكند كه از سيستمعامل و كاربر ميرسد. دومي اين پيامها را تفسير ميكند و سومي مسئول ارسال پيامهايي است كه برنامه به منظور تعامل با كاربر يا سيستمعامل يا واكنش نشان دادن به پيغامهاي آنها ارسال ميكند.
اما تابع WinMain مديريت اين پيامها را مستقيماً انجام نميدهد. اين كار به يك تابع جداگانه به نام WndProcسپرده ميشود كه سيستمعامل هنگام حيات چرخه پيامها مرتباً و به دفعات آن را فراخواني ميكند و از او كسب تكليف ميكند.
6- قلب برنامهنويسي شما در WndProc اتفاق ميافتد. در اين جا مسئوليت مديريت رويدادهايي را برعهده داريد كه به WndProc گزارش ميشود. به عنوان مثال شما نميتوانيد مستقيماً چيزي روي پنجره اصلي برنامه بكشيد، بلكه بايد منتظر بمانيد تا در اولين فرصت، پيام WM_PAINT از سيستمعامل به برسد. اين پيام خيلي ساده به شما ميگويد: «بسيار خوب! چه ميخواهيد بكشيد؟ آن را بكش!» يا به عنوان مثالي ديگر، وقتي كاربر دكمه خروج از برنامه را فشار ميدهد، پيام WM_CLOSE از سيستمعامل سر ميرسد. شما در اين مقطع ميتوانيد با فراخواني تابع توكار PostQuitMessage بساط نرمافزارتان را جمع كنيد و آن را از حافظه خارج سازيد.
يك برنامه ساده بنويسيد
اكنون ميخواهيم يك برنامه بسيار ساده بنويسيم كه در آن يك جمله داخل پنجره اصلي برنامه نمايش داده شود. براي اين منظور از ويزارد توليد برنامه در ويژوال سي 2005 استفاده ميكنيم و سپس تغييراتي در سورسكدي كه به طور خودكار توسط ويژوال استوديو توليد شده است، اعمال خواهيم كرد.
به منوي فايل در ويژوال استوديو مراجعه كنيد و گزينه New Project را انتخاب نماييد تا ويزارد توليد پروژه آغاز شود. براي انتخاب نوع پروژه به قسمت ++Visual C مراجعه نماييد و گزينه Smart Device را انتخاب كنيد و از قسمت سمت راست روي Win32 Smart Device Project كليك كنيد (شكل3).
حالا يك نام براي برنامه انتخاب كنيد (مثلاً Simplewinmobileapp) در اين مرحله ويژوال استوديو از شما ميخواهد SDK دلخواهتان را انتخاب كنيد تا كد برنامه متناسب با آن توليد و بهينه شود. اگر براي ويندوز موبايل 5 برنامهنويسي ميكنيد، يكي از دو نوع Windows Mobile 5.0 Pocket PC يا Windows Mobile 5.0 Smartphone يا هر دو را انتخاب كنيد و Next را بزنيد.
http://pnu-club.com/imported/2009/09/234.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_04a.gif)http://pnu-club.com/imported/2009/09/235.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_04b.gif)
شکل 4
سرانجام نوع برنامه (در اينجا Windows Application) را انتخاب كنيد (شكل4) و ويزارد را به پايان برسانيد. ويژوال استوديو به طور خودكار كدها و ماجولهاي لازم را توليد ميكند. اين يك برنامه خالي است كه فقط يك منوي HELPدارد كه يك گزينه About داخل آن است و پنجره About برنامه شما را باز ميكند. اين برنامه ساده همچنين يك گزينه OK در منوي پايين پنجره نشان ميدهد كه با زدن آن از برنامه خارج ميشويد.
http://pnu-club.com/imported/2009/09/236.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_05.gif)
شکل 5
براي كامپايل كردن، استقرار، اجرا و آزمايش برنامه دو راه داريد: يا امولاتور را انتخاب كنيد، يا يك دستگاه واقعي به كامپيوتر وصل كنيد و برنامه را روي آن بريزيد. براي انتخاب ميان انواع امولاتورها يا وسيله واقعي ميتوانيد از منوي DropDown مخصوص كه درست بالاي سمت چپ پنجره كدنويسي قرار دارد، گزينه Windows Mobile 5.0 Pocket PC Device براي وسيله واقعي يا يكي از گزينههاي ديگر را براي Emulator انتخاب كنيد.
http://pnu-club.com/imported/2009/09/237.gif
شکل 6
با فشردن دكمه Play يا كليد F5 برنامه كامپايل ميشود و سپس روي امولاتور يا وسيله واقعي مستقر و اجرا ميگردد. تا زماني كه از برنامه خارج نشدهايد، ميتوانيد آن را اشكالزدايي (Debug) كنيد. شكل 5 نمايي از محيط برنامهنويسي ويژوال استوديوي 2005 را نشان ميدهد و شكل 6 يك امولاتور را به نمايش گذاشته كه يك Pocket PC بدون قابليت تلفن همراه را شبيهسازي كرده است.
اكنون ميخواهيم سورس كد برنامه را كمي دستكاري كنيم و چيزي داخل پنجره برنامه بنويسيم. اين سورس دستكاريشده در فايلي به نام simplewin.cpp در ضميمه آنلاين مقاله روي سايت ماهنامه موجود است. تنها تغييري كه در سورس اوليه ايجاد كردهايم، افزودن يك متغير رشتهاي به نام SimpleText است كه جملهاي به فارسي درون آن نوشته شده است.
براي اينكه بتوانيد از متن فارسي و فرمت يونيكد در سورس كد استفاده كنيد، بايد فايل سورس را با Encodingمخصوص يونيكد (يعني Unicode - Codepage 1200) ذخيره كنيد. تغيير ديگري لازم نيست؛ زيرا ويندوز CE صورت توكار از يونيكد پشتيباني ميكند، اما توجه داشته باشيد كه نمايش موفقيتآميز اين عبارت فارسي مستلزم آن است كه قبلاً يك برنامه فارسي/عربيساز روي ويندوز موبايل وسيله شما نصب شده باشد.
امولاتور ويژوال استوديو نيز به صورت پيشفرض داراي چنين فارسيسازي نيست. بنابراين متن شما را نشان نخواهد داد. در هر صورت اگر براي نمايش متن فارسي مشكل داشتيد، آن را پاك كنيد و به جايش يك متن آزمايشي انگليسي بنويسيد تا بتوانيد دستكم كاركرد برنامه را بيازماييد.
متغير SimpleText دقيقاً در جايي كه پيام WM_PAINT پردازش ميشود، به نمايش در ميآيد. براي اين منظور بايد آنجا كه ويژوال استوديو براي راهنمايي ما يك كامنت گذاشته و نوشته است: TODO: Add any drawing code here يعني بين دو تابع توكار BeginPaint و EndPaint اين كار را انجام دهيم.
http://pnu-club.com/imported/2009/09/238.gif
شکل 7
http://pnu-club.com/imported/2009/09/239.gif
شکل 8
براي اين منظور كافي است يك مستطيل (نوع داده: RECT) تعريف كنيم و ابعاد پنجره برنامه را توسط تابع GetClientRect به آن نسبت دهيم. براي استفاده از اين تابع بايد قلاب يا Handle پنجره برنامه را كه قبلاً در تابع InitInstance داخل يك متغير سراسري گذاشتهايم به آن بدهيم تا بتواند پنجره و ابعاد آن را در حافظه پيدا كند.
سپس با استفاده از تابع DrawText متن را روي پنجره ترسيم ميكنيم. شكل 8 نمايي از برنامه در سيماي واقعي آن روي يك گوشي مجهز به ويندوز موبايل 5 را نشان ميدهد. شكل 7 برنامه ديگري است كه خيلي به اين برنامه شبيه است، اما براي ماجراجويي بيشتر، آن را از ابتدا با دست مينويسيم.
البته كافي است از سورس موجود در فايل simplewin2.cpp استفاده كنيد. كل سورس موجود در فايل اصلي برنامه كه نامي به صورت simplewinmobileapp.cpp دارد را پاك كنيد و محتويات simplewin2.cpp را درون آن بريزيد و برنامه را اجرا كنيد. ببينيد چه اتفاقي ميافتد؟
كد 1 نام و پارامترهاي ورودي چهار تابع اصلي برنامه simplewin2.cpp را نشان ميدهد. جزئيات هر يك از اين چهار تابع را ميتوانيد به ترتيب در كدهاي 3 تا 6 ملاحظه كنيد. كد 2 هم اعلان چند پارامتر، از جمله متغيرهاي سراسري براي نگهداري قلابها يا اشارهگرهاي پنجره و instance برنامه را نشان ميدهد.
برنامه دوم كه كمي غير استاندارد است، از برنامه اول كوچكتر است؛ زيرا منابع يا resourceهاي منتسب به پروژه را كه در فايلهاي rc تعريف شدهاند، نميخواند و بارگذاري نميكند. به همين دليل، برنامه منو ندارد و پنجره About پروژه نيز در دسترس نيست.
در اينجا يك شيطنت هم كردهايم. اگر به كد 5 كه تابع InitInstance را تعريف ميكند با دقت نگاه كنيد، سطري را ميبينيد كه مقدار ثابت WS_OVERLAPPED را بهعنوان سبك و سياق ظاهري پنجره برنامه به خورد تابع CreateWindow داده است.
اين مقدار پنجره برنامه را از حالت استاندارد و ثابت آن خارج ميكند و پنجره برنامه شناور و قابل جابهجايي ميشود. براي امتحان كردن اين نكته، با قلم (Stylus) روي Pocket PC واقعي يا با ماوس روي امولاتور Pocket PC لبه عنوان پنجره را بگيريد و بكشيد تا پنجره از جاي اصلي خود خارج شود تا به شكلي مشابه شكل 7 برسيد.
البته سورس اصلي توليد شده توسط ويزارد يا سورس دومي كه كپي كردهايد، نكتهها و مسائلي زيادي براي بررسي دارند كه مجال آن در اين مقاله نيست. خودتان ميتواند سرنخ را دنبال كنيد. اميدوارم با توضيحاتي كه در اين مقاله آوردم، سورس برنامه به اندازه كافي خوانا شده باشد. موفق باشيد!
چارچوب برنامهنويسي در پلتفرم ويندوز موبايل
چنانكه ميدانيد، سيستمعامل CE براي تجهيز آن دسته از وسايل ديجيتالي كه از نوتبوك كوچكترند (مانند كامپيوترهاي جيبي، دوربينهاي ديجيتالي، صفحات نمايش LCD، چاپگرها) و نيز وسايل بسيار كوچك (مانند ساعت مچي) به يك سيستمنرمافزار متمركز، طراحي و به بازار معرفي شده است.
سيستمعامل ويندوز موبايل زيرمجموعه خاصي از ويندوز CE است و براي نصب روي گوشيهاي موبايل سازگار با اين سيستم و نيز آن دسته از Pocket PCها و كامپيوترهاي جيبي طراحي شده است كه به تلفن همراه مجهزند.
ويندوز موبايل نيز دو نوع دارد: يكي براي كامپيوترهاي جيبي و ديگري براي تلفنهاي هوشمند (اسمارتفون). در نسخه 5 ويندوزموبايل هر يك از اين دو نوع فرعي به ترتيب Windows Mobile Pocket PC Phone Edition و Windows Mobile Smartphone Edition نامگذاري شدهاند و در نسخه جديد آن (نسخه 6) كه به تازگي معرفي گرديده است، به ترتيب Windows Mobile Standard Edition و Windows Mobile Professional Edition ناميده شدهاند.
در اين مقاله مقصود ما از پلتفرم ويندوز موبايل Mobile PC يا Tablet PC نيست. اين دو نوع سيستم جديد در حقيقت اشكال تغييريافته همان ويندوز معمولي دسكتاپ هستند كه قابليتهاي مربوط به پشتيباني از ارتباطات سيار، بيسيم و فناوري جوهر ديجيتال به آنها افزوده شده است.
شكل 1 نموداري را نشان ميدهد كه چهار خانواده متفاوت از ابزارهاي ديجيتالي يعني Mobile/Tablet PC ،Pocket PC ،smartphone و Smart Objects را نشان ميدهد. چنانكه ملاحظه ميكنيد، هرچه حجم، اندازه و كارايي وسيله بيشتر شود، سهولت جابهجا كردن آن كمتر ميشود. دو نوع ويندوز موبايل كه در اين مقاله درباره آنها صحبت ميكنيم، در ميانه اين طيف قرار ميگيرند.
http://pnu-club.com/imported/2009/09/225.gif
شکل 1
براي برنامهنويسي روي هر يك از دو نوع فرعي ويندوز موبايل، يك SDK يا كيت توسعه نرمافزاري توسط مايكروسافت ارايه شده كه به صورت رايگان از سايت اين شركت قابل دريافت است.
برنامهنويسي براي گوشيهاي مجهز به اين سيستمعامل روي كامپيوترهاي پيسي معمولي و با استفاده از ابزارهايي مثل ويژوال استوديو صورت ميگيرد و از اين حيث تفاوتي با برنامهنويسي براي پلتفرمهاي ديگر وجود ندارد، اما از آنجا كه اين برنامه بايد نهايتاً روي گوشيهاي موبايل يا كامپيوترهاي جيبي اجرا شوند، لازم است برنامه نهايي روي اين ابزارها ريخته شود. به اين عمل اصطلاحاً استقرار نرمافزار (Deployment) ميگويند.
پلتفرم برنامهنويسي
ويندوز موبايل 5
InROM
NET CF 1.0 SP3.
MFC 3.0/ATL 4.0
State and Notification Broker
DirectShow
(raw camera access)
Direct 3D Mobile
Direct Drow
Picture Picker
Contact Picker
Windows Media 10OCX
Managed Telephony
Managed Outlook Mobile
Managed Messaging
(SMS, Mail)
Managed Config Mgr
GPS API
(Get Device ID (unpriv
Query Policy
Install
NET CF 2.0.
SQL Mobile 2005
MFC 8.0/ATL8.0
جدول 1
عمليات اشكالزدايي نيز ميتواند همزمان در حالي كه گوشي از طريق يك مجراي ارتباطي مانند USB به PC متصل است، صورت گيرد. از آنجا كه دسترسي به گوشيها يا PDAهاي واقعي گاهي امكانپذير نيست، نرمافزار ويژوالاستوديوي مايكروسافت اين امكان را فراهم آورده است كه برنامهنويسان كدهاي خود را روي يك گوشي ياPocket PC مجازي به نام Emulator بريزند و آزمايش كنند.
در اين مقاله ما به نسخه پنج ويندوز موبايل استناد ميكنيم. بنابراين خوب است بدانيم كدام رابطهاي اصلي برنامهنويسي (API) در اين پلتفرم موجودند و كدام يك بايد جداگانه نصب شوند.
جدول 1 بهطور خلاصه نشان ميدهد كه روي يك گوشي يا كامپيوتر جيبي مجهز به ويندوز موبايل 5 كدام رابطهاي برنامهنويسي موجودند. اينها زير ستون In ROM فهرست شدهاند. مقصود اين است كه APIهاي مذكور از قبل روي ROM وسيله مستقر شدهاند و آماده استفاده هستند.
در زير ستون Install مشاهده ميكنيد كه چارچوب داتنت 2، نسخه 2005 ديتابيس SQL Mobile و نسخه هشتم دو API مخصوص برنامهنويسي در محيط ++C را بايد جداگانه نصب كنيد. داتنت 2 (نسخه كامپكت) برنامه نصب جداگانهاي دارد. بانك اطلاعاتي SQL Mobile نيز به همين ترتيب است و جديدترين نسخههاي MFC و ATL نيز هنگام نصب ويژوال استوديوي 2005 به طور خودكار روي پيسي شما مستقر ميشود و هنگام استقرار نرمافزار توليدي روي گوشي، روي آن منتقل ميشود.
همه اين APIها را ميتوانيد در كيت توسعه نرمافزاري ويندوز موبايل بيابيد. شكل 2 كل معماري برنامهنويسي روي ويندوز CE، موبايل، Tablet و XP Embedded را در كنار يكديگر نشان ميدهد و ميتوانيد محل كاربرد دقيق هريك از APIهاي مورد بحث را در اين دياگرام ملاحظه كنيد.
مقايسه NET CF. و Native Code
به طور كلي دسترسي به كد ويندوز موبايل از دو طريق امكانپذير است: يكي استفاده از نسخه فشرده داتنت (NET Compact Framework.) و ديگري كد بومي (Native Code) ويندوز موبايل. نسخه فشرده داتنت زيرمجموعهاي از نسخه استاندارد آن است كه برخي از قابليتهاي آن به دليل ناسازگاري با معماري ويندوز CE يا به قصد كاستن از اندازه و حجم زيربناي نرمافزار حذف شدهاند.
هر يك از اين دو روش، مزايا و معايبي دارند. مزيت استفاده از داتنت فشرده، سهولت برنامهنويسي، امكان توليد سريع نرمافزار، اشكالزدايي آسان از برنامه، عدم نياز به مديريت مستقيم حافظه، سهولت برنامهسازي ويژوال، استفاده از متدولوژي شيءگرا، عدم نياز به دستكاري مستقيم رجيستري ويندوز و شباهت كدها به حال و هواي برنامهنويسي براي كامپيوترهاي معمولي دسكتاپ و سرور است.
http://pnu-club.com/imported/2009/09/226.gif
شکل 2
عيب اصلي استفاده داتنت فشرده، پايين آمدن سرعت اجراي برنامهها و كارايي و انعطافپذيري آنها است. همچنين داتنت2 در مقايسه با كد بومي ويندوز موبايل تنها درصد كوچكي از API ويندوز را پوشش ميدهد و مابقي بايد با استفاده از تكنيك P/Invoke و دسترسي غيرمستقيم و با واسطه كد بومي پوشش داده شود. به زبان سادهتر، خيلي از كارهايي كه در كد بومي ميتوان انجام داد را در محيط داتنت فشرده نميتوان انجام داد؛ مگر با كمك گرفتن از همان كد بومي.
متقابلاً، مزيت استفاده از كد بومي ويندوز موبايل بالارفتن سرعت اجراي برنامهها، دسترسي كامل به تمام بخشها و قابليتهاي سيستمعامل و دسترسي مستقيم به حافظه براي افزايش كارايي و انعطافپذيري برنامه است. ايراد اصلي كار با كد بومي، دشوار بودن آن است.
موفقيت در مديريت مستقيم حافظه نيازمند تبحر در فنون برنامهنويسي سطح پايين (Low Level) و آشنايي نسبي با زبان ماشين است. همچنين دستكاري رجيستري ويندوز هنگام نصب برنامه اغلب اوقات اجتنابناپذير است.
توليد برنامه با اين روش زمانبر و خستهكننده است و برنامهنويس بايد شكيبايي پيشه كند. علاوه بر اينها، كار با منطق شيءگرا در محيط كد بومي اصلاً به آساني محيط داتنت نيست و تنها با مدد گرفتن از فناوري مياني MFC ميتوان حال و هواي برنامهنويسي شيءگرا را به تجربه كار در محيط داتنت نزديك كرد. البته تا دو سال پيش برنامهنويسي با كد بومي حتي از اين هم سختتر و مستلزم نصب و بهكارگيري ابزار ++eMbedded Visual C بود.
مقايسه ويندوز موبايل 5 و ويندوز موبايل 2003
از ديدگاه برنامهنويسي
Windows Mobile 5.0
Windows Mobile 2003
رابط برنامهنويسي
Runs. no debug or deploy
Runs. no debug or deploy
EVC 3.0
Runs. no debug or deploy
Yes
EVC 4.0 application
Runs. no debug or deploy
Yes
VS 2003 + CF 1.0
Yes
Yes
VS 2003 + CF 1.0
Yes
Yes
VS 2003 + CF 2.0
جدول 2
به بيان ديگر، علاوه بر ويژوال استوديو بايد ابزار كمكي ديگري هم نصب ميكرديد. خوشبختانه از زمان معرفي Windows CE 5 و ويندوز موبايل متناظر آن برنامهنويسي در محيط كد بومي به مراتب آسانتر شده است؛ زيرا ويژوال استوديوي 2005 شما را از نصب و بهكارگيري ++eMbedded Visual C يا برادرش eMbedded Visual Basicمعاف ميكند.
جدول 2 مقايسهاي ميان ويندوز موبايل 5 و ويندوز موبايل 2003 از ديدگاه برنامهنويسي است (CF و EVC به ترتيب معرف داتنت فشرده و ويژوال سي پلاس پلاس الحاقي هستند).
اين جدول نشان ميدهد كه هنگام مراجعه به هر يك از اين دو سيستمعامل، دسترسي به كدام يك از مدلهاي برنامهنويسي امكانپذير، اختياري يا اجباري است.
زبان اصلي؛ ++C
در اين مقاله به سراغ روش سختتر، يعني استفاده از كد بومي ويندوز موبايل ميرويم. روش آسانتر (كار با داتنت فشرده) در مقاله جداگانهاي در همين شماره از مجله توضيح داده شده است. زبان اصلي كد بومي ويندوز ++C است. اين زبان فوقالعاده دشوار و پيچيده است؛ زيرا با منطق و زباني نزديك به زبان ماشين كار ميكند، اما چرا كد بومي ويندوز موبايل با اين زبان نوشته شده است؟ علت اين است كه ويندوز CE اساساً براي وسايل ديجيتالي كوچك طراحي شده است و چون اين وسايل جاي كمي براي پردازش و ذخيرهسازي دادهها دارند، بايد زيربناي نرمافزارها (footprint) بسيار كوچك باشد.
http://pnu-club.com/imported/2009/09/227.gif
شکل 3
بنابراين لازم بوده است از زباني نزديك به زبان ماشين استفاده شود تا برنامهها با حداقل حجم و حداكثر كارايي و سرعت اجرا شوند. خالي از لطف نيست كه بدانيد حجم اغلب برنامههايي كه با اين روش براي ويندوز موبايل توليد ميكنيد، به كوچكي ويروسهاي كامپيوتري هستند كه روي پيسيها پرسه ميزنند! متأسفانه بار اصلي اين مدل برنامهنويسي به دوش سازنده نرمافزار است و راه گريزي وجود ندارد.
http://pnu-club.com/imported/2009/09/228.gif
کد 1
در اين مقاله ميكوشيم فضاي پيچيده برنامهنويسي ++C را كمي ساده كنيم و با حال و هواي كدنويسي در اين محيط مأنوس شويم. براي اجراي مثالي كه در ادامه مقاله تشريح شده است، بايد از ابزار Visual C++ 2005 استفاده كنيد كه همراه ويژوال استوديوي 2005 نصب ميشود.
توصيه ميكنم براي محكمكاري، SDK ويندوز موبايل 5 را نيز دانلود و نصب كنيد تا مشكلي پيش نيايد. نزديك به هشتاد مثال برنامهنويسي با كد بومي ويندوز موبايل نيز در اين SDK موجود است. نصب داتنت 2 يا SQL Mobileدغدغه اين مقاله نيست.
http://pnu-club.com/imported/2009/09/229.gif
کد 2
برنامههاي تحت ويندوز موبايل عمدتاً پنج نوع هستند: Win32 Exe ،Win32 DLL ،MFC ،ATL و يك نوع Console Application را نيز ميتوان اضافه كرد. نوع اول مهمترين است و مثال اين مقاله نيز از همين نوع است. نوع دوم براي توليد سرويسهاي سيستمعامل (مانند پلاگينهاي قابل نصب روي دسكتاپ كوچك ويندوز موبايل) مناسب است.
معماري MFC در حقيقت براي كساني در نظر گرفته شده است كه مايلند از متدولوژي شيءگرا و مزاياي آن در ويندوز موبايل راحتتر استفاده كنند وATL نيز براي توليد كامپوننتها يا استفاده از كامپوننتهاي پيشساخته در نظر گرفته شده است.
http://pnu-club.com/imported/2009/09/230.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_code03.gif)
کد 3
صرفنظر از گرامر خاص زبان ++C، گفتمان اصلي حاكم بر اين زبان، مديريت حافظه است. هنگامي كه با اين زبان برنامه مينويسيد، پنجاه درصد كد شما چيزي نيست جز مديريت بيتها و بايتها در حافظه و تنها نيمي از سورس كد واقعاً به كار اصلي مد نظر شما اختصاص دارد. بنابراين در اغلب مواقع، علت كار نكردن يا درست كار نكردن برنامهِ شما اشتباهات سهوي برنامهنويسي در مديريت حافظه است، نه چيز ديگر.
اصولاً دشواري گرامر ++C نيز به عناصر و گزارههاي مرتبط با حافظه مربوط ميشود. معروفترين آنها، «اشارهگرها» هستند كه به «كابوس برنامهنويسان» مشهورند. بنابراين خوب است قبل از ورود به دنياي برنامهنويسي موبايل، حتماً به تكنيكهاي اساسي مديريت حافظه مسلط شويد.
چهار ستون يك برنامه تحت ويندوز CE
استخوانبندي يك برنامه تحت ويندوز موبايل كاملاً شبيه اسكلت اصلي برنامهاي است كه براي ويندوز CE نوشته شده باشد؛ زيرا همانطور كه قبلاً گفتيم، ويندوز موبايل پيادهسازي خاصي از ويندوز CE و در حقيقت زيرمجموعهاي از قابليتهاي آن است. هرچند سيستمعامل CE با ويندوز معمولي متفاوت است، معماري اين سيستمعامل از همان معماري معروف ويندوز دسكتاپ الگو گرفته است. بنابراين اگر با منطق دروني سيستمعامل ويندوز آشنا باشيد، برنامهنويسي براي ويندوز موبايل برايتان موضوعي آشنا خواهد بود.
http://pnu-club.com/imported/2009/09/231.gif
کد 4
همه نرمافزارهاي مبتني بر ويندوز CE، كار خود را هنگامي شروع ميكنند كه سيستمعامل تابع WinMain را از درون كد برنامه فراخواني ميكند. بنابراين يكي از چهار ستون اصلي برنامههاي نوشته شده براي ويندوز موبايل، همين تابع است. اين تابع به نوبه خود بهطور مستقيم دو تابع ديگر را فراخواني ميكند كه به ترتيب وظيفه ثبت كلاس برنامه در حافظه، توليد پنجره نرمافزار و مقداردهي اوليه آن را به عهده دارند.
مرسوم است كه تابع ثبت كلاس برنامه را InitApplication يا MyRegisterClass مينامند و تابع توليد پنجره نرمافزار و مقداردهي اوليه آن را InitInstance نامگذاري ميكنند. تابع WinMain همچنين به طور غيرمستقيم موجب به كار افتادن يك تابع چهارم هم ميشود كه WndProc نام دارد و قلب تپندهِ برنامههاي تحت ويندوز است. اين تابع مسئول پاسخگويي به پيامهاي سيستمعامل است و كنش و واكنشهاي سه جانبه ميان برنامه، ويندوز، و كاربر را مديريت ميكند. روال به اين صورت است:
1- سيستمعامل تابع WinMain را فراخواني مينمايد و كد نرمافزار را در حافظه بارگذاري ميكند.
2- تابع WinMain يك قلاب (Handle) يا اشارهگر به Instance (يا نمونه اجرا شده از كد برنامه در حافظه) نرمافزار را برميگرداند و آن را داخل يك متغير سراسري كه در دسترس همه توابع برنامه باشد، قرار ميدهد.
3- سپس تابع InitApplication فراخواني ميشود. محتوا و نام اين تابع را برنامهنويس به دلخواه تعيين ميكند، اما اين تابع بايد حتماً بعد از انجام كارهاي مقدماتي مورد نظر برنامهنويس تابع توكار RegisterClass را احضار كند تا كلاس پنجره برنامه در حافظه ثبت شود.
4- در مرحله بعدي تابع InitInstance فراخواني ميشود. محتوا و نام اين تابع را نيز برنامهنويس تعيين ميكند، اما حتماً بايد تابع توكار CreateWindow در اين مرحله فراخواني شود تا پنجره نرمافزار توليد شود تا در مراحل بعدي به نمايش درآيد. اين تابع يك قلاب يا اشارهگر به پنجره برنامه برميگرداند كه بايد در يك متغير سراسري نوشته شود تا بعداً توسط ساير توابع برنامه قابل استفاده باشد.
5- سرانجام WinMain كليد اتوماسيون نرمافزار را ميزند و حلقه بيپايان پيامهاي سهجانبه ميان كاربر، ويندوز، و برنامه آغاز ميشود و تنها دكمه خروج ميتواند به اين حلقه پايان دهد. به اين ترتيب برنامه روح پيدا ميكند و كار اصلي خود را شروع مينمايد.
http://pnu-club.com/imported/2009/09/232.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_code05.gif)http://pnu-club.com/imported/2009/09/233.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_code06.gif)
کد 5
کد 6
اين حلقه را مثلثي مديريت ميكند كه از سه تابع توكار GetMessage ،TranslateMessage و DispatchMessage تشكيل ميشود. تابع سيستمي نخست، پيامهايي را دريافت ميكند كه از سيستمعامل و كاربر ميرسد. دومي اين پيامها را تفسير ميكند و سومي مسئول ارسال پيامهايي است كه برنامه به منظور تعامل با كاربر يا سيستمعامل يا واكنش نشان دادن به پيغامهاي آنها ارسال ميكند.
اما تابع WinMain مديريت اين پيامها را مستقيماً انجام نميدهد. اين كار به يك تابع جداگانه به نام WndProcسپرده ميشود كه سيستمعامل هنگام حيات چرخه پيامها مرتباً و به دفعات آن را فراخواني ميكند و از او كسب تكليف ميكند.
6- قلب برنامهنويسي شما در WndProc اتفاق ميافتد. در اين جا مسئوليت مديريت رويدادهايي را برعهده داريد كه به WndProc گزارش ميشود. به عنوان مثال شما نميتوانيد مستقيماً چيزي روي پنجره اصلي برنامه بكشيد، بلكه بايد منتظر بمانيد تا در اولين فرصت، پيام WM_PAINT از سيستمعامل به برسد. اين پيام خيلي ساده به شما ميگويد: «بسيار خوب! چه ميخواهيد بكشيد؟ آن را بكش!» يا به عنوان مثالي ديگر، وقتي كاربر دكمه خروج از برنامه را فشار ميدهد، پيام WM_CLOSE از سيستمعامل سر ميرسد. شما در اين مقطع ميتوانيد با فراخواني تابع توكار PostQuitMessage بساط نرمافزارتان را جمع كنيد و آن را از حافظه خارج سازيد.
يك برنامه ساده بنويسيد
اكنون ميخواهيم يك برنامه بسيار ساده بنويسيم كه در آن يك جمله داخل پنجره اصلي برنامه نمايش داده شود. براي اين منظور از ويزارد توليد برنامه در ويژوال سي 2005 استفاده ميكنيم و سپس تغييراتي در سورسكدي كه به طور خودكار توسط ويژوال استوديو توليد شده است، اعمال خواهيم كرد.
به منوي فايل در ويژوال استوديو مراجعه كنيد و گزينه New Project را انتخاب نماييد تا ويزارد توليد پروژه آغاز شود. براي انتخاب نوع پروژه به قسمت ++Visual C مراجعه نماييد و گزينه Smart Device را انتخاب كنيد و از قسمت سمت راست روي Win32 Smart Device Project كليك كنيد (شكل3).
حالا يك نام براي برنامه انتخاب كنيد (مثلاً Simplewinmobileapp) در اين مرحله ويژوال استوديو از شما ميخواهد SDK دلخواهتان را انتخاب كنيد تا كد برنامه متناسب با آن توليد و بهينه شود. اگر براي ويندوز موبايل 5 برنامهنويسي ميكنيد، يكي از دو نوع Windows Mobile 5.0 Pocket PC يا Windows Mobile 5.0 Smartphone يا هر دو را انتخاب كنيد و Next را بزنيد.
http://pnu-club.com/imported/2009/09/234.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_04a.gif)http://pnu-club.com/imported/2009/09/235.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_04b.gif)
شکل 4
سرانجام نوع برنامه (در اينجا Windows Application) را انتخاب كنيد (شكل4) و ويزارد را به پايان برسانيد. ويژوال استوديو به طور خودكار كدها و ماجولهاي لازم را توليد ميكند. اين يك برنامه خالي است كه فقط يك منوي HELPدارد كه يك گزينه About داخل آن است و پنجره About برنامه شما را باز ميكند. اين برنامه ساده همچنين يك گزينه OK در منوي پايين پنجره نشان ميدهد كه با زدن آن از برنامه خارج ميشويد.
http://pnu-club.com/imported/2009/09/236.gif (http://www.shabakeh-mag.com/img.aspx?l=/Data/Gallery/2008/1/s77_windowsmobile_05.gif)
شکل 5
براي كامپايل كردن، استقرار، اجرا و آزمايش برنامه دو راه داريد: يا امولاتور را انتخاب كنيد، يا يك دستگاه واقعي به كامپيوتر وصل كنيد و برنامه را روي آن بريزيد. براي انتخاب ميان انواع امولاتورها يا وسيله واقعي ميتوانيد از منوي DropDown مخصوص كه درست بالاي سمت چپ پنجره كدنويسي قرار دارد، گزينه Windows Mobile 5.0 Pocket PC Device براي وسيله واقعي يا يكي از گزينههاي ديگر را براي Emulator انتخاب كنيد.
http://pnu-club.com/imported/2009/09/237.gif
شکل 6
با فشردن دكمه Play يا كليد F5 برنامه كامپايل ميشود و سپس روي امولاتور يا وسيله واقعي مستقر و اجرا ميگردد. تا زماني كه از برنامه خارج نشدهايد، ميتوانيد آن را اشكالزدايي (Debug) كنيد. شكل 5 نمايي از محيط برنامهنويسي ويژوال استوديوي 2005 را نشان ميدهد و شكل 6 يك امولاتور را به نمايش گذاشته كه يك Pocket PC بدون قابليت تلفن همراه را شبيهسازي كرده است.
اكنون ميخواهيم سورس كد برنامه را كمي دستكاري كنيم و چيزي داخل پنجره برنامه بنويسيم. اين سورس دستكاريشده در فايلي به نام simplewin.cpp در ضميمه آنلاين مقاله روي سايت ماهنامه موجود است. تنها تغييري كه در سورس اوليه ايجاد كردهايم، افزودن يك متغير رشتهاي به نام SimpleText است كه جملهاي به فارسي درون آن نوشته شده است.
براي اينكه بتوانيد از متن فارسي و فرمت يونيكد در سورس كد استفاده كنيد، بايد فايل سورس را با Encodingمخصوص يونيكد (يعني Unicode - Codepage 1200) ذخيره كنيد. تغيير ديگري لازم نيست؛ زيرا ويندوز CE صورت توكار از يونيكد پشتيباني ميكند، اما توجه داشته باشيد كه نمايش موفقيتآميز اين عبارت فارسي مستلزم آن است كه قبلاً يك برنامه فارسي/عربيساز روي ويندوز موبايل وسيله شما نصب شده باشد.
امولاتور ويژوال استوديو نيز به صورت پيشفرض داراي چنين فارسيسازي نيست. بنابراين متن شما را نشان نخواهد داد. در هر صورت اگر براي نمايش متن فارسي مشكل داشتيد، آن را پاك كنيد و به جايش يك متن آزمايشي انگليسي بنويسيد تا بتوانيد دستكم كاركرد برنامه را بيازماييد.
متغير SimpleText دقيقاً در جايي كه پيام WM_PAINT پردازش ميشود، به نمايش در ميآيد. براي اين منظور بايد آنجا كه ويژوال استوديو براي راهنمايي ما يك كامنت گذاشته و نوشته است: TODO: Add any drawing code here يعني بين دو تابع توكار BeginPaint و EndPaint اين كار را انجام دهيم.
http://pnu-club.com/imported/2009/09/238.gif
شکل 7
http://pnu-club.com/imported/2009/09/239.gif
شکل 8
براي اين منظور كافي است يك مستطيل (نوع داده: RECT) تعريف كنيم و ابعاد پنجره برنامه را توسط تابع GetClientRect به آن نسبت دهيم. براي استفاده از اين تابع بايد قلاب يا Handle پنجره برنامه را كه قبلاً در تابع InitInstance داخل يك متغير سراسري گذاشتهايم به آن بدهيم تا بتواند پنجره و ابعاد آن را در حافظه پيدا كند.
سپس با استفاده از تابع DrawText متن را روي پنجره ترسيم ميكنيم. شكل 8 نمايي از برنامه در سيماي واقعي آن روي يك گوشي مجهز به ويندوز موبايل 5 را نشان ميدهد. شكل 7 برنامه ديگري است كه خيلي به اين برنامه شبيه است، اما براي ماجراجويي بيشتر، آن را از ابتدا با دست مينويسيم.
البته كافي است از سورس موجود در فايل simplewin2.cpp استفاده كنيد. كل سورس موجود در فايل اصلي برنامه كه نامي به صورت simplewinmobileapp.cpp دارد را پاك كنيد و محتويات simplewin2.cpp را درون آن بريزيد و برنامه را اجرا كنيد. ببينيد چه اتفاقي ميافتد؟
كد 1 نام و پارامترهاي ورودي چهار تابع اصلي برنامه simplewin2.cpp را نشان ميدهد. جزئيات هر يك از اين چهار تابع را ميتوانيد به ترتيب در كدهاي 3 تا 6 ملاحظه كنيد. كد 2 هم اعلان چند پارامتر، از جمله متغيرهاي سراسري براي نگهداري قلابها يا اشارهگرهاي پنجره و instance برنامه را نشان ميدهد.
برنامه دوم كه كمي غير استاندارد است، از برنامه اول كوچكتر است؛ زيرا منابع يا resourceهاي منتسب به پروژه را كه در فايلهاي rc تعريف شدهاند، نميخواند و بارگذاري نميكند. به همين دليل، برنامه منو ندارد و پنجره About پروژه نيز در دسترس نيست.
در اينجا يك شيطنت هم كردهايم. اگر به كد 5 كه تابع InitInstance را تعريف ميكند با دقت نگاه كنيد، سطري را ميبينيد كه مقدار ثابت WS_OVERLAPPED را بهعنوان سبك و سياق ظاهري پنجره برنامه به خورد تابع CreateWindow داده است.
اين مقدار پنجره برنامه را از حالت استاندارد و ثابت آن خارج ميكند و پنجره برنامه شناور و قابل جابهجايي ميشود. براي امتحان كردن اين نكته، با قلم (Stylus) روي Pocket PC واقعي يا با ماوس روي امولاتور Pocket PC لبه عنوان پنجره را بگيريد و بكشيد تا پنجره از جاي اصلي خود خارج شود تا به شكلي مشابه شكل 7 برسيد.
البته سورس اصلي توليد شده توسط ويزارد يا سورس دومي كه كپي كردهايد، نكتهها و مسائلي زيادي براي بررسي دارند كه مجال آن در اين مقاله نيست. خودتان ميتواند سرنخ را دنبال كنيد. اميدوارم با توضيحاتي كه در اين مقاله آوردم، سورس برنامه به اندازه كافي خوانا شده باشد. موفق باشيد!