PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه نویسی گرافیک در c و ++c



آبجی
13th April 2010, 02:19 AM
مقدمه:
اکنون بیش از 15 سال از انتشار کامپایلرهایی همچون ++Turbo C برای توسعه در محیط DOS می گذرد و در طی این سال ها امکانات و کتابخانه های بسیاری به زبان های C و ++C اضافه شده است از جمله STL در ++C که بسیاری از الگوریتم های معروف و پرکاربرد مانند پشته ، لیست پیوندی ،انواع صف ، انواع مرتب سازی ها و غیره را بدون نیاز به پیاده سازی در اختیار شما قرار می دهد که برای بهره مندی از این امکانات می بایست از کامپایلرهای جدید و به روز 32/64 بیتی استفاده کرد، از جمله:
++Visual C و ++minGW/Dev C (کد باز و رایگان) و C++‎Builder و ...

نکته: امروزه در محیط های آموزشی سراسر دنیا از نسخه های رایگان این کامپایلرها و یا کامپایلرهای کد باز به عنوان جایگزینی برای ++Turbo C استفاده می کنند.

سوال- آیا می توان از توابع گرافیکی قدیمی graphics.h در محیط های جدید برنامه نویسی مانند Visual C++ /Borland C++‎builder / gcc / mingw و ... استفاده کرد؟

خیر، این توابع از جمله توابع 16 بیتی قدیمی و منسوخ شده بورلند می باشند که برخلاف تفکر برخی از نوآموزان، جزئی از این زبان نیست.

لذا برای توسعه های جدید، چندین راه وجود دارد:

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

در ویندوز دوستان می توانند با توابع گرافیکی GDI و +GDI از طریق شیوه های win32 و MFC با کامپایلرهای ++VC و ++DevC و یا از طریق VCL با کامپایلر C++‎Builder این کار را انجام دهند.
توجه کنید که با مطالعه بخش گرافیکی یکی از لینک های زیر در مدتی بین دو هفته تا یک ماه قادر به ایجاد برنامه های گرافیکی، بازی ساده گرافیکی و همین طور کار با mouse و keyboard خواهید بود:

برای win32 (سطح پایین ،اما یادگیری با مراجع زیر بسیار راحت می باشد):
http://www.functionx.com/win32/index.htm
http://www.winprog.org/tutorial/

برای MFC (کمی ساده تر از مورد فوق)
http://www.functionx.com/visualc (http://www.functionx.com/visualc/)


برای VCL

http://www.functionx.com/bcb/index.htm


