در محیط گرافیک در زبانهای برنامه نویسی تحت DOS اشکال ساده مثل مستطیل و دایره را می توان با پاک کردن و کشیدن مجدد براحتی جابجا نمود اما حرکت اشکال پیچیده با این روش بسیار وقت گیر می باشد بطوریکه پاک کردن و کشیدن دوباره شکل کاملا به چشم می آید.
در چنین مواقعی می بایست شکل مورد نظر را که در داخل یک مستطیل فرضی قرار دارد , وارد یک حافظه کمکی نمود و محتویات این حافظه را در نقطه ای دلخواه در صفحه چاپ کرد .
در ابتدای کار یک متغیر از نوع int تعریف کنید که اندازه شکل محاسبه شود و در آن قرار گیرد.
یک متغیر نیز از نوع *void تعریف کنید که در واقع بافری است که رنگ پیکسل های مستطیل در آن به ترتیب قرار می گیرند تا در موقع لزوم به همان ترتیب چاپ شوند:
int size;
void* buffer;
حال می بایست اندازه مستطیل را با تابع imagesize محاسبه و در متغیر size بریزید:
size=imagesize(x1,y1,x2,y2);
که پارامتر های آن به ترتیب مختصات گوشه بالای سمت چپ مستطیل و گوشه پایین سمت راست آن می باشند.
حال حافظه ای را با تابع malloc به اندازه size به buffer اختصاص دهید:
buffer=malloc(size);
الگوی این تابع در سر فایل alloc.h قرار دارد.(الگوی سایر توابع گفته شده در graphics.h می باشد.)
حال نوبت به خواندن پیکسلهای مستطیل می باشد.
این کار را با تابع getimage انجام دهید که پیکسلها را خوانده و در بافر قرار می دهد:
getimage(x1,y1,x2,y2,buffer);
کار ما برای خواندن مستطیل به پایان رسیده است .
فقط کافیست بافر خوانده شده را با تابع putimage در نقطه دلخواه چاپ کنیم :
putimage(x,y,buffer,COPY_PUT);
دو پارامتر اول این تابع مختصات نقطه مقصد می باشند .(گوشه بالای سمت چپ مستطیل در مقصد) پارامتر دوم بافر محتوی شکل و پارامتر سوم تعیین کننده نوع چاپ شدن شکل می باشد که دارای حالات زیر است :
شنبه,28 آذر 1383 (تعداد دفعات خوانده شده:1497)منبع : http://www.pooyeshr.com در محیط گرافیک در زبانهای برنامه نویسی تحت DOS اشکال ساده مثل مستطیل و دایره را می توان با پاک کردن و کشیدن مجدد براحتی جابجا نمود اما حرکت اشکال پیچیده با این روش بسیار وقت گیر می باشد بطوریکه پاک کردن و کشیدن دوباره شکل کاملا به چشم می آید.
در ابتدای کار یک متغیر از نوع int تعریف کنید که اندازه شکل محاسبه شود و در آن قرار گیرد.
یک متغیر نیز از نوع *void تعریف کنید که در واقع بافری است که رنگ پیکسل های مستطیل در آن به ترتیب قرار می گیرند تا در موقع لزوم به همان ترتیب چاپ شوند: int size; void* buffer; حال می بایست اندازه مستطیل را با تابع imagesize محاسبه و در متغیر size بریزید: size=imagesize(x1,y1,x2,y2); که پارامتر های آن به ترتیب مختصات گوشه بالای سمت چپ مستطیل و گوشه پایین سمت راست آن می باشند.
حال حافظه ای را با تابع malloc به اندازه size به buffer اختصاص دهید: buffer=malloc(size); الگوی این تابع در سر فایل alloc.h قرار دارد.(الگوی سایر توابع گفته شده در graphics.h می باشد.) حال نوبت به خواندن پیکسلهای مستطیل می باشد.
این کار را با تابع getimage انجام دهید که پیکسلها را خوانده و در بافر قرار می دهد: getimage(x1,y1,x2,y2,buffer); کار ما برای خواندن مستطیل به پایان رسیده است .
فقط کافیست بافر خوانده شده را با تابع putimage در نقطه دلخواه چاپ کنیم : putimage(x,y,buffer,COPY_PUT); دو پارامتر اول این تابع مختصات نقطه مقصد می باشند .(گوشه بالای سمت چپ مستطیل در مقصد) پارامتر دوم بافر محتوی شکل و پارامتر سوم تعیین کننده نوع چاپ شدن شکل می باشد که دارای حالات زیر است : Constant Value Meaning ---------------------------------------------------------------------------------------------------------- COPY_PUT 0 Copies source bitmap onto screen XOR_PUT 1 Exclusive ORs source image with that already onscreen OR_PUT 2 Inclusive ORs image with that already onscreen AND_PUT 3 ANDs image with that already onscreen NOT_PUT 4 Copy the inverse of the source دقت کنید که در پایان برنامه حتما حافظه گرفته شده با دستور malloc را آزاد کنید: free(buffer); توجه کنید که شکل لزوما یک مستطیل نیست بلکه برای ذخیره سازی شکل در حافظه یک مستطیل فرضی دور شکل در نظر گرفته می شود .
برای مثال میتوانید کد زیر را کپی کرده و در محیط TC اجرا کنید : #include #include #include int main(){ int driver=DETECT,mode=0,size,column,row,horiz,vert; void* buffer; initgraph(&driver,&mode,"c:\\tc\\bgi"); setcolor(LIGHTBLUE); rectangle(2,2,200,40); setfillstyle(SOLID_FILL,BLUE); floodfill(100,20,LIGHTBLUE); settextstyle(SMALL_FONT,HORIZ_DIR,7); setcolor(WHITE); outtextxy(12,10,"www.PooyeshR.com"); rectangle(0,0,600,400); size=imagesize(1,1,201,41); buffer=malloc(size); getimage(1,1,201,41,buffer); column=1; row=1; horiz=1; vert=1; while(!bioskey(1)){ putimage(column,row,buffer,COPY_PUT); column+=vert; row+=horiz; if(column==399 || column==1) vert=-vert; if(row==359 || row==1) horiz=-horiz; } free(buffer); closegraph(); restorecrtmode(); return 0; }