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

graphic in c++

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
براي شروع يك برنامه ساده گرافيكي مي گذاريم.

کد:
#include<graphics.h>
#include<conio.h>

void main()
{
char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
int d=DETECT,m;
initgraph(&d,&m,"c:\\tc\\bgi");


circle(320,240,92);
line(10,10,300,300);
 // ----------- entehaye ghaaleb -----------
getch()  ;
 closegraph();
}
عملي شروع مي كنيم و اگر نياز احساس شد ، به سمت توضيحات تئوري مي رويم..
شرح: قسمت گرافيكي برنامه ما همان 4 خطي است كه بين دو خط موازي محدود شده و يك خط closegraph(); . باقيش ديگه ربطي به گرافيك نداره.
البته #include<graphics.h> هم كه در بالاي برنامه نوشته شده ، لازمه ، تا بتوانيم از توابع گرافيكي استفاده كنيم.

يك نكته اينكه خيلي از توابع گرافيكي در مود گرافيكي ، فقط ، عمل مي كنند. يعني از جايي كه initgraph را نوشتيم. و با نوشتن closegraph(); ، هم كه معلومه از محيط گرافيكي خارج مي شويم.
اما ، از اينكلود كردن هدر و باز كردن محيط گرافيكي كه بگذريم ، مي رسيم به دستور ((خط و دايره)) كه كارشان هم معلومه و اين است كه يك خط و دايره با مختصات داده شده مي كشند.
در مورد خط ، آن اعداد مختصات دو سر خط هستند و در مورد دايره مختصات مركز و شعاع.

توضيحات مختصات: گوشه بالا و سمت چپ ، ميشه ((صفر و صفر)) و گوشه پايين و سمت راست ميشه max x و max y . كه بسته به اينه كه از چه حالتي استفاده مي كنيدحالا به اين دو خط بيشتر نگاه مي كنيم.

کد:
int d=DETECT,m;
initgraph(&d,&m,"c:\\tc\\bgi");

يك int تعريف كرده ايم و آن را با detect مساوي قرار داديم. البته ميشد بجاي اين كنترل كننده اتوماتيك خودمان تعيين كننده بوديم ولي من هر چي سورس تا حالا ديدم ، از اين detect استفاده كرده.
راجه به آن m هم فعلا همين طوري استفاده كنيد تا بعدا شرح بدهيم. راجع به آن آدرس هم بايد تغيير بدهيد تا به پوشه bgi شما اشاره كنه. اگر هم برنامه گرافيكي خود را مي خواهيد ببريد روي كامپيوتر ديگري اجرا كنيد ، راه من اينه كه اين پوشه را كه 200 كيلو هست را هم با خود مي برم. و در كامپيوتر دوستتان هم بايد اين پوشه جايي باشه كه به اين آدرس بخورد يا اين كه آدرس را پوشه فعلي كنيد و فايلهاي bgi را در كنار فايل خود بريزيد. .
ديگه فكر كنم اين برنامه چيزي نداره كه توضيح بدهيم. البته داره ولي به موقع اش به طور علمي تر بحث مي كنيم. من خودم فعلا روي كار با حافظه مسلط نشده ام ، وقتي مسلط شدم حتما در جاي مناسب توضيح مي دهم.

.در محيط گرافيكي چون در حالت فول اسكرين فقط اجرا ميشه ، نميشه عكس گرفت.
ولي من يك راهي پيدا كردم. اول بايد برنامه را اجرا كنيم تا فايل exe ساخته بشه، بعد اين فايل exe را در دفعه بعد اجرا مي كنيم. (نه اجرا از داخل محيط توربوسي.)
بعد با دستور exit(1) وقتي بخواهيم خارج بشيم ، يك error ئي مي دهد كه باعث ميشه برنامه از حالت فول اسكرين خارج بشه. و اين طوري من توانستم عكس بگيرم از محيط برنامه. البته راه بي معنايي است ولي فعلا مشكل من را حل كرد.


d3.gif

 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
قبل از اينكه شما تنظيمي انجام دهيد ، رنگهاي زير را در اختيار داريد.
بعدا طرز اضافه كردن رنگهاي ديگر را مي گيم.
طرز استفاده از اين جعبه رنگ:
با دستور زير :

