منبع : 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; }
|