¸®´ª½º ±âŸ ÀÚ·á |
---|
Á¦¸ñ | X-Windows Programming #7 1998/07/04 (16:31) |
À̸§ | ±èÈ¿¿ø |
¹øÈ£ | 47 |
Á¶È¸ | 359 |
º»¹® |
¡º¸®´ª½º Çдç-¸®´ª½º °Á / ¿¬Àç (go LINUX)¡» 237¹ø Á¦ ¸ñ:[°Á 07] X ÇÁ·Î±×·¡¹Ö ±âÃÊ : ±×·¡ÇÈ ¿Ã¸°ÀÌ:geoman (À̸¸¿ë ) 96/05/02 23:12 ÀÐÀ½:2210 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- /* ±×·¡ÇÈÀÇ ¿¬½À */ Xlib ±×·¡ÇÈÀº X ÇÁ·Î±×·¡¹ÖÀÇ ±âÃÊ°¡ µÇ¾îÁÖ´Â ¾ÆÁÖ ±âº»ÀûÀÎ ±â´ÉÀÔ´Ï´Ù. X À©µµ ¿ì´Â ¿ÂÅë ±×·¡ÇÈÀ¸·Î °¡µæ Â÷ ÀÖ´Ù°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù. Á¡ ÇϳªºÎÅÍ ¸ðµç º¹ÀâÇÑ µµÇüÀº °á±¹ Xlib ÀÇ ÇÔ¼ö¸¦ ÅëÇؼ °¡´ÉÇÑ °ÍÀÔ´Ï´Ù. Á¦ °èȹÀ¸·Î´Â ¾öû³ ¼Óµµ·Î (!) Xlib ÇÁ·Î±×·¡¹ÖÀ» ¸¶Ä¡°í ¾î¼ »¡¸® ¿©·¯ºÐÀÌ Àç¹ÌÀÖ¾î ÇÒ Xt ÇÁ·Î±×·¡¹ÖÀ¸·Î ³Ñ¾î°¡°í ½ÍÀºµ¥¿ä, ¹Ù·Î ±× °÷¿¡¼ À§Á¬À» »õ·Î ¸¸µç´Ùµç°¡ ÇÒ ¶§ ¾ÆÁÖ À¯¿ëÇÏ°Ô ¾²ÀÔ´Ï´Ù. Àú¸¦ µû¶ó ¿À½Ã¸é ¿©·¯ºÐ¸¸ÀÇ ¸ÚÁø À§Á¬À» ¸¸µé ¼ö ÀÖµµ·Ï ¾È³»Çص帮°Ú ½À´Ï´Ù. ¶Ç ¸ð¸£ÁÒ. ¿©·¯ºÐ Áß¿¡¼ Á¤¸»·Î »ó»ó·ÂÀÌ ¶Ù¾î³ª°í ¸ÚÁø À§Á¬ÀÌ ³ª¿À¸é FWF(Free Widget Foundation)ÀÇ À§Á¬¼Â¿¡ Æ÷ÇԵǾî Àü¼¼°èÀÇ ÇÁ·Î±×·¡¸Óµé¿¡°Ô ¾Ë·Á Áú ¼öµµ ÀÖ½À´Ï´Ù. ¼Ò½º°¡ °ø°³µÇ¾î ÀÖÁö ¾Ê´Â ´Ù¸¥ ½Ã½ºÅÛ¿¡¼´Â ºÒ°¡´ÉÇÑ ÀÏ ¾Æ´Ï °Ú½À´Ï±î? ´Ù½Ã ÇÑ ¹ø È®ÀÎÇÕ´Ï´Ù! Xlib ±×·¡ÇÈÀº Ç×»ó GC ¶ó°í ÇÏ´Â ¸®¼Ò½º¸¦ °¡Áö°í ÇÕ´Ï´Ù. ±× GC´Â ±×·¡ÇÈ¿¡ °üÇÑ ¿©·¯ Á¤º¸¸¦ Áö´Ï°í ÀÖ´Â ³à¼®Àä, ´ç¿¬È÷ ¼¹ö Ãø¿¡´Ù GC »ý¼ºÀ» ÀÇ·ÚÇÏ°í ¿ì¸®´Â ±× GCÀÇ ID¸¸À» ¹Þ¾Æ¿É´Ï´Ù. ÀÌ°ÍÀº X À©µµ¿ìÀÇ ³×Æ®¿ö Å© ÁöÇâÀû Ư¼º¿¡¼ ³ª¿À´Â °ÍÀ¸·Î¼, ³×Æ®¿öÅ©¸¦ ÅëÇؼ ÃÖ¼ÒÀÇ Á¤º¸¸¦ ÀüÇÏ¸é¼ µµ ¿øÇÏ´Â ±â´ÉÀ» ¾ò°íÀÚ Çϱ⠶§¹®ÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ¸Å¹ø red ¶ó´Â »ö»óÀ¸·Î ¼±À» ±×À¸¶ó´Â 100¹øÀÇ ¸í·ÉÀÌ ÀÖ´Ù¸é, red·Î ±×¸®¶ó°í´Â ¸í·ÉÀÌ °è¼Ó ³×Æ®¿öÅ©¸¦ Ÿ°í ¼¹ö·Î ÀüÇØÁ®¾ß ÇÒ °ÍÀÔ´Ï´Ù. ¿©·¯ °¡Áö ÁÖ¹®»çÇ×À» ¹Ì¸® µî·ÏÇسõ°í °£´ÜÈ÷ ±× ID¸¸À» Àü¼ÛÇÏ´Â ¹æ½ÄÀÌ ÈξÀ ³×Æ®¿öÅ©ÀÇ ·Îµå¸¦ ÁÙÀÌ´Â ¹æ¹ýÀÌ µÇ°ÚÁÒ? ¹°·Ð Á׾ ´Â °ÍÀº Ç×»ó ¼¹öÀÔ´Ï´Ù. :) <!-- ÀÌÁ¦ºÎÅÍ ±×·¡ÇÈÀ» ¿¬½ÀÇغ¾½Ã´Ù > ¿¹Á¦ 7) /* ------------------------------- CUT HERE ------------------------------- */ #include <X11/Xlib.h> /* »ö»ó À̸§¿¡ ÇØ´çÇÏ´Â Çȼ¿°ª ¹ÝȯÇÏ´Â ÇÔ¼ö */ unsigned long UsrColorPixel( Display*, char* ); /* ¿äûÀ» Ç÷¯½¬ÇÏ°í ÁöÁ¤µÈ Ãʸ¸Å Áö¿¬½ÃÅ°´Â ÇÔ¼ö */ void Pause( Display*, int ); static XPoint points[] = {{ 200, 50 },{ 100, 150 },{ 300, 150 },{ 200, 50 }}; static XSegment segs[] = {{ 10, 10, 390, 190 },{ 10, 190, 390, 10 }}; static char dash_list[] = { 20, 5, 10, 5 }; int main() { Display *d; Window w; /* One TopLevel Window & Two Child Windows */ GC gc; XGCValues gv; /* ¼¹ö¿Í Á¢¼ÓÇϱ⠱׸®°í º¯¼öµéÀ» ÃʱâÈ */ d = XOpenDisplay ( NULL ); /* ÀÚ, ½ÃÀÛÇغ¼±î¿ä? */ w = XCreateSimpleWindow ( d, DefaultRootWindow( d ), 100, 100, 400, 200, 1, BlackPixel(d,0), WhitePixel(d,0) ); XMapWindow( d, w ); Pause( d, 2 ); /* * [1] Á¡(Point)À» Âï¾îº¾´Ï´Ù. XDrawPoint(s) ÇÔ¼ö »ç¿ë */ gv.foreground = UsrColorPixel( d, "red" ); gc = XCreateGC( d, w, GCForeground, &gv ); XDrawPoint ( d, w, gc, 200, 100 ); Pause( d, 3 ); gv.foreground = UsrColorPixel( d, "blue" ); XChangeGC ( d, gc, GCForeground, &gv ); XDrawPoints ( d, w, gc, points, 3, CoordModeOrigin ); Pause( d, 3 ); /* * °íÇػ󵵿¡¼´Â ¹¹ °ÅÀÇ ¾Èº¸ÀÏ Á¤µµ·Î RED»öÀÇ ÀÛÀº Á¡ Çϳª, * ±×¸®°í ³ª¼ BLUE»öÀÇ Á¡ 3°³¸¦ Âï°í ÀÖ½À´Ï´Ù. Á¤¸»·Î ÁýÁßÇؼ * º¸¼Å¾ß ÇÒ °Ì´Ï´Ù. ¸ð´ÏÅÍ°¡ ´õ·¯¿ì¸é ¸ÕÁö¿Í ±¸º°ÀÌ ¾ÈµÉÁöµµ... :) */ XClearWindow( d, w ); { int i, j; for ( j = 0; j < 200 ; j++ ) for ( i = 0; i < 400 ; i++ ) { XDrawPoint( d, w, gc, i, j ); XFlush ( d ); } } Pause( d, 3 ); /* * BLUE Á¡À¸·Î â Çϳª °¡µæÈ÷ Ä¥Çغ¾´Ï´Ù. XFlush ÇÔ¼ö¸¦ °íÀÇ·Î ½á¼ * ±× °úÁ¤À» ¾Ë¾Æº¼ ¼ö ÀÖµµ·Ï ÇÏ¿´½À´Ï´Ù. »ý°¢º¸´Ù ºü¸£°Ô ÂïÈú °Ì´Ï´Ù. * ¸®´ª½º´Â ¿ÏÀüÇÑ ÀǹÌÀÇ 32ºñÆ® OS À̴ϱî¿ä. */ /* * [2] ¼±(Line)À» ±×·Áº¾´Ï´Ù. */ XSetWindowBackground ( d, w, UsrColorPixel( d, "blue" ) ); gv.foreground = WhitePixel( d, 0 ); gv.background = UsrColorPixel( d, "red" ); gv.line_width = 20; XChangeGC( d, gc, GCForeground|GCBackground|GCLineWidth, &gv ); XDrawLine ( d, w, gc, 20, 20, 380, 180 ); /* CapButt */ Pause ( d, 3 ); gv.cap_style = CapRound; XChangeGC( d, gc, GCCapStyle, &gv ); XClearWindow( d, w ); XDrawLine ( d, w, gc, 380, 20, 20, 180 ); Pause ( d, 3 ); gv.cap_style = CapProjecting; XChangeGC( d, gc, GCCapStyle, &gv ); XClearWindow( d, w ); XDrawLine ( d, w, gc, 20, 20, 380, 180 ); Pause ( d, 3 ); /* * ¿©±â±îÁö´Â XDrawLine ÇÔ¼ö¸¦ »ç¿ëÇÏ¿´½À´Ï´Ù. ĸ ½ºÅ¸ÀÏ(Cap)ÀÌ ¼·Î * ¾î¶»°Ô ´Ù¸¥Áö È®ÀÎÇØ º¸½Ê½Ã¿ä. */ XSetLineAttributes ( d, gc, 10, LineDoubleDash, CapRound, JoinRound ); XSetDashes( d, gc, 0, dash_list, 4 ); XClearWindow( d, w ); XDrawSegments ( d, w, gc, segs, 2 ); Pause ( d, 3 ); XClearWindow ( d, w ); XSetLineAttributes ( d, gc, 15, LineOnOffDash, CapButt, JoinBevel ); XDrawLines( d, w, gc, points, 4, CoordModeOrigin ); Pause ( d, 3 ); /* * ¼±³¡Á¡ ½ºÅ¸ÀÏ¿¡´Â CapButt, CapRound, CapProjecting 3 °¡Áö°¡ ÀÖ½À´Ï´Ù. * ¼±°ú ¼±ÀÌ ¸¸³ª´Â ¹æ½Ä¿¡µµ ¼¼ °¡Áö°¡ ÀÖ½À´Ï´Ù. JoinMiter, JoinRound, * ±×¸®°í JoinBevel ÀÌ ±×°ÍÀÌÁÒ. * Áß¿äÇÑ °Í! ¼±ÀÇ ½ºÅ¸ÀÏ¿¡´Â ±×³É LineSolid, LineOnOffDash, LineDouble- * Dash °¡ ÀÖ½À´Ï´Ù. * XSetLineAttributes(), XSetDashes()´Â ¿¬±¸°úÁ¦ÀÔ´Ï´Ù. */ /* * [3] ÀÌÁ¦ 2Â÷¿øÀ¸·Î °¡º¾½Ã´Ù. »ç°¢ÇüºÎÅÍ ½ÃÀÛ! */ XClearWindow( d, w ); XSetLineAttributes ( d, gc, 5, LineSolid, CapButt, JoinRound ); XDrawRectangle( d, w, gc, 50 /* X */, 50 /* Y */, 300 /* width */, 100 /* height */ ); Pause( d, 3 ); { XRectangle rect[7]; int i; for ( i = 0; i < 7 ; i ++ ) { rect[i].x = 10 + i * 50; rect[i].y = 20; rect[i].width = 40 ; rect[i].height = 150; } XClearWindow( d, w ); XSetLineAttributes(d,gc,1,LineDoubleDash,CapProjecting,JoinMiter); XDrawRectangles ( d, w, gc, rect, 7 ); Pause ( d, 3 ); } /* * ÀÚ, XDrawRectangle(s)ÀÇ »ç¿ë¹ýÀ» ¾Æ¼Ì³ª¿ä? ±×·¸´Ù¸é ¿¬±¸°úÁ¦°¡ ÀÖ½º * ´Ï´Ù. ÀÌµé ´ë½Å¿¡ XFillRectangle(s)¸¦ ½áº¸½Ê½Ã¿ä. ¾î¶² ÀÏÀÌ ÀϾ * ´Ï±î? */ /* * [4] µÕ±×·± °Íµµ ±×·Áº¾½Ã´Ù. */ { int i, radi; XArc arc[2]; XClearWindow ( d, w ); XSetLineAttributes(d,gc,10,LineSolid,CapRound,JoinRound); for ( radi = 0 ; radi <= 360 ; radi += 90 ) { XDrawArc ( d, w, gc, 10, 10, 380, 180, 0 * 64, radi * 64 ); Pause( d, 1 ); } for ( i = 0 ; i < 2 ; i ++ ) { arc[i].x = 30 + 200 * i; arc[i].y = 30; arc[i].width = arc[i].height = 100; arc[i].angle1 = 0 * 64; arc[i].angle2 = 90 * ( i + 1 ) * 64; } XClearWindow ( d, w ); XDrawArcs( d, w, gc, arc, 2 ); Pause( d, 1 ); XSetForeground( d, gc, UsrColorPixel(d,"yellow") ); for ( i = 0 ; i < 2 ; i ++ ) { XClearWindow ( d, w ); XSetArcMode ( d, gc, i == 0 ? ArcPieSlice : ArcChord ); for ( radi = 0 ; radi <= 360 ; radi += 90 ) { XFillArc ( d, w, gc, 10, 10, 380, 180, 0 * 64, radi * 64 ); Pause( d, 1 ); } XClearWindow( d, w ); XFillArcs( d, w, gc, arc, 2 ); Pause( d, 1 ); } } /* GC, â Æı« & ¼¹ö¿ÍÀÇ Á¢¼Ó ÇØÁ¦ */ XFreeGC( d, gc ); XUnmapWindow( d, w ); XDestroyWindow( d, w ); XCloseDisplay( d ); return 0; } /* UsrColorPixel() : ÁÖ¾îÁø À̸§ÀÇ »ö»ó¿¡ ´ëÇÑ ±âº» Ä÷¯¸ÊÀÇ Çȼ¿°ª ¹Ýȯ */ unsigned long UsrColorPixel( display, name ) Display *display; char *name; { Colormap cmap; XColor c0, c1; cmap = DefaultColormap( display, 0 ); XAllocNamedColor( display, cmap, name, &c0, &c1 ); return ( c0.pixel ); } void Pause( Display *d, int secs ) { XFlush ( d ); sleep( secs ); } /* --------------------------------- CUT HERE ------------------------------ */ ÄÄÆÄÀÏÀº -lX11 ¿É¼ÇÀ» Áּż Xlib ¿Í ¸µÅ©½ÃÄÑ ÁÖ½Ã¸é µË´Ï´Ù. ÃÖ´ëÇÑ Xlib ±×·¡ÇÈ ÇÔ¼öµéÀÇ ±â´ÉÀ» º¸ÀÌ·Á°í ³ë·ÂÇß½À´Ï´Ù. ÇÏÁö¸¸ À§¿¡¼ º¸¿© µå¸° °Í¸¸À¸·Î´Â ¸¹ÀÌ ºÎÁ·ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ÀÚÀ¯·Î¿î ´Ù°¢ÇüÀ» ±×¸®¸é¼ »ö»óÀ» Ä¥ÇÒ ¼ö ÀÖ´Â XFillPolygon()°ú °°ÀÌ À¯¿ëÇÑ ÇÔ¼ö´Â ¼³¸íµå¸®Áö ¾Ê¾Ò½À´Ï´Ù. ÀÚ¼¼ÇÑ °ÍÀº ¿©·¯ºÐÀÇ Å½±¸¿¡ ´Þ·Á ÀÖ½À´Ï´Ù. ´ÙÀ½ ¹ø¿¡´Â ÆùÆ® Ãâ·ÂÇÏ´Â ¹ý¿¡ ´ëÇؼ ¾Ë¾Æº¸±â·Î ÇսôÙ. ¿µ¹®ÀÚ Ãâ·Â°ú ´ç¿¬È÷ ÇÑ±Û Ãâ·Â¿¡ °üÇÑ ¾ê±â¸¦ Çغ¸µµ·Ï ÇÏÁÒ. ÆùÆ® °ÀǸ¦ ¸¶Ä¡¸é ÀÌÁ¦ X À©µµ¿ì´Ù¿î ÇÁ·Î±×·¥À» © ¼ö ÀÖ´Â "À̺¥Æ®"¸¦ ´Ù·ê ¼ö ÀÖ°Ô µÇ°Ú±º¿ä. Xlib µµ ¾ó¸¶ ³²Áö ¾Ê¾Ò ½À´Ï´Ù. Èû³»¼¼¿ä. :) ¹®ÀÇ»çÇ×Àº ³ª¿ìÄÄ ¾ÆÀ̵ð geoman À̳ª geoman@nownuri.nowcom.co.kr·Î º¸³»Áֽñ⠹ٶø´Ï ´Ù. <!-- Ȱ¿¡ »ç´Â ¸¸¿ëÀÌ --> |