کد:
setcolor(9);

شما رنگ قلم خود را آبي كرده ايد و شكلها و متنهاي بعد آن به اين رنگ ترسيم مي شود.
ولي انگار شماره رنگهاي من فرق داره با اين. ولي رنگاش همينه. بعدا عكس بهتري پيدا مي كنيم.

c7.gif


عكس از آدرس زير:
http://www.brackeen.com/home/vga/basics.html
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
کد:
#include<graphics.h>
#include<conio.h>

void main()
{
char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
int d=DETECT,m;
initgraph(&d,&m,"c:\\tc\\bgi");

setcolor(9);
outtextxy(320,25,"welcome"); 

setcolor(4);
circle(320,240,92);
circle(420,240,92);

setfillstyle(SOLID_FILL, 14);
floodfill(320,240,4);

 // ----------- entehaye ghaaleb -----------
getch()  ;
 closegraph();
}

در برنامه بالا ، ابتدا رنگ به آبي تنظيم شده و welcome نوشته شده.
بعد رنگ به قرمز تنظيم شده و دو دايره كشيده شده.
بعد حالت پركردن به توپر تنظيم شده و به رنگ زرد. با تابع setfillstyle .
بعد با تابع floodfill مشغول رنگ آميزي شده ايم. رنگ 4 يعني همان قرمز، محدوده اي است كه رنگ آميزي پايان مي يابد. به قول سينتكس ، border است. در شكل زير نتيجه كار را مي بينيد .


d4.gif

 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
يعني مي خواي از محيط داس عكس بگيري ؟
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
بله. مي خواهم از محيط داس عكس بگيرم ولي نتوانستم.
من آمدم با تابع
getpixel
همه پيكسلها را در يك فايل تكست ذخيره كردم و بعد با يك برنامه ويندوزي مثل وي بي يا دلفي ميشه آنها را به تصوير كشيد و عكس گرفت.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
روش خوبيه
اما فكر كنم اين برنامه بدرت بخوره
فقط نبايد برنامه تحت داست فول اسكرين باشه
http://www.mytempdir.com/389647
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
امروز سورسي را پيدا كردم كه يك بيت مپ را بار كرده بود و در محيط گرافيكي به نمايش گذاشته بود . پس برعكسش هم ممكنه و همين مي تواند مشكل من را حل كند. سورسش هم بسيار كوچك بود.
يك چيز ديگه اينكه من مدتهاست ، شايد 6 ماه ، دنبال يك اسكرين شات كم حجم بودم و خيلي لينك شما بدردم خورد. چون من با اسناگيت 7 كار مي كنم كه سنگين و دير باز ميشه و كمي به سيستم هم فشار مياورد.
=====================
برنامه را الان اجرا كردم. خيلي زيبا و كارآمد و از همه مهم تر كم حجمه. به دوستاني كه به فعاليتشان مي خورد تاكيد مي كنم كه آن را دانلود كنيد. حدود 1 و نيم مگا هم حجم دانلودشه.
.
از
keygen.us
هم شايد بشه كد رجيسترش را پيدا كرد كه من هنوز نرفتم.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
عزيز فايل پچ هم داخلشه ميتوني اون رو توي فولدر نصب كپي كني و بعد بصورت ريجستر شده ازش استفاده كني
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
ممنون از راهنمايي.

.

کد:
getbkcolor returns the current background color
 ‏ setbkcolor sets the current background color using the palette

Declaration:
 ‏ int far getbkcolor(void);
 ‏ void far setbkcolor(int color);

بحث فعلي ، بحث رنگ بك گراند است.
دو تابعي كه در بالا(help توربو سي) معرفي شده اند ، يكي بك گراند را set مي كنه ، ديگري get مي كنه. ورودي و خروجي آنها هم مثل الاكلنگ است. يكي اين طرفش void است ، آن ديگري آن طرفش. و رنگ را هم در int مي ريزيم.

خوب ميشه يك برنامه نوشت كه مدام رنگ بك گراند را عوض كنه. ولي فقط براي چشم درد گرفتن خوبه اين برنامه. ديگه برنامه اي نمي سازم براش . فقط يك خط كد زير را در جاي مناسب قرار بدهيد.

کد:
setbkcolor(7);

ولي همين يك خط را رفتم امتحان كردم ، يك رنگ زمينه خاكستري ايجاد مي كنه.
اين هم يك الاكلنگ ديگه:
کد:
getcolor returns the current drawing color
 ‏ setcolor sets the current drawing color

Declaration:
 ‏ int far getcolor(void);
 ‏ void far setcolor(int color);

كه قبلا از set آن استفاده كرديم.

ولي پاييني زياد متقارن نيست:

کد:
‏ getpixel gets the color of a specified pixel
 ‏ putpixel plots a pixel at a specified point

Declaration:
 ‏ unsigned far getpixel(int x, int y);
 ‏ void far putpixel(int x, int y, int color);

كار اولي اينه كه يك نقطه(با مختصات x و y ) را نگاه مي كنه ببينه رنگش چه رنگي است.
دومي با رنگ خاصي ، يك پيكسل( يك نقطه) ايجاد مي كنه.

پاك كردن صفحه:

کد:
Clears the graphics screen

Declaration:  void far cleardevice(void);

با clrscr() نميشه در حالت گرافيكي صفحه را پاك كرد. من امتحان كردم . اوضاع مي ريزه به هم.
و مي بينيد كه اين تابع از نوع void – void است. يعني نه چيزي مي گيره ، نه چيزي برميگرداند. فقط كارش را انجام مي دهد.

کد:
Returns maximum x or y screen coordinate

Declaration:
 ‏ int far getmaxx(void);
 ‏ int far getmaxy(void);

For example, on a CGA in 320 x 200 mode, getmaxx returns 319 and getmaxy
returns 199.

اين دو تابع به شما مي گن كه x و y را تا كجا مي توانيد بزرگ بگيريد.
در mode هاي مختلف فرق داره. مثلا در حالت 200×320 اين دو تابع 319 و 199 را برمي گردانند.

کد:
#include<graphics.h>
#include<conio.h>
[color=red]#include<stdlib.h>[/color]

void main()
{
char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
int d=DETECT,m;
initgraph(&d,&m,"c:\\tc\\bgi");


int my_x;
int my_y;
char x_string[7];
char y_string[7];

my_x= getmaxx();
 my_y=  getmaxy();


	[color=red]itoa(my_x,x_string,10);[/color]
      [color=red]itoa(my_y,y_string,10);[/color]

      
outtextxy(320,25,”x=”,x_string); 
outtextxy(320,35,y_string); 
 // ----------- entehaye ghaaleb -----------
getch()  ;
 closegraph();
}

نتيجه اجراي برنامه بالا 639 , 479 بود در كامپيوتر من. رنگ قرمز را براي مشخص كردن header مربوطه استفاده كرديم.
بعدا تحقيق مي كنيم براي راههاي ديگر چاپ اعداد در محيط گرافيكي ، فعلا مجبوريم به نوع كاراكتري تبديل كنيم و بعد چاپ كنيم.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
کد:
‏ [color=blue]outtext[/color] displays a string in the viewport (graphics mode)
  ‏ [color=blue]outtextxy[/color]  displays a string at the specified location (graphics mode)

 Declaration:
  ‏ void far outtext(char far *textstring);
  ‏ void far outtextxy(int x, int y, char far *textstring);

 Remarks:
outtext and outtextxy display a text string, using the current justification
settings and the current font, direction, and size.
  ‏ outtext outputs textstring at the current position (CP)
  ‏ outtextxy displays textstring in the viewport at the position (x, y)

دو تابعي كه در بالا با رنگ آبي نشان داده شده را مقايسه مي كنيم.
اولي در مكان cp تكست ما را چاپ مي كند و
دومي در مختصات x و y ، كه بايد به تابع بدهيم.

براي درك اينكه cp چيه. به توابع زير نگاه كنيد.

کد:
  ـــــــــــــــــــــــ
 line, linerel, lineto         <GRAPHICS.H>
 ------------------------
  ‏ line draws a line between two specified points
  ‏ linerel draws a line a relative distance from the current position (CP)
  ‏ lineto draws a line from the current position (CP) to (x,y)

 Declaration:
  ‏ void far line(int x1, int y1, int x2, int y2);
  ‏ void far linerel(int dx, int dy);
  ‏ void far lineto(int x, int y);

 Remarks:
‏ line draws a line from (x1, y1) to (x2, y2) using the current color, line
style, and thickness. It does not update the [color=red]current position (CP)[/color].

‏ linerel draws a line from the CP to a point that is a relative distance
(dx, dy) from the CP, then advances the CP by (dx, dy).

‏ lineto draws a line from the CP to (x, y), then moves the CP to (x, y).

3 تابع بالا هر سه خط مي كشند.
در اولي بايد مختصات دو سر خط را بدهيم.
در دومي و سومي ، يك سر را مي دهيم ، سر ديگر ميشه cp .

تابع اولي cp را تغيير نمي دهد.
ديگه خوتان حدس مي زنيد كه هر يك براي چه كارهايي مناسب است.
.
البته دومي و سومي از يك لحاظ ديگه هم فرق دارند. فكر مي كنم يكي مختصات قطعي است و ديگري نسبي. من هنوز برنامه نساختم باهاشون ، وقتي كار كردم توضيحات تكميلي را اضافه مي كنم.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
کد:
#include<graphics.h>
#include<conio.h>
#include<iostream.h>
void main()
{
 // ----------------------------------------
int d=DETECT,m;
initgraph(&d,&m,"c:\\tc\\bgi");
 // -------------- faze 2 -------------------
   int x, y;
 x = getmaxx() / 2;
 y = getmaxy() / 2;
settextjustify(CENTER_TEXT, CENTER_TEXT);
 // ----------------------------------------
outtextxy(x, y, "Press a key to close the graphics system:");
 getch();
 closegraph();
 
 cout<<"We're now back in text mode."<<endl;
 cout<<"Press any key to halt:"<<endl;
   getch();
}

در برنامه بالا ما با دستور closegraph(); از حالت گرافيكي خارج شده ايم.
و در حالت غيرگرافيكي(معمولي) مي توانيم به كار خود ادامه دهيم.
چيزي كه براي من مهم بود اين بود كه آنچه در محيط گرافيكي رسم شده بود ، با بازگشت به محيط متني از روي صفحه پاك مي شود. يعني اين برنامه را براي اين نوشتم تا ببينيم آنچه در محيط گرافيكي رسم شده بعد دستور closegraph(); مي ماند يا نه. كه نماند . البته دستور ديگري داريم كه مي شود گفت موقتي تر از محيط گرافيكي خارج مي شود. در پستهاي بعدي آن را كار مي كنيم. از help توربو سي توضيحات مربوط به closegraph(); را با هم مرور مي كنيم.

کد:
ــــــــــــ
 closegraph             <GRAPHICS.H>
 ------------
 Shuts down the graphics system

 Declaration:  void far closegraph(void);

 Remarks:
closegraph deallocates all memory allocated by the graphics system.

It then restores the screen to the mode it was in before you called
initgraph.

(The graphics system deallocates memory, such as the drivers, fonts, and an
internal buffer, through a call to _graphfreemem.)

مي گويد كه بعد اجراي اين دستور، سيستم گرافيكي، شات داون مي شود و تابع هم از نوع void-void است. و با اين شات داون ، كل حافظه هاي تخصيص داده شده پس گرفته مي شود. البته منظور قسمت گرافيكي است نه هر حافظه اي. و گفته كه صفحه به حالتي درمياد كه قبل اجراي دستور initgraph بوده. من همين الان يك تست كردم. قبل ورود به محيط گرافيكي چيزي نوشتم بر صفحه ولي بعد رفت و برگشت از محيط گرافيكي آن نوشته نبود. البته خودتان هم امتحان كنيد بهتر است.

= == = == = == =
در كد برنامه ما در قسمتي كه با فاز 2 مشخص شده ، ابتدا آمده مركز صفحه را محاسبه كرده كه محل نوشتن متن در حالت گرافيكي را تعيين مي كند ولي بدون تابع settextjustify نوشته از مركز شروع مي شود ولي با استفاده از اين تابع كاري كرده كه ((نوشته مركزش در مركز قرار بگيرد))، كه شكيل تر است.

برنامه هم كلا ساده است. يك نوشته در حالت گرافيكي مي نويسد ، بعد ما يك دكمه مي زنيم و وارد حالت متني مي شود و آنجا هم چيزي مي نويسد.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
دستور زير باعث ميشه تا cp به x و y جديدي با مختصات 100 و 70 برود.

