مقدمه: اکنون بیش از 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 برای VCL http://www.functionx.com/bcb/index.htm -------------------------------------------------------------------------------------- روش 2) استفاده از توابع کنسولی مایکروسافت برای command prompt ویندوز ، لیست این توابع در لینک زیر موجود می باشد: لیست توابع کنسولی مایکروسافت در این روش شما باید معادل توابع graphics.h را که در محیط Turbo C و کامپایلر های سری قدیم بورلند وجود داشت را با توابع 32 بیتی کنسولی مایکروسافت پیاده سازی کنید، به عنوان مثال برای gotoxy و clrscr لینک زیر را مشاهده کنید: معادل توابعی مثل gotoxy و clrscr در ++VC توجه به این مورد ضروری می باشد که محیط command prompt ویندوز محیطی کاملا متفاوت از محیط 16 بیتی DOS می باشد و نباید انتظار داشته باشید که تمامی امکانات 16 بیتی قدیمی توسط این کامپایلرها به همان شکل در اختیار شما قرار گیرد، از جمله رسم اشیاء گرافیکی همانند قبل در این روش امکان پذیر نیست و جداول و اشکال ساده می بایست توسط خطوط و کارکترها پیاده سازی شوند، اما این قابلیت در اختیار شما قرار می گیرد که بتوانید از اکثر توابع پیشرفته سیستم عامل در محیط کنسول استفاده کنید. لینک زیر شامل مثال ها و آموزش های کامل در زمینه استفاده از همین توابع کنسولی win32 می باشد، پس قبل از هر کاری ابتدا نگاهی به نمونه های پیاده سازی شده در این سایت بیاندازید: http://www.adrianxw.dk/SoftwareSite/index.html -------------------------------------------------------------------------------- روش 3) روش ساده تر از مورد قبل، استفاده از کتابخانه های 32 بیتی آماده غیر استاندارد و معادل graphic.h می باشد که برخی از آن ها open source (کد باز) نیز می باشد، مانند WinBGI که می توانید فایل های آن را از صفحه زیر دانلود کرده و استفاده کنید: فایل های مربوط به WinBGI به همراه یک نمونه مثال توجه کنید که این کتابخانه از توابع گرافیکی win32 استفاده می کند و برای نمایش آن ها پنجره سیاه دیگری همانند کنسول باز می شود که قادر هستید در آن اشکال گرافیکی را همانند برنامه های ویندوز به سادگی برنامه های گرافیکی Turbo C رسم کنید. --------------------------------------------------------------------------------- روش 4) آخرین و بدترین روش برگشتن به محیط قدیمی ++Turbo C و استفاده از همان توابع گرافیکی graphics.h می باشد که در برخی کتاب ها از جمله کتاب C جعفرنژاد قومی به آن پرداخته شده است. (البته امیدوارم به عنوان یک دانشجو و یا حتی کسی که می خواهد در حد پروژه های ساده با این زبان آشنا شود این گزینه را انتخاب نکنید) --------------------------------------------------------------------------------
رسم چند شکل جالب در محیط گرافیکی با همین چند خط کد کوتاه اشکال زیبایی در محیط گرافیکی ایجاد می شود , تنها با تغییر برخی اندازه ها اشکال جدیدی خلق می شود . برای این دو برنامه کوتاه فکر نکنم نیازی به هیج توضیحی باشد چون در هر کتاب آموزش C/C++ درباره برنامه نویسی در محیط گرافیکی مطلب گفته شده (تنها نکته لازم به ذکر این است که مسیرگرافیکی کتابخانه مبدل گرافیکی c++ درست داده شود مثلاً مسیر گرافیکی C++ من "C:\\tc\\bgi" می باشد , حواستان باشد که باید از \\ استفاده کنید نه از \ . ) Program 1 : /* ######################################## # WWW : cpp.blogfa.com # # Released on July 2005 # ######################################## */ //Essential Library #include <graphics.h> #include <conio.h> #include <math.h> #include <stdlib.h> int main(void) { int gdriver = DETECT; int gmode,errorcode,a,b,s; float k,x,y,i,j; float pi = 3.14159; initgraph(&gdriver,&gmode,"c:\\tc\\bgi"); errorcode = graphresult(); if ( errorcode != grOk) { exit(1); } s = 0; setcolor(12); do { i = 38+100*cos(pi*s/190); j = 175+100*sin(pi*s/190); x = (int)i; y = (int)j; circle(x+s,y,(int)y/6); s=s+3; } while (s<550); getch(); closegraph();// Return into text mode return 0; }//End of program Program 2 : /* ######################################## # WWW : cpp.blogfa.com # # Released on July 2005 # ######################################## */ //Essential Library #include <graphics.h> #include <conio.h> #include <math.h> #include <stdlib.h> int main(void) { int gdriver = DETECT; int gmode,errorcode,i; initgraph( &gdriver, &gmode,"c:\\tc\\bgi"); errorcode = graphresult(); if (errorcode != grOk) { exit(1); } setcolor(10); i=0; do{ i=i+1+(int)i/10; line(120+i,i,520-i,i); line(120+i,400-i,520-i,400-i); line(520-i,400-i,520-i,i); line(120+i,i,120+i,400-i); } while (i<200); getch(); closegraph(); //Return into text mode return 0;//End of Programm }
طراحی منوی گرافیکی این برنامه یک نوع منو را در محیط گرافیک C++ ارائه می کند که توسط آقای Vivek Patel نوشته شده . کد این برنامه بسیار روان است و در اغلب موارد همراه با توضیح می باشد : /*######################################## # Programmer : Vivek Patel # # Release at Site : cpp.blogfa.com # # mail : yakamoz.moony@yahoo.com # ########################################*/ #include <iostream.h> #include <conio.h> #include <dos.h> #include <graphics.h> //Menu Global Item #define pixTOrc(x) (8*(x-1)) //convert pixel into row and col format #define INC 5 //Increment Distance Between Menu Items #define ROW 15 //Row Value for Menu Item #define COL 8 //Column Value for Menu Item #define MAXITEM 5 //Total menu items // To display the Inventory Main menu options typedef char option[15]; option mainMenu[]= { "NEW", "OPEN", "SAVE", "ABOUT ME", "CLOSE" }; // Function to displays all the menu prompt messages from the pointer array of option a[] void normalvideo(int x,int y,char *str) { x=pixTOrc(x); y=pixTOrc(y); outtextxy(x,y,str); } // Function to move the cursor on the menu prompt with a reverse video color void reversevideo(int x,int y,char *str) { x=pixTOrc(x); y=pixTOrc(y); setcolor(YELLOW); //Selected Item sound(400); delay(100); nosound(); outtextxy(x,y,str); setcolor(WHITE); //Unselected Item sound(500); delay(100); nosound(); } //Keep Track of which arrow key is pressed char menu() { settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); setcolor(WHITE); //Initial Menu Item Color int i,done; for(i = 1; i < MAXITEM; i++) normalvideo(COL, (i*INC)+ROW, mainMenu); reversevideo(COL,ROW, mainMenu[0]); i = done = 0; do { /**Status Bar Logic**/ //Message will be displayed as status bar guide-line setfillstyle(SOLID_FILL,BLUE); settextstyle(SMALL_FONT,HORIZ_DIR,5); bar(pixTOrc(2),pixTOrc(52.5),pixTOrc(75),pixTOrc(5 5)); setcolor(LIGHTCYAN); switch(i){ case 0 : outtextxy(pixTOrc(5),pixTOrc(52.75),"New --> Create New file"); break; case 1 : outtextxy(pixTOrc(5),pixTOrc(52.75),"Open --> Open Existing file"); break; case 2 : outtextxy(pixTOrc(5),pixTOrc(52.75),"Save --> Save file"); break; case 3 : outtextxy(pixTOrc(5),pixTOrc(52.75),"About Me --> Programmer : Vivek Patel"); break; case 4 : outtextxy(pixTOrc(5),pixTOrc(52.75),"Close the Program --> BYE C U"); break; } /**status Bar ends**/ //Restore Orignal Color and Font Setting setcolor(WHITE); settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); ssss int key = getch(); switch (key) { case 00: key = getch(); switch (key) { case 72: normalvideo(COL, (i*INC)+ROW, mainMenu); i--; if (i == -1) i = MAXITEM-1; reversevideo(COL,(i*INC)+ROW,mainMenu); break; case 80: normalvideo(COL, (i*INC)+ROW, mainMenu); i++; if (i == MAXITEM) i = 0; reversevideo(COL, (i*INC)+ROW, mainMenu); break; } break; case 13: done = 1; } } while (!done); return(i+49); } //Advertise Screen will displayed to utilize empty screen area //It can be utilize for some effective...work void advertise(){ setcolor(BLUE); outtextxy(pixTOrc(30),pixTOrc(20),"URL : cpp.blogfa.com"); outtextxy(pixTOrc(30),pixTOrc(26),"Mail : cpp.myblog@gmail.com"); setcolor(YELLOW); } /* The function is used to display the main menu*/ //Actual code for all the menu utility resides in this //Function... void control_menu() { char choice; do { choice = menu(); switch (choice) { case '1': //New setcolor(BLUE); outtextxy(pixTOrc(40),pixTOrc(15),"New"); advertise(); getch(); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(pixTOrc(28),pixTOrc(14),pixTOrc(75),pixTOrc(50 )); advertise(); break; case '2': //Open setcolor(BLUE); outtextxy(pixTOrc(40),pixTOrc(15),"Open"); advertise(); getch(); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(pixTOrc(28),pixTOrc(14),pixTOrc(75),pixTOrc(50 )); advertise(); break; case '3': //Save setcolor(BLUE); outtextxy(pixTOrc(40),pixTOrc(15),"Save"); advertise(); getch(); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(pixTOrc(28),pixTOrc(14),pixTOrc(75),pixTOrc(50 )); advertise(); break; case '4': //Modify the status of item in inventory setcolor(BLUE); outtextxy(pixTOrc(40),pixTOrc(15),"About Me"); advertise(); getch(); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(pixTOrc(28),pixTOrc(14),pixTOrc(75),pixTOrc(50 )); advertise(); break; case '5': //Close the program setcolor(BLUE); outtextxy(pixTOrc(40),pixTOrc(15),"CLOSE"); advertise(); delay(1000); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(pixTOrc(28),pixTOrc(14),pixTOrc(75),pixTOrc(50 )); advertise(); goto out; } } while (choice != MAXITEM); out: } void main() { int i,j; int gd=DETECT,gm=0; initgraph(&gd,&gm,"c:\\tc\\bgi\\"); ///code as space holder\\\\\ setfillstyle(SOLID_FILL,LIGHTGRAY); bar(0,0,640,480); setcolor(DARKGRAY); rectangle(0,0,639,480); rectangle(1,1,638,479); setcolor(BLACK); rectangle(2,1,637,478); rectangle(3,1,636,477); settextstyle(TRIPLEX_FONT,HORIZ_DIR,4); setcolor(BLUE); outtextxy(pixTOrc(8),pixTOrc(2)," MENU -->> (Simple Style) "); setfillstyle(HATCH_FILL,DARKGRAY); for(i=15,j=70;i<40||j>40;i++,j--){ bar(pixTOrc(8),pixTOrc(7),pixTOrc(i),pixTOrc(7.5)) ; delay(10); bar(pixTOrc(j),pixTOrc(7),pixTOrc(70),pixTOrc(7.5) ); delay(20); } bar(pixTOrc(7),pixTOrc(14),pixTOrc(25),pixTOrc(50) ); ///code as space holder\\\\\ //Calling Menu control_menu(); closegraph(); }