ͼÐλù´¡
ͼÐλù´¡
ͼÐÎÉ豸½Ó¿Ú£¨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) ;
ͨ¹ý½«Ò»¸ö¼ô²ÃÇøÓòÑ¡½øÉ豸ÄÚÈÝÀ´½¨Á¢×Ô¼ºµÄ¼ô²ÃÇøÓò£¬Õâ¸ö¼ô²ÃÇøÓòʹÓÃ
Éè±¸×ø±ê¡£