کد:
moveto(100,70);

دستور زير باعث ميشه تا x و y در cp به مقدار 5 تا اضافه بشه.
rel
احتمالا اول كلمه
relative
به معني نسبي است.
کد:
moverel(5, 5);

دستورات زير براي دريافت موقعيت x و y ئي cp است.


کد:
x_cp=getx();
y_cp=gety();

كه در بالا ما خروجي تابع را در x_cp و y_cp ريخته ايم و مي توانيم از آن استفاده كنيم.
.
البته x_cp و y_cp حروفش ساخته من است ، شما مي توانيد هر حرفي قرار دهيد . مثلا x و y . منظورم اينه كه از ((ثوابت سي)) نيست. ثابتهاي سي معمولا(و شايد هميشه) با حروف بزرگ نوشته مي شوند و فكر مي كنم ما هم اگر مقدار ثابتي ايجاد مي كنيم ، بهتره با حروف بزرگ بسازيم تا بعدا با يك نگاه بشه فهميد كه اون مقدار ثابت است.
.
بعضي توابع گرافيكي cp را تغيير مي دهند و بعضي توابع گرافيكي آن را تغيير نمي دهند. مثلا رسم يك دايره يا مستطيل تغييري در cp نمي دهد ولي با استفاده از cleardevice كه براي پاك كردن صفحه استفاده مي شود ، باعث ميشه تا x و y متعلق به cp بشه صفر.
ايده آل است كه بياييم ليست توابع تغيير دهنده cp و آنها كه تغيير نمي دهند را اينجا بنويسيم كه شايد اين كار بعدا انجام بشه.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
يك تاپيك باز كردم كه سورسهاي گرافيكي را آنجا بگذارم و اينجا فقط براي آموزش توابع گرافيكي باشه.
سورسهايي را كه اجرا مي شوند قرار خواهم داد. و همه با توربو سي چك مي شوند.

آدرس تاپيك:

http://forum.persiantools.com/showthread.php?p=535280&posted=1#post535280
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
منبع:
http://www.daniweb.com/code/snippet173.html
----------------------------------------------------------
رسم اشکال در یک پروژه کنسولی در ویژوال سی 6

ویژوال سی را باز کنید و یک پروژه کنسولی خالی بسازید . بعد یک فایل سی پلاس از منوی پروجکت (ادد تو پروجکت - و بعد نیو) به پروژه اضافه کنید.
بعد کد زیر را به فایل بیافزایید و برنامه را اجرا کنید.
کد:
// draw two lines and a circle on your console screen
// original BCX basic code by Sir Joe Caverly
// translated to C code and modified to work with Dev-C++
// link with GDI32.lib or with Dev-C++ link libgdi32.a via
// Project>>Project Options>>Parameters>>Add Lib>>libgdi32.a
// this is a Windows Console Application
 
 
#include <windows.h>    // Win32API Header File
#include <cstring>
#include <cstdio>
 
//using namespace std;
 
#define Red  RGB (255,0,0)
#define Lime RGB (206,255,0)
#define Blue RGB (0,0,255)
 
static HWND    hConWnd;
 
int     BCX_Line (HWND,int,int,int,int,int=0,HDC=0);
int     BCX_Circle (HWND,int,int,int,int=0,int=0,HDC=0);
 
HWND    GetConsoleWndHandle (void);
 
