²©¿ÍÊ×Ò³ ×¢²á ½¨ÒéÓë½»Á÷ ÅÅÐаñ ¼ÓÈëÓÑÇéÁ´½Ó
ÍÆ¼ö ͶËß ËÑË÷£º °ïÖú

hardworkor

hardworkor.cublog.cn
windows³ÌÐòÉè¼ÆµÚÎåÕÂ×ªÔØ
windows³ÌÐòÉè¼Æ±Ê¼ÇµÚÎåÕÂ×ªÔØ

¡¤<windows³ÌÐòÉè¼Æ>µÚÎåÕ±ʼǠ    -|cser ·¢±íÓÚ 2005-6-15 13:19:00

ͼÐλù´¡

ͼÐλù´¡
ͼÐÎÉ豸½Ó¿Ú£¨GDI£ºGraphics Device Interface£©ÊÇWindowsµÄ×Óϵͳ£¬Ëü¸ºÔðÔÚÊÓѶÏÔʾÆ÷ºÍ´òÓ¡»úÉÏÏÔʾͼÐΡ£
GDIµÄÖ÷ҪĿµÄÖ®Ò»ÊÇÖ§³ÖÓëÉ豸Î޹صÄͼÐΡ£GDIͨ¹ý½«ÄúµÄ³ÌÐòºÍ²»Í¬Êä³öÉ豸µÄÌØÐÔ¸ôÀ뿪À´µÄ·½·¨À´´ïµ½ÕâһĿµÄ¡£
WindowsÄÚ¶¨Ê¹ÓÃÍ¼ËØ×ø±êϵͳ.
¿ÉÒÔʹÓÃÐéÄâ×ø±êϵÒÔ±ãÈóÌÐò¶ÀÁ¢ÓÚÓ²¼þÖ®Í⣬»òÕßÒ²¿ÉÒÔʹÓÃÉè±¸×ø±êϵ¶øÍêȫӭºÏÓ²É豸ÌṩµÄ»·¾³¡£
ËäÈ»¿ÉÒÔÔÚÏÔʾÆ÷Éϵ½´¦Òƶ¯Í¼ÐζÔÏ󣬵«GDIͨ³£ÊÇÒ»¸ö¾²Ì¬µÄÏÔʾϵͳ£¬Ö»ÓÐÓÐÏ޵͝»­Ö§³Ö¡£Èç¹ûÐèҪΪÓÎÏ·±àд¸´Ôӵ͝»­£¬¾ÍÓ¦¸ÃÑо¿Ò»ÏÂMicrosoft DirectX£¬ËüÌṩÁËÄúÐèÒªµÄÖ§³Ö¡£

GDIº¯Êý·ÖÀà
È¡µÃ£¨»òÕß½¨Á¢£©ºÍÊÍ·Å£¨»òÕßÇå³ý£©É豸ÄÚÈݵĺ¯Êý   ÈçGetDCºÍRealseDC
È¡µÃÓйØÉ豸ÄÚÈÝÐÅÏ¢µÄº¯Êý   ÈçGetTextMetrics
»æÍ¼º¯Êý   ÈçTextOut
É趨ºÍÈ¡µÃÉ豸ÄÚÈݲÎÊýµÄº¯Êý   ÈçSetTextColor  SetTextAlign
ʹÓÃGDI¶ÔÏóµÄº¯Êý  ÈçCreatePen

GDI»ù±¾Í¼ÐÎ
Ö±ÏߺÍÇúÏß  ÌîÈëÇøÓò  ÊÓͼ  ÎÄ×Ö

GDIÆäËû²¿·Ö
Ó³ÏñģʽºÍ±ä»»  Metafile »æÍ¼ÇøÓò  ·¾¶  ¼ô²Ã  µ÷É«ÅÌ  ´òÓ¡

É豸ÄÚÈÝ
É豸ÄÚÈÝÖаüº¬Ðí¶àÈ·¶¨GDIº¯ÊýÈçºÎÔÚÉ豸ÉϹ¤×÷µÄĿǰ¡¸ÊôÐÔ¡¹¡£
ÀýÈ磬ºô½ÐTextOutʱ£¬Ö»ÐèÒªÔÚº¯ÊýÖиø³öÉ豸ÄÚÈݾä±ú¡¢ÆðÊ¼×ø±ê¡¢ÎÄ×ÖºÍÎÄ×ֵij¤¶È¶ø²»±ØÖ¸¶¨×ÖÌå¡¢ÎÄ×ÖÑÕÉ«¡¢ÎÄ×ÖºóÃæµÄ±³¾°É«²ÊÒÔ¼°×Ö·û¼ä¾à£¬ÒòΪÕâЩÊôÐÔ¶¼ÊÇÉ豸ÄÚÈݵÄÒ»²¿·Ö

È¡µÃÉ豸ÄÚÈݾä±ú
×î³£ÓõÄÈ¡µÃ²¢ÊÍ·ÅÉ豸ÄÚÈݾä±úµÄ·½·¨ÊÇ£¬ÔÚ´¦ÀíWM_PAINTÏûϢʱ£¬Ê¹ÓÃBeginPaintºÍEndPaintºô½Ð£º

hdc = BeginPaint (hwnd, &ps) ;   
ÆäËüÐгÌÐò       
EndPaint (hwnd, &ps) ;

Windows³ÌÐò»¹¿ÉÒÔÔÚ´¦Àí·ÇWM_PAINTÏûϢʱȡµÃÉ豸ÄÚÈݾä±ú£º

hdc = GetDC (hwnd) ;       
ÆäËüÐгÌÐò       
ReleaseDC (hwnd, hdc) ;

Windows³ÌÐò»¹¿ÉÒÔÈ¡µÃÊÊÓÃÓÚÕû¸ö´°¿Ú£¨°üÀ¨´°¿ÚµÄ±êÌâÁС¢²Ëµ¥¡¢¹ö¶¯ÌõµÈ£©µÄÉ豸ÄÚÈݾä±ú£º

