نمایش نتایج 1 تا 30 از 30

نام تاپیک: آموزش مقدماتی Win32

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #4

    نقل قول: آموزش مقدماتی Win32

    پنجره ها و پیغامها :

    در فصل گذشته مثالهای ما از تابع ()MessageBox برای نمایش یک خروجی متنی به کاربر مورد استفاده قرار می گرفت. تابع ()MessageBox یک پنجره می سازد. در ویندوز کلمه "Window" به معنای پنجره، دارای یک معنای مختصر و مفید است. یک پنجره، یک فضای مستطیل شکل بر روی صفحه نمایش می باشد که از کاربر ورودی گرفته و خروجی را بصورت متن و گرافیک نمایش می دهد. این یک تعریف ساده و ابتدایی از یک پنجره بود و البته پنجره یک واسطه گرافیکی و تعاملی برای ارتباط کاربر با برنامه شما می باشد.

    تابع ()MessageBox یک پنجره می سازد اما این پنجره برای مقصود خاصی و با انعطاف پذیری محدود بکار می رود. پنجره پیغام از یک نوار عنوان و یک دکمه برای بستن و چندین خط برای توضیح و یک آیکون تصویری تشکیل شده. محدوده سفارشی کردن این پنجره به یک مجموعه کوچک دکمه ها و آیکون ها که در سیستم عامل ویندوز تدارک دیده شده محدود می شود. پنجره پیغام تنها هدف ما نبوده و ما باید برای تمام نیازهایمان پنجره مخصوص خودمان را بسازیم.


    اطلاعاتی در مورد پنجره :

    پنجره برای ساخته شدن نیاز به تابع ()CreateWindow دارد. این تابع عملا یک پنجره می سازد. ولی قبل از ساخته شدن یک پنجره نیاز به تنظیماتی می باشد. اولین آرگومان تابع ()CreateWindow یک نمونه از کلاسی به نام کلاس پنجره (Window Class) می باشد و این کلاس در برنامه زمان اجرا ، با چیزی به نام پروسیجر پنجره (Window Prosedure) در ارتباط است. عجله نکنید، هم اکنون ما قبل از ساخته شدن پنجره نیاز به یکسری اطلاعات پس زمینه داریم که مفیدند.


    بازبینی یک معماری :

    زمانی که شما برای ویندوز برنامه نویسی می کنید، واقعا در حال برنامه نویسی با یک نوع خاص از شیء گرایی هستید. این موضوع بیشتر زمانی نمود پیدا می کند که شما داخل یک شیء مشغول به کار هستید. یک شیء مهمتر وجود دارد که نام ویندوز را بخود گرفته است. بنظر می آید این شیء رفتارهایی شبیه به انسان دارد. این شیء می تواند در خیال شما این را مجسم کند که : این شیء واقعاً می داند که یک پنجره است.

    بیشترین پنجره های قابل دید که صفحه دسکتاپ شما را مزین می کنند از نوع اپلیکیشن های پنجره (WindowsApplication) می باشند. این پنجره ها شامل قسمتهایی مانند نوار عنوان برای نمایش یک نام، یک نوار منو، و در موارد نیاز داری نوار ابزار، نوار پیمایش و ... می باشد. انواع دیگر پنجره ها در حقیقت پنجره های محاوره ای (DialogBox) می باشند، که از پیش آماده و برای مقاصد محدود و استاندارد بکار می رود.

    اشیاء گوناگون دیگری نیز در پنجره های محاوره ای وجود دارند که نسبتا کمتر به چشم می آیند. مانند buttons، radio buttons ، check box ، list box، scrollbar و ... . هر کدام از این اشیاء کوچک قابل دید، در حقیقت یک پنجره می باشد که مخصوصا بیشتر به آنها پنجره های فرزند و یا پنجره های کنترل و یا کنترل های بچه پنجره می گویند.

    کاربر این پنجره ها را به صورت اشیاء در صفحه نمایش مشاهده می کند و بوسیله ماوس و کیبرد مستقیما با آنها در تعامل است. این نکته به اندازه کافی قابل توجه می باشد که یک برنامه نویس این اشیاء را همانگونه می بیند که یک کاربر آنها را مشاهده می کند. پنجره ورودی از کاربر را در قالب پیغام هایی که به پنجره ارسال می شود دریافت می کند. همچنین پنجره از این پیغامها برای تعامل با پنجره های دیگر استفاده می کند. درک صحیح پیغامها و طریقه عملکرد آنها یک بخش مهم از این آموزش است که چگونه برای ویندوز برنامه بنویسیم.

    این یک مثال در مورد پیغامهای ویندوز می باشد: همانطور که می دانید بیشتر برنامه های ویندوز دارای پنجره های قابل تغییر اندازه می باشند. یعنی اینکه شما می توانید با کلیک ماوس روی لبه پنجره و کشیدن آن، اندازه پنجره را تغییر دهید. برنامه نیز بارها با اصلاح همزمان محتویات مربوط به پنجره به این تغییر پاسخ می دهد. آیا توانستید حدس بزنید؟ ویندوز خودش سریعتر از یک برنامه اپلیکیشن قادر است تا کدهای شلوغ و پیچیده خود را در زمان مثلا تغییر اندازه پنجره بررسی کند. با این حال اپلیکیشن می داند که پنجره تغییر اندازه داده است.

    حال اپلیکیشن چگونه متوجه می شود که کاربر اندازه پنجره را تغییر داده است؟ برنامه نویسان اغلب به برنامه نویسی حالت نوشتاری (Character-mode)که قرار دادی می باشد عادت کرده اند. اما طرزکار سیستم عامل برای رساندن اطلاعات بدین صورت نمی باشد. حال یک جواب باید برای این سوال محوری باشد تا بهتر معماری ویندوز را بشناسیم. زمانی که کاربر پنجره را تغییر اندازه می دهد، ویندوز یک پیغام به برنامه ارسال می کند که مشخص کننده اندازه جدید پنجره است. سپس برنامه نیز می تواند محتویات پنجره را تنظیم کند و اندازه جدید را بازگرداند.

    " ویندوز یک پیغام به برنامه ارسال می کند" من امیدوارم که شما این عبارت را سطحی نخوانید. این به چه معناست؟ سیستم عامل چگونه می تواند به یک برنامه پیغامی ارسال کند؟
    در حقیقت سیستم عامل یک تابع خاص را در برنامه شما فراخوانی می کند. این تابع را شما می نویسید و این تابع در اصل یک قسمت ضروری از کد برنامه شما می باشد. برنامه نویسان در این تابع به بررسی خصوصیات پیغام می پردازند که توسط ویندوز ارسال شده و برنامه شما آن را دریافت کرده است. این تابع را پروسیجر پنجره (window procedure) می نامند.

    بدون شک شما به این تصور عادت کرده اید که همیشه این برنامه است که فراخوانی توابع را به سیستم عامل انجام می دهد. برای مثال این در مواقعی مانند باز کردن یک فایل از دیسک می باشد. پس در برنامه های ویندوز هر دوی حالات وجود دارد.

    به ازای هر پنجره یک پروسیجر پنجره در برنامه مربوط به آن وجود دارد. این پروسیجر پنجره می تواند در برنامه خودش یا در یک DLL قرار داشته باشد. ویندوز بوسیله فراخوانی پروسیجر پنجره یک پیغام را به پنجره ارسال می کند. در این تابع نیز پردازش روی برخی از پیغامها که از طرف برنامه نویس مشخص شده است انجام شده و سپس دستورات و تنظیمات جدید به پنجره ارسال می شود.

    حال موضوع را بیشتر می شکافیم. هر پنجره معمولا از پایه کلاس پنجره (window class) ساخته می شود. این کلاس پنجره است که در اصل پروسیجر پنجره را تشخیص می دهد. با استفاده از کلاس پنجره، این اجازه را داریم که چندین پنجره را از پایه یک کلاس پنجره مشترک بسازیم، از این رو از یک پروسیجر پنجره نیز می توانیم برای چندین پنجره استفاده کنیم. به عنوان مثال، تمام دکمه ها در تمام برنامه های ویندوزی از پایه یک کلاس پنجره مشترک می باشند. این کلاس پنجره نیز وابسته به یک پروسیجر پنجره می باشد که در یک DLL در ویندوز قرار دارد و آن هم پردازش پیغامهای تمام دکمه ها را در وینـدوز انجام می دهد.

    در برنامه نویسی شیء گرا، یک شیء مرکب از کد و داده می باشد. پنجره یک شیء است. پروسیجر پنجره، کد می باشد. و داده اطلاعاتی هستند که توسط پروسیجر پنجره و یا سیستم عامل برای هر پنجره نگهداری می شود.

    خیلی از پیغام های ویندوز حاوی ورودی کاربر از طریق ماوس و کیبرد می باشند که به پنجره ارسال می شوند. به عنوان مثال دکمه ها که گفته شد نوعی پنجره هستند می فهمند که از طریق ماوس رویشان کلیک شده است. مابقی پیغامها با پنجره تماس می گیرند و اطلاعاتشان را ارسال می کنند. مانند زمانی که پنجره تغییر سایز می هد و یا زمانی که سطح پنجره نیاز به ترسیم مجدد دارد.

    زمانی که یک برنامه ویندوزی شروع به اجرا می کند، ویندوز یک صف پیغام (message queue) برای آن برنامه می سازد و در این صف پیغام تمام پیغامهای پنجره هایی که برنامه می تواند بسازد ذخیره می گردد. یک اپلیکیشن ویندوزی مشتمل شده از یک قطعه کوتاه از کد که آنرا حلقه پیغام (message loop) می نامند و ارسال کننده پیغامها. حلقه پیغام وظیفه دریافت پیغامهای ارسالی را بر عهده دارد و ارسال کننده نیز این پیغام ها را به پروسیجر پنجره مقتضی می فرستد. مابقی پیغام ها بطور مستقیم بدون قرارگیری در صف پیغام ها به پروسیجر پنجره ارسال می شوند.

    یک برنامه ویندوزی رویداد گرا می باشد. این بدین معنی است که شما به عنوان برنامه نویس، فرضاً در یک حالت دفاعی به سر می برید. یک کاربر پنجره در دست رس را با عملهای مختلف بمب باران می کند و پنجره نیز برنامه شما را با پیغامهایی متناظر با عملیات کاربر همزمان بمب باران می کند. کلا شما مرتب پیغامهای تازه رسیده را چک می کنید و جواب را به پنجره ارسال می کنید. تصویر زیر بصورت شماتیک مراحل را نشان می دهد.



    پنجره رویدادهای (Events) مختلفی را دریافت می کند، مانند کیبرد، ماوس، پورتها و ... . هر رویداد زمان دریافت به سرعت به یک پیغام تبدیل می شود. در اینجا سیستم عامل ویندوز پیغام را به پنجره مربوطه مخابره می کند. به عنوان مثال تمام پیغامهای دریافت شده از صفحه کلید به پنجره ای که فوکوس (Focus) را در دست دارد (پنجره فعال) فرستاده می شود. پیغامهای ماوس نیز به محل موقعیت مکانی نشانگر ماوس فرستاده می شوند و معمولا آنها به پنجره ای که مستقیما زیر نشانگر قرار دارند انتقال می یابند (مگر برنامه هایی که از ماوس استفاده نمی کنند).

    برنامه شما با فراخوانی تابع ()GetMessage یک پیغام را بازیابی می کند. سپس شما با فراخوانی تابع ()DispatchMessage پیغام را به پنجره برمی گردانید. سوالی که وجود دارد اینست که آیا پنجره قادر به ارسال پیغامها به خودش نیست؟ جواب: اصولا باید قادر به ارسال باشد، اما حلقه تکرار پیغامها این توانایی را به برنامه شما می دهد تا بصورت نامحسوس پنجره را زیر نظر داشته باشد و همچنین عملیات اضافی احتمالی را قبل از ارسال روی پیغامها انجام دهید.

    اگر چشمان شما از این توضیحات در مورد معماری ویندوز سیاهی رفته ناراحت نباشید. مثالی که ما از طریقه ساخت پنجره ها بیان خواهیم کرد، دید شما را در مورد اینکه پنجـره، کلاس پنجره، پروسیجر پنجره، صف و حلقه پیـغامها چیستند روشنتر خواهد کرد.
    عکس های ضمیمه عکس های ضمیمه

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •