در محیط گرافیك در زبانهای برنامه نویسی
تحت 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:tcbgi") 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 }
|