hdc = GetWindowDC (hwnd) ;       
ÆäËüÐгÌÐò       
ReleaseDC (hwnd, hdc) ;

È¡µÃÉ豸ÄÚÈݾä±úµÄÁíÒ»¸ö¸üͨÓõĺ¯ÊýÊÇCreateDC£º

hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData) ;       
ÆäËüÐгÌÐò  Èçhdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL)È¡µÃÆÁÄ»¾ä±ú       
DeleteDC (hdc) ;

Ö»ÊÇÐèҪȡµÃ¹ØÓÚijÉ豸ÄÚÈݵÄһЩÐÅÏ¢¶ø²¢²»½øÐÐÈκλ滭£¬Ê¹ÓÃCreateIC:

hdc = CreateIC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;

ʹÓÃλͼʱ£¬È¡µÃÒ»¸ö¡¸ÄÚ´æÉ豸ÄÚÈÝ¡¹ÓÐʱÊÇÓÐÓõģº

hdcMem = CreateCompatibleDC (hdc) ;       
ÆäËüÐгÌÐò       
DeleteDC (hdcMem) ;

È¡µÃÉ豸ÄÚÈÝÐÅÏ¢
Ò»¸öÉ豸ÄÚÈÝͨ³£Ö¸Ò»¸öʵ¼ÊÏÔʾÉ豸£¬ÈçÊÓѶÏÔʾÆ÷ºÍ´òÓ¡»ú¡£¿ÉÒÔͨ¹ýºô½ÐGetDeviceCaps£¨¡¸È¡µÃÉ豸¹¦ÄÜ¡¹£©º¯ÊýÀ´È¡µÃÓйظÃÉ豸µÄÐÅÏ¢£¬ÈçÏÔʾÆ÷µÄ´óС,É«²ÊÏÔʾÄÜÁ¦µÈÐÅÏ¢£º
iValue = GetDeviceCaps (hdc, iIndex) ;
²ÎÊýiIndexȡֵΪWINGDI.H±íÍ·ÎļþÖж¨ÒåµÄ29¸ö±êʶ·ûÖ®Ò»¡£ÀýÈ磬iIndexΪHORZRESʱ½«Ê¹GetDeviceCaps´«»ØÉ豸µÄ¿í¶È£¨µ¥Î»ÎªÍ¼ËØ£©.

 Windows 98Ö§³ÖµÄÉ豸ÄÚÈÝĬÈÏÊôÐÔ£¬³ÌÐò¿ÉÒԸıä»òÕßÈ¡µÃÈκÎÒ»ÖÖÊôÐÔ¡£

É豸ÄÚÈÝÊôÐÔ

ĬÈÏÖµ

Ð޸ĸÃÖµµÄº¯Êý

È¡µÃ¸ÃÖµµÄº¯Êý

Mapping Mode

MM_TEXT

SetMapMode

GetMapMode

Window Origin

(0, 0)

SetWindowOrgEx

OffsetWindowOrgEx

GetWindowOrgEx

Viewport Origin

(0, 0)

SetViewportOrgEx

OffsetViewportOrgEx

GetViewportOrgEx

Window Extents

(1, 1)

SetWindowExtEx

SetMapMode

ScaleWindowExtEx

GetWindowExtEx

Viewport Extents

(1, 1)

SetViewportExtEx

SetMapMode

ScaleViewportExtEx

GetViewportExtEx

Pen

BLACK_PEN

SelectObject

SelectObject

Brush

WHITE_BRUSH

SelectObject

SelectObject

Font

SYSTEM_FONT

SelectObject

SelectObject

Bitmap

None

SelectObject

SelectObject

Current Position

(0, 0)

MoveToEx

LineTo

PolylineTo

PolyBezierTo

GetCurrentPositionEx

Background Mode

OPAQUE

SetBkMode

GetBkMode

Background Color

White

SetBkColor

GetBkColor

Text Color

Black

SetTextColor

GetTextColor

Drawing Mode

R2_COPYPEN

SetROP2

GetROP2

Stretching Mode

BLACKONWHITE

SetStretchBltMode

GetStretchBltMode

Polygon Fill Mode

ALTERNATE

SetPolyFillMode

GetPolyFillMode

Intercharacter Spacing

0

SetTextCharacterExtra

GetTextCharacterExtra

Brush Origin

(0, 0)

SetBrushOrgEx

GetBrushOrgEx

Clipping Region

None

SelectObject

SelectClipRgn

IntersectClipRgn

OffsetClipRgn

ExcludeClipRect

SelectClipPath

GetClipBox

 
±£´æÉ豸ÄÚÈÝ
ͨ³££¬ÔÚºô½ÐGetDC»òBeginPaintʱ£¬WindowsÓÃĬÈÏÖµ½¨Á¢Ò»¸öеÄÉ豸ÄÚÈÝ£¬Äú¶ÔÊôÐÔËù×öµÄÒ»ÇиıäÔÚÉ豸ÄÚÈÝÓÃReleaseDC»òEndPaintºô½ÐÊÍ·Åʱ£¬¶¼»á¶ªÊ§¡£Èç¹û³ÌÐòÐèҪʹÓ÷ÇÄÚ¶¨µÄÉ豸ÄÚÈÝÊôÐÔ£¬Ôò±ØÐëÔÚÿ´ÎÈ¡µÃÉ豸ÄÚÈݾä±úʱ³õʼ»¯É豸ÄÚÈÝ£º
ÄÇÓÐûÓа취ÔÚÊÍ·ÅÉ豸ÄÚÈÝÖ®ºó£¬ÈÔÈ»±£´æ³ÌÐòÖжÔÉ豸ÄÚÈÝÊôÐÔËù×öµÄ¸Ä±ä£¬ÒÔ±ãÔÚÏÂÒ»´Îºô½ÐGetDCºÍBeginPaintʱËüÃÇÈÔÈ»Äܹ»Æð×÷ÓÃÄØ?¿ÉÔڵǼ´°¿ÚÀà±ðʱ£¬½«CS_OWNDCÆì±êÄÉÈë´°¿ÚÀà±ðµÄÒ»²¿·Ö£º

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC ;