-------------------------------
روش 2) استفاده از توابع کنسولی مایکروسافت برای command prompt ویندوز ، لیست این توابع در لینک زیر موجود می باشد:
لیست توابع کنسولی مایکروسافت (http://msdn2.microsoft.com/en-us/library/ms682073%28VS.85%29.aspx)

در این روش شما باید معادل توابع graphics.h را که در محیط Turbo C و کامپایلر های سری قدیم بورلند وجود داشت را با توابع 32 بیتی کنسولی مایکروسافت پیاده سازی کنید، به عنوان مثال برای gotoxy و clrscr لینک زیر را مشاهده کنید:
معادل توابعی مثل gotoxy و clrscr در (http://barnamenevis.org/forum/showthread.php?t=92264)++ (http://barnamenevis.org/forum/showthread.php?t=92264)VC (http://barnamenevis.org/forum/showthread.php?t=92264)

توجه به این مورد ضروری می باشد که محیط command prompt ویندوز محیطی کاملا متفاوت از محیط 16 بیتی DOS می باشد و نباید انتظار داشته باشید که تمامی امکانات 16 بیتی قدیمی توسط این کامپایلرها به همان شکل در اختیار شما قرار گیرد، از جمله رسم اشیاء گرافیکی همانند قبل در این روش امکان پذیر نیست و جداول و اشکال ساده می بایست توسط خطوط و کارکترها پیاده سازی شوند، اما این قابلیت در اختیار شما قرار می گیرد که بتوانید از اکثر توابع پیشرفته سیستم عامل در محیط کنسول استفاده کنید.

لینک زیر شامل مثال ها و آموزش های کامل در زمینه استفاده از همین توابع کنسولی win32 می باشد، پس قبل از هر کاری ابتدا نگاهی به نمونه های پیاده سازی شده در این سایت بیاندازید:
http://www.adrianxw.dk/SoftwareSite/index.html

-------------------------------
روش 3) روش ساده تر از مورد قبل، استفاده از کتابخانه های 32 بیتی آماده غیر استاندارد و معادل graphic.h می باشد که برخی از آن ها open source (کد باز) نیز می باشد، مانند WinBGI که می توانید فایل های آن را از صفحه زیر دانلود کرده و استفاده کنید:
فایل های مربوط به WinBGI به همراه یک نمونه مثال (http://csci.biola.edu/csci105/using_winbgi.html)

توجه کنید که این کتابخانه از توابع گرافیکی win32 استفاده می کند و برای نمایش آن ها پنجره سیاه دیگری همانند کنسول باز می شود که قادر هستید در آن اشکال گرافیکی را همانند برنامه های ویندوز به سادگی برنامه های گرافیکی Turbo C رسم کنید.

-------------------------------
روش 4) آخرین و بدترین روش برگشتن به محیط قدیمی ++Turbo C و استفاده از همان توابع گرافیکی graphics.h می باشد که در برخی کتاب ها از جمله کتاب C جعفرنژاد قومی به آن پرداخته شده است. (البته امیدوارم به عنوان یک دانشجو و یا حتی کسی که می خواهد در حد پروژه های ساده با این زبان آشنا شود این گزینه را انتخاب نکنید)

آبجی
13th April 2010, 11:58 PM
Using Mouse Input (http://msdn.microsoft.com/en-us/library/ms645602%28VS.85%29.aspx)
برای یک نمونه خوب حتما Drawing Lines with the Mouse را در لینک فوق مطالعه کنید.

How To Use Win32 API to Draw a Dragging Rectangle on Screen DC (http://support.microsoft.com/kb/q135865/)

Win32 API - Tutorial (http://www.mini.pw.edu.pl/%7Emossakow/materials/presentations/win32.en/index.html)
در لینک فوق نمونه های پیام WM_LBUTTONDOWN و WM_LBUTTONUP را برای پردازش mouse بررسی کند.

آبجی
14th April 2010, 12:02 AM
کاربرانی که دنبال یک آموزش کامل برای ساختن یک Text Editor حرفه ای مانند Word یا محیط نوشتاری visual studio هستند (از طریق win32 API و ++C ) می توانند از مقاله فوق العاده زیر استفاده کنند که شخصا ارادت خاصی به ایشون و مقالاتشون دارم.

حدود 18 صفحه می باشد و مرحله به مرحله امکانات را به آن اضافه می کند و هر صفحه نیز شامل سورس کد می باشد (پیش نیاز آن آشنایی اولیه با win32 می باشد که در پست اول لینک دو سایت قرار داده شده است):

Design and Implementation of a Win32 Text Editor (http://www.catch22.net/tuts/editor01.asp)

آبجی
14th April 2010, 12:07 AM
پیش نیاز این آموزش:
- مطالعه دو لینک آموزشی در پست اول برای آشنایی با مفاهیم ساخت پنجره و پیام ها
- استفاده از کامپایلر visual C++‎ 2005 یا بالاتر


نحوه انجام:
1) ابتدا به منوی new رفته و یک پروژه از نوع win32 project با نام "rect1" و مقادیر پیش فرض بسازید (دقت کنید که console نباشد).
پروژه با چند فایل ساخته می شود، که ما با فایل rect1.cpp کار داریم.

2) برای رسم یک مربع ساده به این شکل عمل کنید:
در قسمت case و پیام WM_PAINT کار های گرافیکی در قسمت client یا همان قسمت سفید انجام می شود، دقت کنید که کد های گرافیکی باید مابین دو دستور BeginPaint و EndPaint نوشته شوند.

برای شروع مربعی بدون رنگ رسم می کنیم، کد را به شکل زیر تغییر دهید:
کد:

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...

Rectangle(hdc, 100, 100, 200, 200); // Empty

EndPaint(hWnd, &ps);
break;

3) حال در کنار آن مربعی با یکی از رنگ های پیش فرض سیستم رسم می کنیم:

کد:

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...

Rectangle(hdc, 100, 100, 200, 200); // Empty

SelectObject (hdc, GetStockObject (LTGRAY_BRUSH)) ;
Rectangle(hdc, 300, 100, 400, 200); // Filled by light gray color

EndPaint(hWnd, &ps);
break;

در کد فوق با استفاده از دستور SelectObject یکی از اشیاء را مانند قلم ، مداد ، عکس و غیره را برای رنگ آمیزی و ترسیم می توانید انتخاب کنید. در این مورد ما با استفاده از تابع GetStockObject یکی از قلم های پیش فرض سیستم را انتخاب کردیم که خاکستری روشن هست. (سایر انواع : BLACK_BRUSH، HOLLOW_BRUSH ، WHITE_BRUSH ، BLACK_PEN و ....)




4) برای ساختن یک brush یا قلم دلخواه (با رنگ دلخواه) به این شکل عمل می کنیم:

- ابتدا قلم را در پیام WM_CREATE می سازیم (این پیام را خودتان در بخش case ها اضافه کنید )، هر چیزی که در بخش WM_CREATE نوشته شود در هنگام شروع برنامه قبل از هر چیزی اجرا می شود .

- از تابع CreateSolidBrush و ماکرو RGB برای ساخت قلم و رنگ استفاده می کنیم.

- hbrush از نوع HBRUSH باید قبل از switch تعریف شود و حتما static باشد چون فقط یک مرتبه در شروع برنامه مقدار دهی می شود.

- وقتی خودمان قلمی درست می کنیم باید در انتهای برنامه فضای اختصاص داده شده به آن را آزاد کنیم پس در قسمت WM_DESTROY در هنگام بستن برنامه را فراخوانی DeleteObject می کنیم .

- SelectObject آخر برای این است که همراه پس از انجام رسم ، قلم قبلی که پیش فرض سیستم بود انتخاب و آماده برای سایر موارد رسم بعدی شود.

پس تابع به شکل زیر تغییر داده می شود:
کد:

m, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static HBRUSH hbrush, hbrushOld; // must be static

switch (message)
{
case WM_CREATE:
// Create a red brush
hbrush = CreateSolidBrush(RGB(255, 0, 0));

break;

case WM_COMMAND:
// **... I removed codes ... **
break;

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...

Rectangle(hdc, 100, 100, 200, 200); // Empty

SelectObject (hdc, GetStockObject (LTGRAY_BRUSH)) ;
Rectangle(hdc, 300, 100, 400, 200); // Filled by light gray color

// Select the new brush and draw
hbrushOld = (HBRUSH)SelectObject(hdc, hbrush);
Rectangle(hdc, 500, 100, 600, 200); // Filled by light gray color
SelectObject(hdc, hbrushOld); // select old brush

EndPaint(hWnd, &ps);
break;

case WM_DESTROY:
PostQuitMessage(0);
DeleteObject(hbrush);

break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
5) سایر توابعی که می توانید از آن ها برای رسم اشکال استفاده کنید:

Ellipse ، Polygon ، RoundRect ، Pie ، Chord ، Arc ، LineTo ، Polyline و ...

آبجی
14th April 2010, 12:14 AM
ابتدا تابعی با نام DrawBorder را برای ترسیم یک مستطیل تعریف می کنیم.

- دقت کنید که از آن جایی که در خارج از پیام WM_PAINT در حال رسم هستیم لذا ابتدا هندل DC یا همان display device context را برای انجام کارهای گرافیکی قسمت client area باید با استفاده از GetDC دریافت کنید و در پایان ترسیم نیز با ReleaseDC آزاد کنید.

- تابع SetROP2 با فلگ R2_NOT باعث می شود مستطیل ما با رنگی معکوس زنگ زمینه در هنگام drag کردن mouse نمایش داده شود.

کد:

void DrawBorder(HWND hwnd, POINT ptBeg, POINT ptEnd)
{
HDC hdc ;
hdc = GetDC (hwnd) ;

SetROP2 (hdc, R2_NOT) ;
SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;

ReleaseDC (hwnd, hdc) ;
}

تابع WndProc را همانند مثال قبل برای پیام ها به شکل زیر تغییر دهید:



کد:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
HDC hdc ;
PAINTSTRUCT ps ;
static BOOL drawing, drawBox ;
static POINT ptBeg, ptEnd, ptBoxBeg, ptBoxEnd ;

switch (message)
{
case WM_LBUTTONDOWN :
ptBeg.x = ptEnd.x = LOWORD (lParam) ;
ptBeg.y = ptEnd.y = HIWORD (lParam) ;

drawing = TRUE ;
return 0 ;

case WM_MOUSEMOVE :
if (drawing)
{
SetCursor (LoadCursor (NULL, IDC_CROSS)) ;
DrawBorder (hWnd, ptBeg, ptEnd) ; // clean previous drawing

ptEnd.x = LOWORD (lParam) ;
ptEnd.y = HIWORD (lParam) ;

DrawBorder (hWnd, ptBeg, ptEnd) ;
}
return 0 ;

case WM_LBUTTONUP :
if (drawing)
{
DrawBorder (hWnd, ptBeg, ptEnd) ;

ptBoxBeg = ptBeg ;
ptBoxEnd.x = LOWORD (lParam) ;
ptBoxEnd.y = HIWORD (lParam) ;

SetCursor (LoadCursor (NULL, IDC_ARROW)) ;

drawing = FALSE ;
drawBox = TRUE ;
InvalidateRect (hWnd, NULL, TRUE) ;
}
return 0 ;

case WM_PAINT :
hdc = BeginPaint (hWnd, &ps) ;

if (drawBox)
{
SelectObject (hdc, GetStockObject (LTGRAY_BRUSH)) ;
Rectangle (hdc, ptBoxBeg.x, ptBoxBeg.y, ptBoxEnd.x, ptBoxEnd.y) ;
}

if (drawing)
{
SetROP2 (hdc, R2_NOT) ;
SelectObject (hdc, GetStockObject (NULL_BRUSH)) ;
Rectangle (hdc, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y) ;
}

EndPaint (hWnd, &ps) ;
return 0 ;

case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_about:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
پیام های mouse مورد استفاده :
- پیام WM_LBUTTONDOWN وقتی فراخوانی می شود که کلیک چپ mouse زده می شود.

- پیام WM_MOUSEMOVE وقتی که mouse در حال حرکت می باشد.
لذا با یک متغیر bool تست می کنیم که حتما پیام LBUTTONDOWN مقدار true داشته باشد و سپس عملیات انجام شود.

- پیام WM_LBUTTONUP وقتی کلیک چپ mouse آزاد می شود
پس از پایان این پیام تابع InvalidateRect را فراخوانی می کنیم تا با رفرش کردن تصویر در قسمت WM_PAINT ترسیم نهایی مستطیل انجام شود (متغیر drawBox وقتی true می شود)

- با استفاده از lParam های در پیام های mouse مختصات x و y را دریافت می کنیم.

- تابع SetCursor نشان mosue را به یک شکل دیگر مانند + تغییر می دهد.

myoosef
3rd December 2013, 04:01 PM
سلام خسته نباشید من تازه به جمع این سایت اومدم یه س.ال دارم چطور و از کجا برنامه ای رو که تو این سایت برای اموزش c++ رو پیدا کنم

امـیـر بـیـگـی
3rd December 2013, 04:18 PM
سلام خسته نباشید من تازه به جمع این سایت اومدم یه س.ال دارم چطور و از کجا برنامه ای رو که تو این سایت برای اموزش c++ رو پیدا کنم

توی این تالار یه گشتی بزنید
http://www.njavan.com/forum/forumdisplay.php?142-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AA%D8%AD%D8%AA-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%B9%D8%A7%D9%85%D9%84

myoosef
3rd December 2013, 08:24 PM
دوباره سلام من نرم افزار ش رو میخوام

امـیـر بـیـگـی
3rd December 2013, 09:19 PM
دوباره سلام من نرم افزار ش رو میخوام

نرم افزار چی؟
برای سی پلاس پلاس باید ویژوال استودیو نصب کنید

maryam kia
3rd December 2013, 11:11 PM
نرم افزار چی؟
برای سی پلاس پلاس باید ویژوال استودیو نصب کنید

ویژوال استودیو خیلی سخته

امـیـر بـیـگـی
4th December 2013, 02:47 PM
ویژوال استودیو خیلی سخته

نه کی گفته؟
سی شارپشو بلد باشید بقیشو بلدید
vb.net
asp.net
c++
و...

استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است

استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد