در محيط گرافيك در زبانهاي برنامه نويسي تحت 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;
}