int main()
{
  hConWnd = GetConsoleWndHandle();
  if (hConWnd)
  {
    // be creative here, draw your own circles or lines
 
    //   hwin, centerX, centerY, radius, pencolor 
    BCX_Circle(hConWnd, 150, 130, 105, Blue);
    //   hwin, ulcX, ulcY, lrcX, lrcY, pencolor 
    BCX_Line(hConWnd, 5, 5, 300, 250, Red);
    BCX_Line(hConWnd, 295, 5, 5, 250, Lime);
    
    getchar();  // wait
  }
  return 0; 
}
 
 
int BCX_Line (HWND Wnd,int x1,int y1,int x2,int y2,int Pen,HDC DrawHDC)
{
  int a,b=0;
  HPEN hOPen;
  // penstyle, width, color
  HPEN hNPen = CreatePen(PS_SOLID, 2, Pen);
  if (!DrawHDC) DrawHDC = GetDC(Wnd), b = 1;
  hOPen = (HPEN)SelectObject(DrawHDC, hNPen);
  // starting point of line
  MoveToEx(DrawHDC, x1, y1, NULL);
  // ending point of line
  a = LineTo(DrawHDC, x2, y2);
  DeleteObject(SelectObject(DrawHDC, hOPen));
  if (b) ReleaseDC(Wnd, DrawHDC);
  return a;
}
 
 
// converts circle(centerX,centerY,radius,pen) to WinApi function
// ellipse inside box with upper left and lower right coordinates
int BCX_Circle(HWND Wnd,int X,int Y,int R,int Pen,int Fill,HDC DrawHDC)
{
  int a, b = 0;
  if (!DrawHDC) DrawHDC = GetDC(Wnd), b = 1;
  // penstyle, width, color
  HPEN   hNPen = CreatePen(PS_SOLID, 2, Pen);
  HPEN   hOPen = (HPEN)SelectObject(DrawHDC, hNPen);
  HBRUSH hOldBrush;
  HBRUSH hNewBrush;
  // if true will fill circle with pencolor
  if (Fill)
  {
    hNewBrush = CreateSolidBrush(Pen);
    hOldBrush = (HBRUSH)SelectObject(DrawHDC, hNewBrush);
  }
  else
  {
    hNewBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
    hOldBrush = (HBRUSH)SelectObject(DrawHDC, hNewBrush);
  }
  a = Ellipse(DrawHDC, X-R, Y+R, X+R, Y-R);
  DeleteObject(SelectObject(DrawHDC, hOPen));
  DeleteObject(SelectObject(DrawHDC, hOldBrush));
  if (b) ReleaseDC(Wnd, DrawHDC);
  return a;
}
 
 
// the hoop ...
HWND GetConsoleWndHandle(void)
{
  HWND hConWnd;
  OSVERSIONINFO os;
  char szTempTitle[64], szClassName[128], szOriginalTitle[1024];
 
  os.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
  GetVersionEx( &os );
  // may not work on WIN9x
  if ( os.dwPlatformId == VER_PLATFORM_WIN32s ) return 0;
 
  GetConsoleTitle( szOriginalTitle, sizeof( szOriginalTitle ) );
  sprintf( szTempTitle,"%u - %u", GetTickCount(), GetCurrentProcessId() );
  SetConsoleTitle( szTempTitle );
  Sleep( 40 );
  // handle for NT
  hConWnd = FindWindow( NULL, szTempTitle );
  SetConsoleTitle( szOriginalTitle );
 
  // may not work on WIN9x
  if ( os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
  {
    hConWnd = GetWindow( hConWnd, GW_CHILD );
    if ( hConWnd == NULL )  return 0;
    GetClassName( hConWnd, szClassName, sizeof ( szClassName ) );
    while ( strcmp( szClassName, "ttyGrab" ) != 0 )
    {
      hConWnd = GetNextWindow( hConWnd, GW_HWNDNEXT );
      if ( hConWnd == NULL )  return 0;
      GetClassName( hConWnd, szClassName, sizeof( szClassName ) );
    }
  }
  return hConWnd;
}

d2.gif

 

m3hrz4d

Registered User
تاریخ عضویت
21 سپتامبر 2005
نوشته‌ها
620
لایک‌ها
1
محل سکونت
اصفهان
کد جالبیه! GDI روی کنسول!
فقط برام عجیبه چرا واسه گرفتن هندل توی NT به جای استفاده از GetConsoleWindow از Title استفاده کرده !
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
سلام.خوبید؟
فکر کنم برای فرار از پیچیدگی باشه. البته من زیاد بلد نیستم ولی انگار گیر آوردن تایتل سر راست تر از هر چیز است.
 

shaghayegh.shaghayegh

کاربر تازه وارد
تاریخ عضویت
15 آگوست 2012
نوشته‌ها
2
لایک‌ها
0
سلام
من این کد اولی رو که میزنم ، از
#include <graphics.h>
ایراد میگیره. میگه همچین دایرکتوری ای وجود نداره. با devcpp هم کار میکنم. علتش چیه؟
 
بالا