CS_OWNDC·ç¸ñÖ»Ó°ÏìGetDCºÍBeginPaint»ñµÃµÄÉ豸ÄÚÈÝ£¬²»Ó°ÏìÆäËüº¯Êý£¨ÈçGetWindowDC£©»ñµÃµÄÉ豸ÄÚÈÝ¡£¼´Ê¹ÓÃÁËCS_OWNDC£¬ÄúÈÔȻӦ¸ÃÔÚÍ˳ö´°¿ÚÏûÏ¢´¦Àí³ÌÐò֮ǰÊÍ·ÅÉ豸ÄÚÈÝ¡£

Èç¹ûÏë¸Ä±äijЩÉ豸ÄÚÈÝÊôÐÔ£¬ÓøıäºóµÄÊôÐÔ½øÐлæÍ¼£¬È»ºó»Ö¸´Ô­À´µÄÉ豸ÄÚÈÝ¡£

idSaved = SaveDC (hdc) ;

ÏÖÔÚ£¬¿ÉÒԸıäһЩÊôÐÔ£¬ÔÚÏëÒª»Øµ½ºô½ÐSaveDCǰ´æÔÚµÄÉ豸ÄÚÈÝʱ£¬ºô½Ð£º

RestoreDC (hdc, idSaved) ;

¿ÉÒÔÏó»ã±àÓïÑÔÖеÄPUSHºÍPOPÖ¸Áµ±Äúºô½ÐSaveDCʱ£¬²»ÐèÒª±£´æ´«»ØÖµ:

SaveDC (hdc) ;
......
RestoreDC (hdc, -1) ;

ÉèÖúÍÈ¡µÃÍ¼ËØ:

SetPixel (hdc, x, y, crColor) ;
crColor = GetPixel (hdc, x, y) ;

»­Ïß:
É豸ÄÚÈݵÄÎå¸öÊôÐÔÓ°Ïìן¯ÊýËù»­ÏßµÄÍâ¹Û£ºÄ¿Ç°»­±ÊµÄλÖ㨽öÓÃÓÚLineTo¡¢PolylineTo¡¢PolyBezierToºÍArcTo £©¡¢»­±Ê¡¢±³¾°·½Ê½¡¢±³¾°É«ºÍ»æÍ¼Ä£Ê½¡£

Èç¹ûÐèҪĿǰλÖ㬾ͿÉÒÔͨ¹ýÒÔϺô½Ð»ñµÃ£º

GetCurrentPositionEx (hdc, &pt) ;

»­¶à±ßÐÐ

POINT apt[5] = { 100, 100, 200, 100, 200, 200, 100, 200, 100, 100 } ;
MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ;       
for (i = 1 ; i < 5 ; i++)       
    LineTo (hdc, apt[i].x, apt[i].y) ;

µ±ÄúÒª½«Êý×éÖеĵãÁ¬½Ó³ÉÏßʱ£¬Ê¹ÓÃPolylineº¯ÊýÒª¼òµ¥µÃ¶à¡£

Polyline (hdc, apt, sizeof(apt)/sizeof(POINT)) ;

»¹¿ÉÒÔ:

MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ;       
PolylineTo (hdc, apt + 1, 4) ;

±ß½ç¿òº¯Êý
Rectangle¡¢Ellipse¡¢RoundRect¡¢ChordºÍPieº¯ÊýÑϸñÀ´Ëµ²»ÊÇ»­Ïߺ¯Êý¡£ËüÃÇͬʱÓÖÌîÈë»­Ë¢ÌîÈëÒ»¸ö·â±ÕÇøÓò¡£Õâ¸ö»­Ë¢ÄÚ¶¨Îª°×É«£¬Òò´ËµÚÒ»´ÎʹÓÃÕâЩº¯Êýʱ£¬¿ÉÄܲ»»á×¢Òâµ½ËüÃDz»Ö»ÊÇ»­Ïß¡£

Rectangle (hdc, xLeft, yTop, xRight, yBottom) ;
Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;
RoundRect (hdc, xLeft, yTop, xRight, yBottom,
           xCornerEllipse, yCornerEllipse) ;
