´Ù°¢Çü Æ÷ÀÎÆ®¸¦ °è»ê, ±×·¡¼ Ãß°¡ ÁË ¹× cos ÇÔ¼ö¸¦ »ç¿ë ÇÏ´Â ±×¸®±â Äڵ忡¼ math.h Polyctl.hÀÇ »ó´Ü¿¡ Æ÷ÇÔ:
# include lt;math.h >
# include "resource.h" / ±âº» / ±âÈ£
Âü°í ¸±¸®½º ºôµå¸¸nbsp;??ATL COM ¸¶¹ý»ç ±âº» ÇÁ·ÎÁ§Æ®¸¦ »ý¼º ÇÏ´Â °æ¿ì ¸ÅÅ©·Î _ATL_MIN_CRTÁ¤ÀÇ ÇÕ´Ï´Ù. ÀÌ ¸ÅÅ©·Î Á¤ÀÇ µÇ¹Ç·Î ÇÊ¿ä ÇÏÁö ¾ÊÀ¸¸é ±ÍÇÏÀÇ Äڵ忡´Â C ·±Å¸ÀÓ ¶óÀ̺귯¸®¸¦°¡Áö°í ÇÏÁö ¾Ê½À´Ï´Ù. Polygon ÄÁÆ®·Ñ ºÎµ¿ ¼Ò¼öÁ¡ ÇÔ¼ö¸¦ ÃʱâÈ ÇÏ´Â C ·±Å¸ÀÓ ¶óÀ̺귯¸® ½ÃÀÛ Äڵ带 ÇÊ¿ä·Î ÇÑ´Ù. µû¶ó¼, ¸±¸®½º ¹öÀüÀ» ±¸Ãà ÇÏ°íÀÚ ÇÏ´Â °æ¿ì _ATL_MIN_CRT ¸ÅÅ©·Î Á¦°Å ÇØ¾ß ÇÕ´Ï´Ù. ¸ÅÅ©·Î Á¦°Å ÇÏ·Á¸é ÇÁ·ÎÁ§Æ® ¸Þ´º¿¡¼ ¼³Á¤ À» Ŭ¸¯ ÇÕ´Ï´Ù. ¿¡ ¿¡ ´ë ÇÑ ¼³Á¤: µå·Ó ´Ù¿î ¸ñ·Ï, ´ÙÁß ±¸¼ºÀ» ¼±Åà ÇÕ´Ï´Ù. ³ªÅ¸³ª´Â ¼öÁ¤ ÇÁ·ÎÁ§Æ® configuration(&s) ¼±Åà ´ëÈ »óÀÚ¿¡¼ ¸ðµç 4 ¸±¸®½º ¹öÀü¿¡ ´ë ÇÑ È®ÀζõÀ» Ŭ¸¯ ÇÑ ´ÙÀ½ È®ÀÎÀ» Ŭ¸¯ ÇÕ´Ï´Ù. C/c + + ÅÇ¿¡¼ ÀÏ¹Ý ¹üÁÖ¸¦ ¼±ÅÃÇÑ ´ÙÀ½ Àü󸮱â Á¤ÀÇ ÆíÁý »óÀÚ¿¡¼ _ATL_MIN_CRT ¸¦ Á¦°ÅÇÕ´Ï´Ù¡£
POINT Çü½ÄÀÇ ¹è¿À» Polyctl.hÀÇ Å¬·¡½º Á¤ÀÇÀÇ ³¡¿¡ Ãß°¡ ÇÏ ¿© Æ÷ÀÎÆ®¸¦ ÀúÀå ÇÏ µÇ ¸é ´Ù°¢Çü Æ÷ÀÎÆ®¸¦ °è»ê ÇÏ´Â:
OLE_COLOR m_clrFillColor;
ªÀº m_nSides;
Æ÷ÀÎÆ® m_arrPoint [100]
ÀÌÁ¦ º¯°æ ÇÕ´Ï´Ù OnDraw
¾Æ·¡¿¡ ¸Â°Ô Polyctl.hÀÇ ±â´É. Âü°í »ç°¢Çü ¹× DrawText ÇÔ¼ö¿¡ ´ë ÇÑ È£ÃâÀ» Á¦°Å ÇÕ´Ï´Ù. ¶ÇÇÑ ¸í½ÃÀûÀ¸·Î ´ç½Å°ú °ËÁ¤ Ææ ¹× Èò»ö ºê·¯½Ã¸¦ ¼±Åà ÇÕ´Ï´Ù. ÄÁÆ®·ÑÀÌ ¾ø´Â ½ÇÇà ÇÏ´Â °æ¿ìÀÌ ÀÛ¾÷À» ¼öÇà ÇØ¾ß ÇÕ´Ï´Ù. ´ç½ÅÀº ±×¸®±â ÀÖÀ» °Å ¾ß ÇÏ´Â ÀåÄ¡ ÄÁÅؽºÆ®¿¡ ´ë ÇÑ °¡Á¤À» ¸¸µé ¼ö ¾ø½À´Ï´Ù ÀÚ½ÅÀÇ Ã¢ ¾ø´Ù¸é¡£
¿Ï·á OnDraw
ÀÌ Ã³·³ º¸ÀÌ´Â:
HRESULT CPolyCtl::OnDraw(ATL_DRAWINFOamp; di)
{
RECT & rc = *(RECT*)di.prcBounds;
HDC hdc = di.hdcDraw;
COLORREF colFore;
HBRUSH hOldBrush, hBrush;
HPEN hOldPen, hPen;
/ / COLORREF Çü½ÄÀ¸·Î m_colFore ¹ø¿ª
OleTranslateColor (m_clrFillColor, NULL, & colFore);
/ / »ý¼º ÇÏ °í µ¿±×¶ó¹Ì ±×¸± »ö»ó ¼±ÅÃ
hPen (HPEN)GetStockObject(BLACK_PEN); =
hOldPen (HPEN) SelectObject (hdc, hPen); =
hBrush (HBRUSH)GetStockObject(WHITE_BRUSH); =
hOldBrush = (HBRUSH) SelectObject (hdc, hBrush);
Ÿ¿ø (hdc, rc.left, rc.top, rc.right, rc.bottom);
/ / ¸¸µé°í ´Ù°¢ÇüÀ» ÀÛ¼º ÇÏ´Â µ¥ »ç¿ë ÇÏ´Â ºê·¯½¬ ¼±ÅÃ
hBrush = CreateSolidBrush(colFore);
SelectObject (hdc, hBrush);
CalcPoints(rc);
´Ù°¢Çü (hdc, & m_arrPoint [0], m_nSides);
/ / ´Ù½Ã ¿¾³¯ Ææ ¹× ºê·¯½Ã¸¦ ¼±Åà ÇÏ °í ¿ì¸®°¡ ¸¸µç ºê·¯½¬ »èÁ¦
SelectObject (hdc, hOldPen);
SelectObject (hdc, hOldBrush);
DeleteObject(hBrush);
return S_OK;
}
ÀÌÁ¦ È£Ã⠵Ǵ ÇÔ¼ö¸¦ Ãß°¡ ÇØ¾ß CalcPoints
, ±× ¼± intersections.nbsp; ÁÂÇ¥ °è»ê ÀÌ·¯ÇÑ °è»ê RECT º¯¼ö¸¦ ÇÔ¼ö¿¡ Àü´Þ µÇ´Â °ÍÀÔ´Ï´Ù.? ¸ÕÀú Polyctl.hÀÇ IPolyCtl Ŭ·¡½ºÀÇ °ø¿ë ¼½¼Ç¿¡ CalcpointsÀÇ Á¤ÀÇ Ãß°¡ Çؾß(&N):
voidnbsp;?? CalcPoints (const RECT & rc)
IPolyCtl Ŭ·¡½ºÀÇ °ø¿ë ¼½¼ÇÀ» Áö±Ý ÀÌ·¸°Ô º¸ÀÏ:
/ / IPolyCtl
°ø°³:
STDMETHOD(get_Sides) (/ * [out, retval] * / ªÀº * newVal);
STDMETHOD(put_Sides) (/ * [¿¡] * / newVal ªÀº);
voidnbsp;?? CalcPoints (const RECT & rc)
´ÙÀ½ÀÇ ±¸ÇöÀ» Ãß°¡ ÇÕ´Ï´Ù CalcPoints
ÇÔ¼ö¸¦ PolyCtl.cpp ÆÄÀÏÀÇ ³¡:
void CPolyCtl::CalcPoints (const RECTamp; rc)
{
const ´õºí pi 3.14159265358979; =
Æ÷ÀÎÆ® ptCenter;
ÀÌÁß dblRadiusx = (rc.right-rc.left) / 2;
ÀÌÁß dblRadiusy = (rc.bottom-rc.top) / 2;
ÀÌÁß dblAngle = 3 * pi / 2;????????? / / »ó´Ü¿¡¼ ½ÃÀÛ
ÀÌÁß dblDiff = 2 * pi / m_nSides;?? / / °¢ °¢µµ »çÀÌµå ¸¸µé °ÍÀÔ´Ï´Ù
ptCenter.x = (rc.left + rc.right) / 2;
ptCenter.y = (rc.top + rc.bottom) / 2;
/ / °¢ Ãø¸é¿¡ ´ë ÇÑ Æ÷ÀÎÆ®¸¦ °è»ê
¿¡ ´ë ÇÑ (int I = 0; ³ < m_nSides; i + +)
{
m_arrPoint [i].x = (±ä) (dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
m_arrPoint [i].y = (±ä) (dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5);
dblAngle + = dblDiff;
}
}
ÀÌÁ¦, ÃʱâÈ m_clrFillColor
. ±âº» »öÀ¸·Î ³ì»öÀ» ¼±Åà ÇÏ °íÀÌ ÁÙÀ» Ãß°¡ ÇÕ´Ï´Ù CPolyCtl
Polyctl.hÀÇ »ý¼ºÀÚ:
m_clrFillColor = RGB (0, 0xFF, 0)
»ý¼ºÀÚ´Â ÀÌÁ¦ÀÌ Ã³·³ º¸ÀÌ´Â:
CPolyCtl()
{
m_nSides = 3;
m_clrFillColor = RGB (0, 0xFF, 0);
}
ÀÌÁ¦ ÄÁÆ®·ÑÀ» ´Ù½Ã ÀÛ¼º ÇÏ °í ´Ù½Ã ½Ãµµ ÇϽʽÿÀ. ActiveX ÄÁÆ®·Ñ Å×½ºÆ® ÄÁÅ×ÀÌ³Ê ¸¦ ¿°í ÄÁÆ®·ÑÀ» »ðÀÔ ÇÕ´Ï´Ù. ¿ø ¾È¿¡ ³ì»ö »ï°¢ÇüÀÌ Ç¥½Ã µË´Ï´Ù. ¾Æ·¡ ´Ü°è¸¦ ¼öÇà ÇÏ ¿© ¸é ¼ö¸¦ º¯°æÇØ º¸½Ê½Ã¿À. Å×½ºÆ® ÄÁÅ×À̳ʳ»¿¡¼ ÀÌÁß ÀÎÅÍÆäÀ̽º¿¡ ´ë ÇÑ ¼Ó¼ºÀ» ¼öÁ¤ ÇÏ·Á¸é ¸Þ¼µå È£Ãâ À» »ç¿ë ÇÏ ¿©:
ÄÁÆ®·Ñ º¯°æ µÇÁö ¾Ê½À´Ï´Ù È®ÀÎ ÇÕ´Ï´Ù. ¹«¾ùÀÌ À߸øµÇ¾ú³ª¿ä? ¼³Á¤ ÇÏ ¿© ³»ºÎÀûÀ¸·Î ¸é ¼ö¸¦ º¯°æ ÇÏ´Â ÀÖÁö¸¸ ÇØ´ç m_nSides
º¯¼ö, ´ç½ÅÀº ´Ù½Ã Ä¥Çϱâ ÄÁÆ®·ÑÀ» ¹ß»ý ÇÏÁö ¾Ê¾Ò´Ù. ´Ù¸¥ ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î Àüȯ ÇÏ °í Å×½ºÆ® ÄÁÅ×ÀÌ³Ê ¸¦ ãÀ» °ÍÀÔ´Ï´Ù ´Ù½Ã Àüȯ ÇÏ´Â °æ¿ì ÄÁÆ®·ÑÀÌ ´Ù½Ã ±×·ÁÁý´Ï´Ù ÀÖ°í Áö±Ý Ãø¸éÀÇ ¿Ã¹Ù¸¥ ¹øÈ£¸¦¡£
ÀÌ ¹®Á¦¸¦ ÇØ°á ÇÏ·Á¸é Ãß°¡ IViewObjectExImpl, ¸é ¼ö¸¦ ¼³Á¤ Çϸé Á¤ÀÇ µÈ FireViewChange ÇÔ¼ö¸¦ È£Ãâ ÇØ¾ß ÇÕ´Ï´Ù. ÄÁÆ®·ÑÀ» ÀÚü â¿¡¼ ½ÇÇà ÇÏ´Â °æ¿ì FireViewChange InvalidateRect API¸¦ Á÷Á¢ È£Ã⠵˴ϴÙ. ÄÁÆ®·ÑÀÌ ¾ø´Â ½ÇÇà ÁßÀÎ InvalidateRect ¸Þ¼µå°¡ ÄÁÅ×À̳ÊÀÇ »çÀÌÆ® ÀÎÅÍÆäÀ̽º¿¡ È£Ã⠵˴ϴÙ. ÀÌ·¸°Ô Çϸé ÀÚü¸¦ ´Ù½Ã ±×¸± ÄÁÆ®·Ñ¡£
»õ·Î¿î put_Sides
¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù.:
STDMETHODIMP CPolyCtl::put_Sides(short newVal)
{
°æ¿ì (newVal gt; 2 & & newVal < 101)
{
m_nSides = newVal;
FireViewChange();
return S_OK;
}
´Ù¸¥
¿À·ù ¹Ýȯ (_T ("µµÇü ÀÖ¾î¾ß 3 À§¿Í 100 »çÀÌ)");
}
FireViewChange¸¦ Ãß°¡ÇÑ ÈÄ¿¡ ´Ù½Ã ÀÛ¼º ÇÏ °í ÄÁÆ®·ÑÀ» ´Ù½Ã ½Ãµµ ÇϽʽÿÀ. Áï½Ã º¯°æ Á¦¾î¸¦ º¼ÀÌ ½Ã°£ÀÌ ¸é ¼ö¸¦ º¯°æ ÇÏ °í InvokeÀ» Ŭ¸¯ÇÕ´Ï´Ù¡£
´ÙÀ½À¸·Î, ÄÁÆ®·Ñ¿¡ À̺¥Æ®¸¦ Ãß°¡ µË´Ï´Ù.
3 ´Ü°è¸¦ ´Ù½Ã |nbsp; 5 ´Ü°è¿¡(&N)