C++ - کاربرد زبان c در بازی سازی- قسمت اول- صفحه 2

 




در این نمودار window class1 برای تعریف خواص پایه window1 استفاده شده( همینطور window 2 به همینصورت window class 2 برای window3 و window4 هر پنجره دارای خواص خاص خودشه مثل اندازه مکان اجزایی که داخلش و ... ولی خواص پایه در همشون یکیه.)

در این مرحله ما یک کلاس ویندوز را ثبت(register) میکنیم , به این معنی  که ما به ویندوز میگیم یک پنجره بر پایه اطلاعاتی که ما میدیم بسازه. کد زیر کار ثبت پنجره ما (همراه خواصی که میخوایم) را انجام میده»


// this struct holds information for the window class
WNDCLASSEX wc;

// clear out the window class for use
ZeroMemory(&wc, sizeof(WNDCLASSEX));

// fill in the struct with the needed information
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass1";

// register the window class
RegisterClassEx(&wc);


خوب حالا هر قسمت از این کد را توضیح میدم تا ببینیم چکار میکنه:

WNDCLASSEX wc
این ساختار (struct) که اطلاعات یک کلاس پنجره در اونه.اینجا نمیخوایم همه اجزای اونو توضیح بدم چون زیاد است. فقط قسمتی که به درد ما میخوره مهمه.اگه کاملش را میخواید میتونید تو msdn پیدا کنید .
خوب کلمه EX نشون میده که این ورژن جدید از ساختار WNDCLASS است که تقریباً یکی هستند و چیزایی که اضافه شده به کار ما نمیاد.و برای بقیه EX ها هم همینطور هست.


ZeroMemory(&wc, sizeof(WNDCLASSEX));

ZeroMemory یک تابع که تمام بلاک حافظه را با نول مقدار دهی اولیه میکنه.آدرسی که در پارمتر اول داده شده تعیین میکنه که از کجای بلاک حافظه باید شروع کنه.پارامتر دوم طول بلاک را تعیین میکنه.که ما این دوتا را با دادن آدرس wc و اندازه نوع ساختار wc پر کردیم  wndclass).


wc.cbSize = sizeof(WNDCLASSEX);

فکر میکنم این خودش معلومه که چیه.ما اینجا اندازه مورد نیاز ساختار را نشون میدیم که همون اندازه استانداره wndclassex است اندازه را به وسیله sizeof میگیریم.


wc.style = CS_HREDRAW | CS_VREDRAW;


در اینجا ما استایل پنجره را تعیین میکنیم.مقدارهایی که اینجا میشه استفاده کرد زیاد ولی ما تقریبا هیچ وقت به اونا تو game programming نیاز نداریم.(you can find others in msdn) برای حالا ما از CS_HREDRAW و OR منطقی با CS_VREDRAW استفاده میکنیم. کاری که اینا میکنه اینه که به ویندوز میگن که پنجره را در صورت حرکت دوباره ترسیم کنه یکیشون برای حرکت افقی و اون یکی برای حرکت عمودیه.این حالت برای یک پنجره مناسب ولی برای بازی نه! بعدا که ما پنجره را full screen کردیم این ها را بر میداریم.



wc.lpfnWndProc = (WNDPROC)WindowProc;

این مقدار به کلاس ویندوز میگه که وقتی پیغامی از ویندوز دریافت کرد(مثل پیام خروج برنامه) از چه تابعی برای پاسخ به اونا استفاده کنه .در برنامه ما اسم این تابع WindowProc است ولی میتونه هر اسمی داشته باشه مثل WndProc یا WinProc و یا حتیasdfsadf
wc.hInstance = hInstance;


ما این قسمت را در بخش قبل توضیح دادیم این یک هندل برای کپی برنامه ما است..
wc.hCursor = LoadCursor(NULL, IDC_ARROW);

این عضو تصویر حالت عادی موس ما رو برای کلاس پنجره ذخیره میکنه .و بوسیله استفاده از مقدار بازگشتی LoadCursor() این کار را انجام میده. این تابع دارای دو پارامتر است :اولی هندل به وهله(hInstance) برنامه که گرافیک اشاره گر را ذخیره میکنه.که ما نیازی به اون نداریم و اونو NULL رها میکنیم.پارامتر دوم مقداری است که اشاره گر پیش فرض موس را در بر داره. بازم میتونید برید تو MSDN برای بقیه انتخابها.


wc.hbrBackground = (HBRUSH)COLOR_WINDOW;

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


