»» برنامه نویسی GUI با win32api
این مطلب برای شروع برنامه نویسی ویندوز از اهمیت خاصی برخوردار بود. داشتم می نوشتم که توی یه وباگ دیدم.
البته مطمئنن سوال های زیادی براتون با دیدین این مقاله پیش میاد. حتماً کامنت بزارین تا ادامه بدیم.
اولین قدم نوشتن برنامه های سه بعدی برای دایرکت ایکس، نوشتن یه فرم ویندوز هست تا بتونیم دایرکت ایکس رو در داخل اون اجرا کنیم. پس مهمه که بدونیم چطور یه فرم ویندوز بنویسیم.
مقاله زیر از نوشته های آقای سعید هستش که من با اجازه از وبلاگشون کپی کردم. آدرس وبلاگشونم اینه http://win32api.blogfa.com/
-------------------------------------------------------------------------------------------------------------------------------------
Application Programming Interface:برای
یک برنامه نویس، سیستم عامل توسط API های اون تعریف می شود. API شامل
تمامی توابعی است که یک برنامه کاربردی می تواند توسط سیستم عامل آنها را
فراخوانی کند. همچنین API شامل تعاریف نوع داده های وابسته (associated
data types) و ساختار ها نیز هست.
به طور کلی API شامل مجموعه ای از
روال هاست (routines) که یک برنامه کاربردی از آن برای رهبری کردن اجرای
پردازه ها (procedures) توسط سیستم عامل استفاده می کند.
نکته جالب
اینجاست که ساختار کلی API از windows 1.0 تا حالا تغییر چندانی نکرده و
تغییرات در سیستم عامل های بالاتر مربوط به امکانات آنهاست. windows 1.0
فقط از 450 تابع پشتیبانی می کرد درحالی که این تعداد در ویندوزهای جدید
به چندین هزار تابع رسیده است.
بزرگترین تغییرات در API و syntax آن
مربوط میشود به تغییر معماری ویندوز از 16bit به 32bit. معماری ویندوز از
نسخه 1.0 تا نسخه 3.1 از نوع 16bit بوده است. در این ویندوز ها از روش
آدرس دهی segmented (روشی که در آن memory به بخش های 64kb تقسیم می شده
تا بتوان آنها را به سبک 16 بیتی آدرس دهی کرد.) استفاده می شده که توسط
پردازش گرهای 16 بیتی اینتل: 8086, 8088 و 286 microprocessors فراهم شده
بود.
در نسخه های windows 95 و windows NT برای اولین بار از روش آدرس
دهی flat (روشی که در آن پردازنده قادر است به بخشهایی با اندازه بیش از
4GB با یک آدرس واحد دسترسی پیدا کند) استفاده شد. این امکان توسط توسط
پردازنده های Intel 386, 486, and Pentium processors فراهم شد.
برنامه
هایی که برای ویندوز های 32 بیتی نوشته می شوند، از pointer های 32 بیتی
برای ذخیره سازی آدرسهای خطی حافظه (flat linear address space) استفاده
می کنند.
API برای ویندوزهای 16 بیتی که قبلا نام بردم، win16 نامیده می شوند. همچنین API برای ویندوزهای 32 بیتی win32 نامیده می شوند.
MFC یا WIN32API:
همیشه انتخاب یکی از این دو روش برای کسانی که می خواهند برنامه نویسی ویندوز را به تازگی شروع کنند سخت بوده است.
MFC توسط microsoft برای ساده کردن آشفتگی های موجود در برنامه نویسی API ارائه شده است.
MFC
با encapsulates کردن (در پوشش گذاشتن) توابع API در مجموعه ای از کلاسها
این امر را فراهم کرده است. برای مثال کلاس CDialog در mfc، کار تابع
dialog boxe را در win32api انجام می دهد.
MFC یک قالب از پیش تعریف
شده (framework) برای برنامه نویسی ویندوز است، بنابر این نمیتواند تمام
نیازهای یک برنامه نویس را پیش بینی کند.
mfc یک کتابخانه جامع مانند C
run-time library نیست. برای مثال ساخت سرویسهای ویندوز با mfc به راحتی
امکان پذیر نیست و در واقع باید گفت :"Microsoft does not support using
MFC to build Windows services" بدین معنا که: مایکروسافت ساخت سرویسهای
ویندوز توسط mfc را حمایت نمی کند. اما MFC همچنان از محبوبیت بالایی در
بین برنامه نویسان ویندوز برخوردار است.
در مقابل win32api ، هرچند
در نگاه اول کمی سخت به نظر می رسد ولی به شما این اجازه را می دهد تا از
تمامی امکانات ویندوز استفاده کنید. به طور کلی یادگیری win32api به شما
کمک می کند تا فهمی بسیار عمیق و دقیق از چگونگی عملکرد درونی windows و
برنامه های کاربردی به دست آورید.
توابع API:
تمامی توابع api در فایلهای dll ویندوز قرار دارند. شما وقتی میتوانید از یک تابع api استفاده کنید که:
1. Header فایلی که آن تابع در آنجا اعلان (Declared) شده را در برنامه فراخوانی کرده باشید.
2. فایل dll. که آن تابع در آن تعریف شده است در ویندوز موجود باشد.
3. فایل lib. مربوطه را به لینکر معرفی کرده باشید.
Linker و فایل های lib. :
همان
طور که میدانید وقتی یک source code را کامپایل می کنید، خروجی شما فایلی
با پسوند obj. است نه exe. تولید فایل exe بر عهده ی linker است. اما
linker این کار را چگونه انجام می دهد؟ قبل از جواب بهتر است اول تعریفی
ساده از فایل های lib. داشته باشیم:
Import library ها فایل هایی با
پسوند lib. می باشند که حاوی اطلاعاتی شامل نام فایلهای dll و اصلاعات
مرجع برای فراخوانی توابع هستند.در ضمن این نوع کتابخانه ها بر خلاف dll
ها از نوع static هستند. یعنی از اطلاعات آنها در زمان کامپایل (compile
time) استفاده می شود ، نه در زمان اجرا (run time) .
Linker از این
اطلاعات برای ساخت لیست (table) در فایل exe. استفاده میکند و در نهایت
ویندوز از این لیست برای تشخیص فایل های dll مورد نظر و توابع فراخوانی
شده توسط برنامه استفاده می کند.
ویندوز بعد از تشخیص dll های مورد نیاز آنها را در memory بارگذاری میکند. البته اگر قبلا در حافظه load نشده باشند.
شما میتوانید با مراجعه به Project Properties تنظیمات linker را انجام دهید. در پست های بعدی بیشتر در این زمینه توضیح خواهم داد.
در
ویندوز بیشتر عملیات توسط 3 تا از مهمترین زیر سیستم ها یعنی Kernel, User
و GDI انجام می شود. هر چند در ویندوز های جدید تعداد این زیر سیستم ها
افزایش یافته ولی همچنان این سه فایل دارای اهمیت هستند:
1. Kernel
نام فایل: در ویندوزهای 16 بیتی KRNL386.EXE - در ویندوزهای 32 بیتی KERNEL32.DLL
وظیفه: انجام وظایف مربوط به هسته ویندوز شامل مدیریت حافظه ، file I/O و مدیریت وظیفه (tasking)
2. User
نام فایل: در ویندوزهای 16 بیتی USER.EXE - در ویندوزهای 32بیتی USER32.DLL
وظیفه:
مراجعه به میانجی کمکی (user interface) و اجرای منطق کلی، مربوط به ایجاد
ویندوز. (تابع CreateWindow که وظیفه ی ساخت یک ویندوز را بر عهده دارد در
این فایل تعریف شده است)
3. GDI
نام فایل: در ویندوز های 16 بیتی GDI.EXE - در ویندوزهای 32 بیتی GDI32.DLL
وظیفه: به برنامه اجازه می دهد تا بتواند متن و گرافیگ را در صفحه نمایش و پرینتر نمایش دهد.
محیط برنامه نویسی:شما
میتوانید از یکی از کامپایلر های استاندارد ++C/C استفاده کنید. باید بگم
ساختار کلی برنامه نویسی api به زبان C است ولی به راحتی می توان از خاصیت
شی گرایی ++C (کلاسها) نیز استفاده کرد. من خودم از Microsoft Visual
Studio 2008 استفاده میکنم. برنامه هایی که با کامپایلر و لینکر microsoft
ساخته می شوند از سرعت بسیار بالایی برخوردارند.
در پست های بعدی به مطالب بیشتری اشاره خواهم کرد. فعلا برای شروع کد زیر را کامپایل کنید.
برای کامپایل کردن در visual studio 2008 و 2005 مراحل زیر را دنبال کنید:
از
منوی فایل new project را انتخاب کنید. از پنجره ی باز شده در قسمت
project type روی ++Visual C کلیک کنید، سپس از قسمت Templates قالب win32
project را انتخاب کنید.
یک نام برای پروژه خود انتخاب کنید، مثلا exercise
سپس ok کنید. از پنجره باز شده روی next کلیک کنید.
گزینه Empty project را انتخاب و سپس ok کنید.
در
محیط visual studio قسمتی به نام Solution Explorer (در سمت چپ) وجود دارد
که تمام اطلاعات project را به صورت یک ساختار درختی نمایش می دهد. اما
فعلا پروژه ما خالی است.
در این قسمت 3 پوشه کوچک به نام های Header
Files , Resource Files و Source Files وجود دارد. روی Source Files راست
کلیک کنید و add->new item را انتخاب کنید.
در قسمت Categories روی Ccode کلیک کنید و سپس ++File C را انتخاب کنید.
یک نام برای فایل خود انتخاب کنید. مثلا main
سپس کد زیر را در فایل نوشته و کامپایل کنید.
همان طور که می بینید برای ساخت یک پنجره ساده به بیش از 70 خط کد نیاز است:
#include
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStock (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
نوشته های دیگران ()
نویسنده متن فوق: » کهکشان ( شنبه 87/4/29 :: ساعت 1:28 صبح )
»» لیست کل یادداشت های این وبلاگ
عملکرد کلیدهای F در ویندوز xpبا Safe Mode چگونه می توان مشکلات ویندوز را برطرف کرد؟بهترین حالت Safe Modeسلام کار دکمه scroll lock بر روی صفحه کی بورد چیست ؟کلیدهای Insert ، Pause/break . Scroll lock در کیبورد چه کاربردیضرورت Disk Defragmentation و Disk Cleanup در ویندوز به زبان سادهشنود موبایل چگونه انجام میشود؟ + روشهای مقابلهاجرای برنامه ها در یک فضای مجزا در حافظهاجباری کردن پسورد برای ویندوز 98 همانند ویندوز XPتهیه ی نسخه ی پشتیبان از رجیستری و تعمیر رجیستری آسیب دیده :مشاهده ی تغییرات ایجاد شده در رجیستری[عناوین آرشیوشده]