Arc(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;       
Chord(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;       
Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;

ʹÓÃÏÖÓл­±Ê£¨Stock Pens£©

HPEN hPen ;
hPen = GetStockObject (WHITE_PEN) ;
SelectObject (hdc, hPen) ;

»­±ÊµÄ½¨Á¢¡¢Ñ¡ÔñºÍɾ³ý
ʹÓú¯ÊýCreatePen»òCreatePenIndirect½¨Á¢Ò»¸ö¡¸Âß¼­»­±Ê¡¹£¬Õâ½ö½öÊǶԻ­±ÊµÄÃèÊö¡£ÕâЩº¯Êý´«»ØÂß¼­»­±ÊµÄ¾ä±ú£»È»ºó£¬ºô½ÐSelectObject½«»­±ÊÑ¡½øÉ豸ÄÚÈÝ¡£ÏÖÔÚ£¬¾Í¿ÉÒÔʹÓÃÐµĻ­±ÊÀ´»­ÏßÁË¡£ÔÚÈκÎʱºò£¬¶¼Ö»ÄÜÓÐÒ»ÖÖ»­±ÊÑ¡½øÉ豸ÄÚÈÝ¡£ÔÚÊÍ·ÅÉ豸ÄÚÈÝ£¨»òÕßÔÚÑ¡ÔñÁËÁíÒ»ÖÖ»­±Êµ½É豸ÄÚÈÝÖУ©Ö®ºó£¬¾Í¿ÉÒÔºô½ÐDeleteObjectÀ´É¾³ýËù½¨Á¢µÄÂß¼­»­±ÊÁË¡£ÔÚɾ³ýºó£¬¸Ã»­±ÊµÄ¾ä±ú¾Í²»ÔÙÓÐЧÁË¡£
Âß¼­»­±ÊÊÇÒ»ÖÖ¡¸GDI¶ÔÏó¡¹£¬ËüÊÇÄú¿ÉÒÔ½¨Á¢µÄÁùÖÖGDI¶ÔÏóÖ®Ò»£¬ÆäËüÎåÖÖÊÇ»­Ë¢¡¢Î»Í¼¡¢ÇøÓò¡¢×ÖÌåºÍµ÷É«ÅÌ¡£³ýÁ˵÷É«ÅÌÖ®Í⣬ÕâЩ¶ÔÏó¶¼ÊÇͨ¹ýSelectObjectÑ¡½øÉ豸ÄÚÈݵġ£
ÔÚʹÓû­±ÊµÈGDI¶ÔÏóʱ£¬Ó¦¸Ã×ñÊØÒÔÏÂÈýÌõ¹æÔò£º
    ×îºóҪɾ³ý×Ô¼º½¨Á¢µÄËùÓÐGDI¶ÔÏ󡣡¡
    µ±GDI¶ÔÏóÕýÔÚÒ»¸öÓÐЧµÄÉ豸ÄÚÈÝÖÐʹÓÃʱ£¬²»ÒªÉ¾³ýËü¡£¡¡
    ²»ÒªÉ¾³ýÏÖÓжÔÏó¡£
CreatePenº¯ÊýµÄÓï·¨ÐÎÈ磺

hPen = CreatePen (iPenStyle, iWidth, crColor) ;

ҪʹÓÃCreatePenIndirect£¬Ê×Ïȶ¨ÒåÒ»¸öLOGPENÐÍ̬µÄ½á¹¹£º

LOGPEN logpen ;
hPen = CreatePenIndirect (&logpen) ;

´Ë½á¹¹ÓÐÈý¸ö³ÉÔ±£ºlopnStyle£¨ÎÞÕý¸ººÅÕûÊý»òUINT£©ÊÇ»­±ÊÑùʽ£¬lopnWidth£¨POINT½á¹¹£©Êǰ´Âß¼­µ¥Î»¶ÈÁ¿µÄ»­±Ê¿í¶È£¬lopnColor (COLORREF)ÊÇ»­±ÊÑÕÉ«¡£WindowsֻʹÓÃlopnWidth½á¹¹µÄxÖµ×÷Ϊ»­±Ê¿í¶È£¬¶øºöÂÔyÖµ¡£

ÌîÈë¿Õ϶
ʹÓõãʽ»­±ÊºÍÐéÏß»­±Ê»á²úÉúÒ»¸öÓÐȤµÄÎÊÌ⣺µãºÍÐéÏßÖ®¼äµÄ¿Õ϶»áÔõÑùÄØ£¿
¿Õ϶µÄ×Åɫȡ¾öÓÚÉ豸ÄÚÈݵÄÁ½¸öÊôÐÔ£­±³¾°Ä£Ê½ºÍ±³¾°ÑÕÉ«¡£ÄÚ¶¨±³¾°Ä£Ê½ÎªOPAQUE£¬ÔÚÕâÖÖ·½Ê½Ï£¬WindowsʹÓñ³¾°É«À´ÌîÈë¿Õ϶£¬ÄÚ¶¨µÄ±³¾°É«Îª°×É«¡£
¿ÉÒÔͨ¹ýÈçϺô½ÐÀ´¸Ä±äWindowsÓÃÀ´ÌîÈë¿Õ϶µÄ±³¾°É«£º

SetBkColor (hdc, crColor) ;    (ÏàÓ¦µÄÓÐGetBKColorº¯Êý)

ͨ¹ý½«±³¾°Ä£Ê½×ª»»ÎªTRANSPARENT£¬¿ÉÒÔ×èÖ¹WindowsÌîÈë¿Õ϶£º

SetBkMode (hdc, TRANSPARENT) ;  (ÏàÓ¦µÄÓÐGetBKModeº¯Êý)

»æÍ¼·½Ê½
¿ÉÒÔͨ¹ýÒÔϺô½ÐÔÚÉ豸ÄÚÈÝÖÐÉ趨ÐµĻæÍ¼Ä£Ê½£º

SetROP2 (hdc, iDrawMode) ;   (ÏàÓ¦µÄÓÐGetROP2º¯Êý)

É豸ÄÚÈÝÖеÄÄÚ¶¨É趨ΪR2_COPYPEN£¬ËüÓû­±ÊÉ«²ÊÌæ´úÄ¿±êÉ«²Ê¡£ÔÚR2_NOTCOPYPEN·½Ê½Ï£¬Èô»­±ÊΪºÚÉ«£¬Ôò»­³É°×É«£»Èô»­±ÊΪ°×É«£¬Ôò»­³ÉºÚÉ«¡£R2_BLACK·½Ê½Ï£¬²»¹Ü»­±ÊºÍ±³¾°É«ÎªºÎÖÖÉ«²Ê£¬×ÜÊÇ»­³ÉºÚÉ«¡£Óë´ËÏà·´£¬R2_WHITE·½Ê½ÏÂ×ÜÊÇ»­³É°×É«¡£R2_NOP·½Ê½¾ÍÊÇ¡¸²»²Ù×÷¡¹£¬ÈÃÄ¿±ê±£³Ö²»±ä¡£

»æÖÆÌîÈëÇøÓò
WindowsÓÃÉ豸ÄÚÈÝÖÐÑ¡ÔñµÄĿǰ»­±ÊÀ´»­Í¼Ðεı߽ç¿ò£¬±ß½ç¿ò»¹Ê¹ÓÃĿǰ±³¾°·½Ê½¡¢±³¾°É«²ÊºÍ»æÍ¼·½Ê½£¬Õâ¸úWindows»­ÏßʱһÑù¡£
ͼÐÎÒÔĿǰÉ豸ÄÚÈÝÖÐÑ¡ÔñµÄ»­Ë¢À´ÌîÈë¡£ÄÚ¶¨Çé¿öÏ£¬Ê¹ÓÃÏÖÓжÔÏó£¬ÕâÒâζ×ÅͼÐÎÄÚ²¿½«»­Îª°×É«¡£Windows¶¨ÒåÁùÖÖÏÖÓл­Ë¢£ºWHITE_BRUSH¡¢LTGRAY_BRUSH¡¢GRAY_BRUSH¡¢DKGRAY_BRUSH¡¢BLACK_BRUSHºÍNULL_BRUSH £¨Ò²½ÐHOLLOW_BRUSH£©¡£Äú¿ÉÒÔ½«ÈκÎÒ»ÖÖÏÖÓл­Ë¢Ñ¡ÈëÄúµÄÉ豸ÄÚÈÝÖУ¬¾ÍºÍÄúÑ¡ÔñÒ»ÖÖ»­±ÊÒ»Ñù¡£

HBRUSH hBrush ;
hBrush = GetStockObject (GRAY_BRUSH) ;       
SelectObject (hdc, hBrush) ;

Èç¹ûÏë»­Ò»¸öûÓб߽ç¿òµÄͼÐΣ¬¿ÉÒÔ½«NULL_PENÑ¡½øÉ豸ÄÚÈÝ£º

SelectObject (hdc, GetStockObject (NULL_PEN)) ;  

Èç¹ûÏë»­³öͼÐεı߽ç¿ò£¬µ«²»ÌîÈëÄÚ²¿£¬Ôò½«NULL_BRUSHÑ¡½øÉ豸ÄÚÈÝ£º

SelectObject (hdc, GetStockobject (NULL_BRUSH) ;

Polygon(¶à±ßÐÎ)º¯ÊýºÍ¶à±ßÐÎÌîÈ뷽ʽ

Polygon (hdc, apt, iCount) ;

ÆäÖУ¬apt²ÎÊýÊÇPOINT½á¹¹µÄÒ»¸öÊý×飬iCountÊǵãµÄÊýÄ¿¡£Èç¹û¸ÃÊý×éÖеÄ×îºóÒ»¸öµãÓëµÚÒ»¸öµã²»Í¬£¬ÔòWindows½«»áÔÙ¼ÓÒ»ÌõÏߣ¬½«×îºóÒ»¸öµãÓëµÚÒ»¸öµãÁ¬ÆðÀ´£¨ÔÚPolylineº¯ÊýÖУ¬Windows²»»áÕâô×ö£©¡£
PolyPolygon(¶à¸ö¶à±ßÐÐ)º¯ÊýÈçÏÂËùʾ£º

PolyPolygon (hdc, apt, aiCounts, iPolyCount) ;

iPolyCount¸ø³öÁËËù»­µÄ¶à±ßÐεĸöÊý,¶ÔÓÚÿ¸ö¶à±ßÐΣ¬aiCountsÊý×鏸³öÁ˶à±ßÐεĶ˵ãÊý¡£aptÊý×é¾ßÓÐÈ«²¿¶à±ßÐεÄËùÓеã.
¶ÔÓÚPolygonºÍPolyPolygonº¯Êý£¬WindowsʹÓö¨ÒåÔÚÉ豸ÄÚÈÝÖеÄĿǰ»­Ë¢À´ÌîÈëÕâ¸ö´ø±ß½çµÄÇøÓò¡£ÖÁÓÚÌîÈëÄÚ²¿µÄ·½Ê½£¬ÔòÈ¡¾öÓÚ¶à±ßÐÎÌîÈ뷽ʽ£¬¿ÉÒÔÓÃSetPolyFillModeº¯ÊýÀ´É趨£º

SetPolyFillMode (hdc, iMode) ;

ÄÚ¶¨Çé¿öÏ£¬¶à±ßÐÎÌîÈ뷽ʽÊÇALTERNATE£¬µ«ÊÇ¿ÉÒÔ½«ËüÉ趨ΪWINDING¡£

Óû­Ë¢ÌîÈëÄÚ²¿
ÏÂÃæÊǽ¨Á¢Âß¼­»­Ë¢µÄµÚÒ»¸öº¯Êý£º

hBrush = CreateSolidBrush (crColor) ;

½¨Á¢Ó°Ïß»­Ë¢µÄº¯ÊýΪ£º

hBrush = CreateHatchBrush (iHatchStyle, crColor) ;

iHatchStyle²ÎÊýÃèÊöÓ°Ïß±ê¼ÇµÄÍâ¹Û¡£
¿ÉÒÔʹÓÃCreatePatternBrushºÍCreateDIBPatternBrushPt½¨Á¢×Ô¼ºµÄλͼ»­Ë¢¡£
½¨Á¢Âß¼­»­Ë¢µÄµÚÎå¸öº¯Êý°üº¬ÆäËüËĸöº¯Êý£º

hBrush = CreateBrushIndirect (&logbrush) ;

±äÁ¿logbrushÊÇÒ»¸öÐÍ̬ΪLOGBRUSH£¨¡¸Âß¼­»­Ë¢¡¹£©µÄ½á¹¹£¬¸Ã½á¹¹µÄÈý¸ö×Ö¶ÎÈç±íËùʾ£¬lbStyle×ֶεÄֵȷ¶¨ÁËWindowsÈçºÎ½âÊÍÆäËüÁ½¸ö×ֶεÄÖµ£º

lbStyle (UINT)

lbColor (COLORREF)

lbHatch (LONG)

BS_SOLID

»­Ë¢µÄÉ«²Ê

ºöÂÔ

BS_HOLLOW

ºöÂÔ

ºöÂÔ

BS_HATCHED

Ó°ÏßµÄÉ«²Ê

Ó°Ïß»­Ë¢·ç¸ñ

BS_PATTERN

ºöÂÔ

λͼµÄ¾ä±ú

BS_DIBPATTERNPT

ºöÂÔ

Ö¸ÏòDIBµÄÖ¸±ê

Èç¹ûÄúÐèҪȡµÃ»­Ë¢µÄÐÅÏ¢£¬¿ÉÒÔºô½ÐGetObject£º

GetObject (hBrush, sizeof (LOGBRUSH), (LPVOID) &logbrush) ;       

ÆäÖУ¬logbrushÊÇÒ»¸öÐÍ̬ΪLOGBRUSHµÄ½á¹¹¡£

GDI Ó³Ïñ·½Ê½
¿ÉÒÔʹÓÃÏÂÃæµÄÐðÊöÀ´É趨ӳÉ䷽ʽ£º

SetMapMode (hdc, iMapMode) ;

¿ÉÒÔͨ¹ýÒÔϺô½ÐÈ¡µÃĿǰµÄÓ³Ïñ·½Ê½£º

iMapMode = GetMapMode (hdc) ;

ÄÚ¶¨Ó³Ïñ·½Ê½ÎªMM_TEXT¡£ÔÚÕâÖÖÓ³Ïñ·½Ê½Ï£¬Âß¼­µ¥Î»Óëʵ¼Êµ¥Î»Ïàͬ£¬ÕâÑùÎÒÃÇ¿ÉÒÔÖ±½ÓÒÔÍ¼ËØÎªµ¥Î»½øÐвÙ×÷¡£

Éè±¸×ø±êºÍÂß¼­×ø±ê
Èç¹ûʹÓÃMM_LOENGLISHÓ³É䷽ʽ£¬ÊDz»Êǽ«»áµÃµ½ÒÔ°Ù·ÖÖ®Ò»Ó¢´çΪµ¥Î»µÄWM_SIZEÏûÏ¢ÄØ£¿¾ø¶Ô²»»á¡£Windows¶ÔËùÓÐÏûÏ¢£¨ÈçWM_MOVE¡¢WM_SIZEºÍWM_MOUSEMOVE£©£¬¶ÔËùÓзÇGDIº¯Êý£¬ÉõÖÁ¶ÔһЩGDIº¯Êý£¬ÓÀԶʹÓÃÉè±¸×ø±ê¡£

Éè±¸×ø±êϵ
Windows½«GDIº¯ÊýÖÐÖ¸¶¨µÄÂß¼­×ø±êÓ³ÏñΪÉè±¸×ø±ê¡£

ΪÊÓѶÏÔʾÆ÷ÇøÓò¶¨ÒåµÄÈýÖÖ²»Í¬µÄÉè±¸×ø±êϵ:
µ±Ê¹ÓÃÕû¸öÆÁĻʱ£¬¾Í¸ù¾Ý¡¸ÆÁÄ»×ø±ê¡¹½øÐвÙ×÷¡£ÆÁÄ»µÄ×óÉϽÇΪ(0,0)µã.Èç¹ûÒÔDISPLAYΪ²ÎÊýºô½ÐCreateDC£¬ÒÔÈ¡µÃÕû¸öÆÁÄ»µÄÉ豸ÄÚÈÝ£¬ÔòÄÚ¶¨Çé¿öÏÂGDIºô½ÐÖÐÖ¸¶¨µÄÂß¼­×ø±ê½«±»Ó³ÏñΪÆÁÄ»×ø±ê¡£
È«´°¿Ú×ø±ê¡¹ÒÔ³ÌÐòµÄÕû¸ö´°¿ÚΪ»ù×¼£¬Èç±êÌâÁС¢²Ëµ¥¡¢¹ö¶¯ÌõºÍ´°¿Ú¿ò¶¼°üÀ¨ÔÚÄÚ¡£Èç¹ûÓÃGetWindowDCÈ¡µÃÉ豸ÄÚÈÝ£¬GDIº¯ÊýÖеÄÂß¼­×ø±ê¾Í»áת»»ÎªÏÔÊ¾ÇøÓò×ø±ê¡£
µÚÈýÖÖ×ø±êϵÊÇÎÒÃÇ×ʹÓõġ¸ÏÔÊ¾ÇøÓò×ø±êϵ¡¹¡£µã£¨0,0£©ÊÇÏÔÊ¾ÇøÓòµÄ×óÉϽǡ£µ±Ê¹ÓÃGetDC»òBeginPaintÈ¡µÃÉ豸ÄÚÈÝʱ£¬GDIº¯ÊýÖеÄÂß¼­×ø±ê¾Í»áÄÚ¶¨×ª»»ÎªÏÔÊ¾ÇøÓò×ø±ê¡£
 
º¯ÊýClientToScreenºÍScreenToClient¿ÉÒÔ½«ÏÔÊ¾ÇøÓò×ø±êת»»ÎªÆÁÄ»×ø±ê£¬»òÕß·´¹ýÀ´£¬½«ÆÁÄ»×ø±êת»»ÎªÏÔÊ¾ÇøÓò×ø±ê¡£Ò²¿ÉÒÔʹÓÃGetWindowRectº¯ÊýÈ¡µÃÆÁÄ»×ø±êϵÄÕû¸ö´°¿ÚµÄλÖúʹóС¡£ÕâÈý¸öº¯ÊýΪһÖÖÉè±¸×ø±êת»»ÎªÁíÒ»ÖÖÌṩÁË×ã¹»µÄÐÅÏ¢¡£

ÊӶ˿ںʹ°¿Ú
WindowsÌṩÁËÁ½¸öº¯ÊýÀ´½«É豸µãת»»ÎªÂß¼­µãÒÔ¼°½«Âß¼­µãת»»ÎªÉ豸µã¡£ÏÂÃæµÄº¯Êý½«É豸µãת»»ÎªÂß¼­µã£º

DPtoLP (hdc, pPoints, iNumber) ;

ÆäÖУ¬pPointsÊÇÒ»¸öÖ¸ÏòPOINT½á¹¹Êý×éµÄÖ¸Õ룬¶øiNumberÊÇҪת»»µÄµãµÄ¸öÊý¡£Äú»á·¢ÏÖÕâ¸öº¯Êý¶ÔÓÚ½«GetClientRect£¨Ëü×ÜÊÇʹÓÃÉ豸µ¥Î»£©È¡µÃµÄÏÔÊ¾ÇøÓò´óСת»»ÎªÂß¼­×ø±êºÜÓÐÓãº

GetClientRect (hwnd, &rect) ;       
DPtoLP (hdc, (PPOINT) &rect, 2) ;   

ÏÂÃæµÄº¯Êý½«Âß¼­µãת»»ÎªÉ豸µã£º

LPtoDP (hdc, pPoints, iNumber) ;

¾ØÐκ¯Êý
ÏÂÃæÈý¸ö»æÍ¼º¯ÊýÐèÒªÒ»¸öÖ¸Ïò¾ØÐνṹµÄÖ¸Õ룺

FillRect (hdc, &rect, hBrush) ;       
FrameRect (hdc, &rect, hBrush) ;       
InvertRect (hdc, &rect) ;

rect²ÎÊýÊÇÒ»¸öRECTÐÍ̬µÄ½á¹¹£¬Ëü°üº¬ÓÐ4¸ö×ֶΣºleft¡¢top¡¢rightºÍbottom¡£Õâ¸ö½á¹¹ÖеÄ×ø±ê±»µ±×÷Âß¼­×ø±ê¡£
FillRectÓÃÖ¸¶¨»­Ë¢À´ÌîÈë¾ØÐΣ¨Ö±µ½µ«²»°üº¬rightºÍbottom×ø±ê£©£¬¸Ãº¯Êý²»ÐèÒªÏȽ«»­Ë¢Ñ¡½øÉ豸ÄÚÈÝ¡£
FrameRectʹÓû­Ë¢»­¾ØÐοò£¬µ«ÊDz»ÌîÈë¾ØÐΡ£
InvertRect½«¾ØÐÎÖÐËùÓÐÍ¼ËØ·­×ª£¬1ת»»³É0£¬0ת»»Îª1£¬¸Ãº¯Êý½«°×É«ÇøÓòת±ä³ÉºÚÉ«£¬ºÚÉ«ÇøÓòת±äΪ°×É«

rect.left          = xLeft ;       
rect.top           = xTop ;       
rect.right         = xRight ;       
rect.bottom        = xBottom

µÈ¼ÛÓÚ

SetRect (&rect, xLeft, yTop, xRight, yBottom) ;

½«¾ØÐÎÑØxÖáºÍyÖáÒÆ¶¯¼¸¸öµ¥Ôª£º

OffsetRect (&rect, x, y) ;

Ôö¼õ¾ØÐεijߴ磺

InflateRect (&rect, x, y) ;

¾ØÐθ÷×Ö¶ÎÉ趨Ϊ0£º

SetRectEmpty (&rect) ;

½«¾ØÐθ´ÖƸøÁíÒ»¸ö¾ØÐΣº

CopyRect (&DestRect, &SrcRect) ;

È¡µÃÁ½¸ö¾ØÐεĽ»¼¯£º

IntersectRect (&DestRect, &SrcRect1, &SrcRect2) ;

È¡µÃÁ½¸ö¾ØÐεÄÁª¼¯£º

UnionRect (&DestRect, &SrcRect1, &SrcRect2) ;

È·¶¨¾ØÐÎÊÇ·ñΪ¿Õ£º

bEmpty = IsRectEmpty (&rect) ;

È·¶¨µãÊÇ·ñÔÚ¾ØÐÎÄÚ£º

bInRect = PtInRect (&rect, point) ;

Ëæ»ú¾ØÐÎ
²»Äܼòµ¥µØÔÚWM_PAINTÏûÏ¢ÖÐʹÓÃÒ»¸öwhile(TRUE)Ñ­»·¡£µ±È»£¬ËüÄܹ»Ö´ÐУ¬µ«ÊdzÌÐò½«Í£Ö¹¶ÔÆäËûÏûÏ¢µÄ´¦Àí£¬Í¬Ê±£¬Õâ¸ö³ÌÐò²»ÄÜÖÐÖ¹»òÕß×îС»¯¡£
Ò»ÖÖ¿ÉÒÔ½ÓÊܵķ½·¨ÊÇÉ趨һ¸öWindows¶¨Ê±Æ÷£¬¸ø´°¿Ú³ÌÐò·¢ËÍWM_TIMERÏûÏ¢¡£¶ÔÓÚÿÌõWM_TIMERÏûÏ¢£¬Ê¹ÓÃGetDCÈ¡µÃÒ»¸öÉ豸ÄÚÈÝ£¬»­Ò»¸öËæ»úµÄ¾ØÐΣ¬È»ºóÓÃReleaseDCÊÍ·ÅÉ豸ÄÚÈÝ¡£
ÔÚWindowsÖÐÒ»¶¨ÓкܶࡸÏÐÖÃʱ¼ä¡¹£¬ÔÚÕâ¸öʱ¼äÄÚ£¬ËùÓÐÏûÏ¢¶ÓÁÐΪ¿Õ£¬WindowsֻͣÔÚÒ»¸öСѭ»·Öеȴý¼üÅÌ»òÕßÊó±êÊäÈë¡£¿ÉÒÔʹÓÃPeekMessageÔÚÏÐÖÃʱ¼äÄÚ»ñµÃ¿ØÖÆ£¬»æÖƾØÐΣ¬²¢ÇÒÖ»ÔÚÓÐÏûÏ¢¼ÓÈë³ÌÐòµÄÏûÏ¢¶ÓÁÐÖ®ºó²ÅÊÍ·Å¿ØÖÆ.Èç:

PeekMessage (&msg, NULL, 0, 0, PM_REMOVE) ;

ÃæµÄËĸö²ÎÊý£¨Ò»¸öÖ¸ÏòMSG½á¹¹µÄÖ¸Õë¡¢Ò»¸ö´°¿Ú¾ä±ú¡¢Á½¸öֵָʾÏûÏ¢·¶Î§£©ÓëGetMessageµÄ²ÎÊýÏàͬ¡£½«µÚ¶þ¡¢Èý¡¢Ëĸö²ÎÊýÉ趨ΪNULL»ò0ʱ£¬±íÃ÷PeekMessage´«»Ø³ÌÐòÖÐËùÓд°¿ÚµÄËùÓÐÏûÏ¢¡£Èç¹ûÒª½«ÏûÏ¢´ÓÏûÏ¢¶ÓÁÐÖÐɾ³ý£¬Ôò½«PeekMessageµÄ×îºóÒ»¸ö²ÎÊýÉ趨ΪPM_REMOVE¡£Èç¹û²»Ï£Íûɾ³ýÏûÏ¢£¬ÄÇô¿ÉÒÔ½«Õâ¸ö²ÎÊýÉ趨ΪPM_NOREMOVE¡£
GetMessage²»½«¿ØÖÆ´«»Ø¸ø³ÌÐò£¬Ö±µ½´Ó³ÌÐòµÄÏûÏ¢¶ÓÁÐÖÐÈ¡µÃÏûÏ¢£¬µ«ÊÇPeekMessage×ÜÊÇÁ¢¿Ì´«»Ø£¬¶ø²»ÂÛÒ»¸öÏûÏ¢ÊÇ·ñ³öÏÖ¡£µ±ÏûÏ¢¶ÓÁÐÖÐÓÐÒ»¸öÏûϢʱ£¬PeekMessageµÄ´«»ØÖµÎªTRUE£¨·Ç0£©£¬²¢ÇÒ½«°´Í¨³£·½Ê½´¦ÀíÏûÏ¢¡£µ±¶ÓÁÐÖÐûÓÐÏûϢʱ£¬PeekMessage´«»ØFALSE¡£
×¢Òâ:²»ÄÜÓÃPeekMessage´ÓÏûÏ¢¶ÓÁÐÖÐɾ³ýWM_PAINTÏûÏ¢,´Ó¶ÓÁÐÖÐɾ³ýWM_PAINTÏûÏ¢µÄΨһ·½·¨ÊÇÁî´°¿ÚÏÔÊ¾ÇøÓòµÄÊ§Ð§ÇøÓò±äµÃÓÐЧ

½¨Á¢ºÍ»æÖƼô²ÃÇøÓò
×î¼òµ¥µÄ¼ô²ÃÇøÓòÊǾØÐΣ¬ÓÐÁ½ÖÖ½¨Á¢¾ØÐεķ½·¨£º

hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;
hRgn = CreateRectRgnIndirect (&rect) ;

Ò²¿ÉÒÔ½¨Á¢ÍÖÔ²¼ô²ÃÇøÓò£º

hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;
hRgn = CreateEllipticRgnIndirect (&rect) ;

½¨Á¢¶à±ßÐμô²ÃÇøÓòµÄº¯ÊýÀàËÆÓÚPolygonº¯Êý£º

hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;

¼ô²ÃÇøÓòµÄ×÷Óãº

iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) ;

ÕâÒ»º¯Êý½«Á½¸ö¼ô²ÃÇøÓò£¨hSrcRgn1ºÍhSrcRgn2£©×éºÏÆðÀ´²¢Óþä±úhDestRgnÖ¸Ïò×éºÏ³ÉµÄ¼ô²ÃÇøÓò¡£ÕâÈý¸ö¼ô²ÃÇøÓò¾ä±ú¶¼±ØÐëÊÇÓÐЧµÄ£¬µ«ÊÇhDestRgnÔ­À´ËùÖ¸ÏòµÄ¼ô²ÃÇøÓò±»ÆÆ»µµôÁË
´ÓCombineRgn´«»ØµÄiRgnTypeÖµÊÇÏÂÁÐÖ®Ò»£ºNULLREGION£¬±íʾµÃµ½Ò»¸ö¿Õ¼ô²ÃÇøÓò£»SIMPLEREGION£¬±íʾµÃµ½Ò»¸ö¼òµ¥µÄ¾ØÐΡ¢ÍÖÔ²»òÕß¶à±ßÐΣ»COMPLEXREGION£¬±íʾ¶à¸ö¾ØÐΡ¢ÍÖÔ²»ò¶à±ßÐεÄ×éºÏ£»ERROR£¬±íʾ³ö´íÁË¡£

¼ô²ÃÇøÓòµÄ¾ä±ú¿ÉÒÔÓÃÓÚËĸö»æÍ¼º¯Êý£º

FillRgn (hdc, hRgn, hBrush) ;       
FrameRgn (hdc, hRgn, hBrush, xFrame, yFrame) ;       
InvertRgn (hdc, hRgn) ;       
PaintRgn (hdc, hRgn) ;

ÔÚÓÃÍêÒ»¸öÇøÓòºó£¬¿ÉÒÔÏñɾ³ýÆäËüGDI¶ÔÏóÄÇÑùɾ³ýËü£º

DeleteObject (hRgn) ;

¾ØÐÎÓëÇøÓòµÄ¼ô²Ã
WindowsÓÐÁ½¸ö×÷ÓÃÓÚ¼ô²ÃÇøÓò¶ø²»ÊǾØÐεĺ¯Êý£¬ËüÃÇÀàËÆÓÚInvalidateRectºÍValidateRect£º

InvalidateRgn (hwnd, hRgn, bErase) ;       
ValidateRgn (hwnd, hRgn) ;

¼ô²ÃÇøÓò²»Ò»¶¨ÊǾØÐÎ

¿ÉÒÔʹÓÃÒÔÏÂÁ½¸öº¯ÊýÖ®Ò»

SelectObject (hdc, hRgn) ;    
SelectClipRgn (hdc, hRgn) ;  

ͨ¹ý½«Ò»¸ö¼ô²ÃÇøÓòÑ¡½øÉ豸ÄÚÈÝÀ´½¨Á¢×Ô¼ºµÄ¼ô²ÃÇøÓò£¬Õâ¸ö¼ô²ÃÇøÓòʹÓÃ
Éè±¸×ø±ê¡£

·¢±íÓÚ£º 2005-11-10£¬ÐÞ¸ÄÓÚ£º 2005-11-10 13:26£¬ÒÑä¯ÀÀ467´Î£¬ÓÐÆÀÂÛ0Ìõ ÍÆ¼ö ͶËß

¸øÎÒÁôÑÔ
°æÈ¨ËùÓÐ ChinaUnix.net Ò³ÃæÉú³Éʱ¼ä£º0.06913