wc.lpszClassName = L"WindowClass1";

این نام کلاس پنجره است که ما میسازیم در اینجا ما اسم اونو windowsClass1 گذاشتیم حتی اگر فقط یک کلاس پنجره داشته باشیم . مهم نیست چه نامی برای اون میزارید . حرف L قبل از رشته نام پنجره به کامپایلر میگه که این رشته از 16bit unicode character ساخته شده به جایه اینکه از مقدار پیش فرض 8bit ansi character ساخته شده باشه.


RegisterClassEx(&wc);

و در آخر ما با این فرمان کلاس پنجره خود را ثبت میکنیم.این تابع فقط دارای یک پارامتر است که اونم آدرس ساختار .بقیه کارم با ویندوزه!.

 


2. Create the Window

مرحله بعد ساخت یک پنجره است.حالا که ما کلاس پنجره مون را ساختیم می تونیم پنجره هارو بر اساس اون بسازیم.
ما فقط به یک پنجره نیاز داریم پس مسیله مشکلی نیست. برای ساخت یک پنجره ما به کد زیر ادامه داریم:
// create the window and use the result as the handle
hWnd = CreateWindowEx(NULL,
L"WindowClass1", // name of the window class
L"Our First Windowed Program", // title of the window
WS_OVERLAPPEDWINDOW, // window style
300, // x-position of the window
300, // y-position of the window
500, // width of the window
400, // height of the window
NULL, // we have no parent window, NULL
NULL, // we aren't using menus, NULL
hInstance, // application handle
NULL); // used with multiple windows, NULL

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

HWND CreateWindowEx(DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam);


DWORD dwExStyle,

این پارامتر از وقتی آمد که تابع RegisterClass() به RegisterClassEX() تبدیل شد . و از چهار پارامتر شامل شده که در انتخاب استایل دست ما رو بازتر میکنه و انتخاب های بیشتری داریم که بازم اینجا توضیح نمیدیم میتونید برید MSDN
LPCTSTR lpClassName,

این همون نام کلاس پنجره ای که ساختیم و میخوایم استفاده کنیم.چون فقط یک کلاس داریم از همون استفاده میکنیم یعنی" L"WindowsClass1 این رشته هم از 16bit unicode character استفاده میکنه بخاطر L در پشت اسم.
LPCTSTR lpWindowName,

این نام پنجره ای که میسازیم اسمش به صورت عنوان پنجره در بالا نمایش داده میشه. بازم16bit ....
DWORD dwStyle,
این جایی که انتخاب هامون را برای پنجره بکنیم. مثلا میتونید کلید های minimize maximize را بردارید و کارایی از این قبیل بازم برای اطلاعات بیشتر برید MSDN !! ما در اینجا از مقدار WS_OVERLAPPEDWINDOW که میانبریه که شامل چندین مقدار با همه که یک استاندار برای یک پنجره عادیه.
int x

موقعیت پنجره را برروی محور x ها روی صفحه تعیین میکنه.
int y

موقعیت پنجره را برروی محور y ها روی صفحه تعیین میکنه.
int nWidth,

پهنا یا عرض پنجره را تعیین میکنه.
int nHeight,

طول پنجره را تعیین میکنه.
HWND hWndParent,

این پارامتر به ویندوز میگه که پنجره ما از کدوم پنجره منشا گرفته شده که برای ما از هیچ پنجره منشایی گرفته نشده(پنجره منشا یا parent پنجره که پنجره های دیگه را شامل میشه)چون ما نداریم مقدارشو NULL میزاریم.
HMENU hMenu,

این یک هندل به menu bar که ما بازم اینجا نداریم پس اینم NULL.
HINSTANCE hInstance,

اینم یک هندل به وهله .hInstance مقدار دهی کنید
LPVOID lpParam

این یک پارامتر که ما میتونستیم استفاده کنیم در صورتی که چندتا پنجره داشته باشیم. پس اینم اینجا NULL.
Return Value


مقدار بازگشتی یک هندل که ویندوز برای پنجره جدید اختصاص میده. ما اینو مستقیما در hWnd ذخیره میکنیم.
hWnd = CreateWindowEx(NULL,
...

                         صفحه 1             صفحه 2               صفحه 3          عناوین مطالب

آمار بازدیدکنندگان

آنلاین: 5
امروز: 647
دیروز: 292
ماه: 1697
سال: 9065
کل: 191224
آخرین بازدید: 22:16