ÀúÀ۱ǿ¡ ´ëÇÑ °øÁö
ÀÌ ¹®¼­¿¡ Æ÷ÇÔµÈ ¸ðµç ±Û°ú ¼Ò½º ÄÚµå´Â ÀÛÀÚÀÎ Àú ±è¼ºµ¿ÀÇ ÁöÀû Àç»êÀÌÁö¸¸ ¹«´ÜÀ¸·Î ¹èÆ÷Çϰųª Ã¥À̳ª °­ÀÇ ±³ÀçµîÀ» À§ÇÑ º¹Á¦ µî ÀúÀÛ±ÇÀ» ÀúÇØÇÏ´Â ÇàÀ§¸¦ Á¦¿ÜÇϰí´Â ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¶ÇÇÑ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÑ ¸µÅ©´Â ÀÚÀ¯·Ó°Ô ÇÒ ¼ö ÀÖÀ¸³ª Àü¹®À» ÀüÁ¦ÇÏ´Â ÀÏÀº Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.


1.8. ¸Þ½ÃÁö ó¸®

1.8.1. °³¿ä
À©µµ°¡ À̺¥Æ® ÁöÇâ, ¸Þ½ÃÁö ±â¹Ý ¿î¿µÃ¼Á¦¶ó´Â »ç½ÇÀº À©µµ ÇÁ·Î±×·¥À» ÇѹøÀÌ¶óµµ °øºÎÇØ º» »ç¶÷Àº ÀÍÈ÷ µé¾î ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ¸Þ½ÃÁö´Â ¸¶¿ì½º¸¦ ¿òÁ÷ÀδٵçÁö Űº¸µå·Î ÀÔ·ÂÇÏ´Â µîÀÇ »ç°ÇÀ̳ª À©µµ Å©±â°¡ º¯°æµÇ¾ú´ÙµçÁö ½Ã½ºÅÛ »öÀ» º¯°æÇß´ÙµçÁö ÇÏ´Â »óÅ º¯È­µî¿¡ ÀÇÇØ¼­ ¹ß»ýÇÑ´Ù. ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé À©µµ´Â µÎ °¡Áö ¹æ¹ýÀ¸·Î ¸Þ½ÃÁö¸¦ Àü´ÞÇϴµ¥ ù¹øÂ°·Î °¢ ¾îÇø®ÄÉÀ̼Ǹ¶´Ù °¡Áö°í ÀÖ´Â ¸Þ½ÃÁö Å¥¿¡ ¸Þ½ÃÁö¸¦ Ãß°¡ÇÏ´Â ¹æ¹ýÀÌ ÀÖ°í µÎ¹øÂ°·Î ºü¸¥ 󸮸¦ À§ÇØ ¾îÇø®ÄÉÀ̼ÇÀÇ À©µµ ÇÁ·Î½ÃÀú¿¡ Á÷Á¢ ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.

±×¸² 1-14 À©µµ ¸Þ½ÃÁö Àü´Þ È帧


¸Þ½ÃÁö Å¥´Â FIFO(First In/First Out)±¸Á¶·Î µ¿ÀÛÇϸç Àӽ÷Π¸Þ½ÃÁö¸¦ ÀúÀåÇÑ´Ù. ¾îÇø®ÄÉÀ̼ÇÀÇ ¸Þ½ÃÁö Å¥¿¡ ÀúÀåµÈ ¸Þ½ÃÁö´Â ¾îÇø®ÄÉÀ̼ÇÀÇ WinMain ÇÔ¼ö¿¡¼­ Å¥¿¡ ÀúÀåµÈ ¼ø¼­´ë·Î 󸮵Ǵµ¥ WinMain ÇÔ¼ö´Â Áö¼ÓÀûÀ¸·Î Å¥¸¦ °Ë»çÇØ¼­ ¸Þ½ÃÁö°¡ ÀÖÀ¸¸é ÀûÀýÇÑ À©µµ¿¡ ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ°í ±× ¸Þ½ÃÁö¸¦ ¸Þ½ÃÁö Å¥¿¡¼­ »èÁ¦ÇÏ¸ç ¸Þ½ÃÁö Å¥¿¡ WM_QUIT ¸Þ½ÃÁö°¡ µé¾î¿Ã ¶§±îÁö ÀÌ·± ÀÛ¾÷À» ¹Ýº¹ÇÑ´Ù.
¾îÇø®ÄÉÀ̼ÇÀÇ °¢ À©µµ(Æ÷Ä¿½º¸¦ °¡Áú ¼ö ÀÖ´Â °¢Á¾ ÄÜÆ®·Ñµµ Æ÷ÇԵȴÙ.)´Â ¸Þ½ÃÁö¸¦ ½ÇÁ¦·Î ó¸®ÇØ ÁÖ´Â À©µµ ÇÁ·Î½ÃÀú¶ó´Â °ÍÀ» °¡Áö°í ÀÖ´Ù. RegisterClass³ª RegisterClassEx API¸¦ ÀÌ¿ëÇØ¼­ À©µµ Ŭ·¡½º¸¦(Window Class)¸¦ µî·ÏÇÒ ¶§ À©µµ ÇÁ·Î½ÃÀú¸¦ ÁöÁ¤ÇÏ°Ô µÇ¾î ÀÖ°í CreateWindowExµîÀÇ API·Î µî·ÏÇÑ À©µµ Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÏ¸é ±× À©µµÀÇ ¸Þ½ÃÁö´Â µî·ÏÇÒ ¶§ ÁöÁ¤ÇÑ À©µµ ÇÁ·Î½ÃÀú¿¡°Ô º¸³»Áø´Ù. À©µµ ÇÁ·Î½ÃÀú´Â ³× °³ÀÇ ÀÎÀÚ¸¦ °¡Áö´Â ÇÔ¼ö·Î ¼±¾ðÇÏ¸ç º¸Åë case ¹®À» »ç¿ëÇØ¼­ ±¸ÇöÇÑ´Ù.
¾Æ·¡ ÄÚµå´Â À©µµ ÇÁ·Î½ÃÀúÀÇ ´ëÇ¥ÀûÀÎ ¿¹ÀÌ´Ù.

function WndProc(hWnd : THandle; nMsg : UINT; wParam, lParam : Cardinal) : Cardinal; export; stdcall;
begin
  Result := 0;
  case nMsg of
    WM_LBUTTONDOWN :
      begin
        { »ý·« }
      end;
    WM_LBUTTONUP :
      begin
        { »ý·« }
      end;
    WM_MOUSEMOVE :
      begin
        { »ý·« }
      end;
    WM_SIZE :
      begin
        { »ý·« }
      end;
  else
    DefWindowProc(hWnd, nMsg, wParam, lParam);  
  end;
end;


À©µµ ÇÁ·Î½ÃÀúÀÇ Ã¹¹øÂ° ÀÎÀÚÀÎ hWnd´Â ¸Þ½ÃÁö¸¦ ¹Þ´Â À©µµÀÇ ÇÚµéÀ» ³ªÅ¸³»¸ç µÎ¹øÂ° ÀÎÀÚ nMsg´Â ó¸®ÇÒ ¸Þ½ÃÁö¸¦ ³ªÅ¸³»¸ç Messages.pas À¯´Ö¿¡ Á¤ÀǵǾî ÀÖ´Ù. ¼¼¹øÂ°, ³×¹øÂ° ÀÎÀÚÀÎ wParam°ú lParamÀº nMsg¿¡ ¾î¶² ¸Þ½ÃÁö°¡ µé¾î ¿À´À³Ä¿¡ µû¶ó ´Ù¸¥ Àǹ̸¦ °¡Áø´Ù. ¿¹·Î nMsg°¡ WM_LBUTTONDOWN ¸Þ½ÃÁöÀÇ °æ¿ì wParam Àº ´­·ÁÁø Ű¿¡ ´ëÇÑ °¡»ó Äڵ尡 ³Ñ¾î¿À°í lParam¿¡´Â ÇöÀç ¸¶¿ì½º Æ÷ÀÎÅÍÀÇ À§Ä¡°¡ ³Ñ¾î ¿Â´Ù. WM_SIZEÀÎ °æ¿ì¿¡´Â wParam¿¡ SIZE_MAXIMIZED, SIZE_MINIMIZED µîÀÇ Å©±â Á¶Àý ŸÀÔÀÌ ³Ñ¾î¿À¸ç lParam¿¡´Â À©µµ Å©±â°¡ ³Ñ¾î ¿Â´Ù. µ¨ÆÄÀÌ¿¡¼­´Â °¢ ¸Þ½ÃÁö¿¡ µû¶ó wParam°ú lParamÀÇ Àǹ̸¦ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï messages.pas À¯´Ö¿¡ °¢°¢ÀÇ ¸Þ½ÃÁö¿¡ ´ëÇØ º°µµ·Î ±¸Á¶Ã¼¸¦ Á¤ÀÇÇØ ³õ¾Ò´Ù. ¸¶¿ì½º °ü·Ã ¸Þ½ÃÁöÀÎ °æ¿ì TWMMouse ±¸Á¶Ã¼¸¦ »ç¿ëÇϴµ¥ ¾Æ·¡¿Í °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

TWMMouse = packed record
    Msg: Cardinal;
    Keys: Longint;
    case Integer of
      0: (
        XPos: Smallint;
        YPos: Smallint);
      1: (
        Pos: TSmallPoint;
        Result: Longint);
  end;


Ưº°È÷ ±¸Á¶Ã¼¸¦ Á¤ÀÇÇØ ³õÁö ¾ÊÀº ¸Þ½ÃÁöÀÇ °æ¿ì¿¡´Â ¾Æ·¡¿Í °°ÀÌ TMessage ±¸Á¶Ã¼¸¦ »ç¿ëÇÑ´Ù.

PMessage = ^TMessage;
  TMessage = packed record
    Msg: Cardinal;
    case Integer of
      0: (
        WParam: Longint;
        LParam: Longint;
        Result: Longint);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
  end;


1.8.2. À©µµ ¸Þ½ÃÁö
À§¿¡¼­ ¼³¸íÇÑ À©µµ ¸Þ½ÃÁö ó¸® ¹æ¹ýÀº µ¨ÆÄÀÌ¿¡¼­´Â ½ÇÁ¦·Î °ÅÀÇ ¾²ÀÌÁö ¾Ê´Â´Ù. ó¸®ÇØ¾ß ÇÒ ¸Þ½ÃÁö°¡ ¸¹Àº °æ¿ì À©µµ ÇÁ·Î½ÃÀúÀÇ Å©±â°¡ Ä¿Áö°í º¹ÀâÇØÁ®¼­ Äڵ带 °ü¸®ÇϱⰡ »ó´çÈ÷ ÈûÀÌ µé±â ¶§¹®¿¡ µ¨ÆÄÀÌ¿¡¼­´Â »ç¿ëÇϱ⠽±°Ô ¸Þ½ÃÁö Çڵ鷯 ¸Þ¼Òµå¶ó´Â °³³äÀ» ¸¸µé¾î ³õ¾Ò´Ù. ½ÇÁ¦·Î ¾Õ¿¡¼­ ¼³¸íÇÑ °¡»ó ¸Þ¼Òµå¿Í À¯»çÇѵ¥ virtual Áö½ÃÀÚ ´ë½Å¿¡ message Áö½ÃÀÚ¸¦ »ç¿ëÇÑ´Ù.

procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
procedure WMChar(var Message: TWMChar); message WM_CHAR;


¸Þ½ÃÁö Çڵ鷯 ¸Þ¼Òµå´Â À§¿Í °°ÀÌ ¼±¾ðÇϴµ¥ ¹Ýµå½Ã ÇÁ·Î½ÃÀú·Î ¼±¾ðÇØ¾ß Çϸç À̸§Àº ÀϹÝÀûÀ¸·Î À§ÀÇ ¿¹Ã³·³ ó¸®ÇÏ´Â ¸Þ½ÃÁö°¡ ¹«¾ùÀÎÁö ¾Ë ¼ö ÀÖµµ·Ï ÇÏÁö¸¸ ¾Æ¹«·¸°Ô³ª À̸§À» Áö¾îµµ »ó°ü¾ø´Ù. ±×¸®°í ÇϳªÀÇ ÀÎÀÚ¸¦ °¡Áö´Âµ¥ ¹Ýµå½Ã var ÇüÀ¸·Î ¼±¾ðÇØ¾ß ÇÏ¸ç ¸¶Áö¸·¿¡ message Áö½ÃÀÚ¿Í Ã³¸®ÇÒ ¸Þ½ÃÁö¸¦ ½á ÁØ´Ù.
ÀÌ·¸°Ô ó¸®ÇϰíÀÚ ÇÏ´Â ¸Þ½ÃÁö¿¡ ´ëÇØ ¸Þ½ÃÁö Çڵ鷯 ¸Þ¼Òµå¸¦ ¼±¾ðÇØ ÁÖ¸é ¸Þ½ÃÁö°¡ µµÂøÇÒ ¶§ ¸¶´Ù ÇØ´ç ¸Þ½ÃÁö Çڵ鷯¸¦ È£ÃâÇØ ÁØ´Ù. ±×·±µ¥ ¾Õ¿¡¼­ ¾ê±âÇÑ ¸Þ½ÃÁö Å¥Çϰí´Â °³³äÀÌ ¿ÏÀüÈ÷ ´Ù¸¥ °Í °°´Ù. ¾î¶»°Ô ÀÌ·¸°Ô 󸮰¡ µÉ±î? Controls.pas¸¦ ¿­¾î¼­ TControlÀ» ¼±¾ðÇÑ °÷À¸·Î °¡¼­ ÂùÂùÈ÷ »ìÆì º¸¸é WndProcÀ̶ó´Â °¡»ó ¸Þ¼Òµå°¡ Á¤ÀǵǾî ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ±×¸®°í WndProc ¸Þ¼Òµå´Â ¾Æ·¡¿Í °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

TControl = class(TComponent)
  protected
    { »ý·« }
    procedure WndProc(var Message: TMessage); virtual;
    { »ý·« }
  end;

{ »ý·« }

procedure TControl.WndProc(var Message: TMessage);
var
  Form: TCustomForm;
begin
  if (csDesigning in ComponentState) then
  begin
    { »ý·« }
  end
  else if (Message.Msg >= WM_KEYFIRST) and (Message.Msg <= WM_KEYLAST) then
  begin
    { »ý·« }
  end
  else if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then
  begin
    { »ý·« }
  end
  else if Message.Msg = CM_VISIBLECHANGED then
    with Message do
      SendDockNotification(Msg, WParam, LParam);
  Dispatch(Message);
end;


WndProc ¸Þ¼Òµå´Â ¸¶Áö¸·¿¡ TObject Ŭ·¡½º¿¡ Á¤ÀÇµÈ Dispatch ¸Þ¼Òµå¸¦ È£ÃâÇϰí ÀÖ´Â °ÍÀ» º¼ ¼ö Àִµ¥ Dispatch ¸Þ¼Òµå´Â message Áö½ÃÀÚ·Î ¼±¾ðÇØ¼­ °´Ã¼ÀÇ ¸Þ¼Òµå Å×ÀÌºí¿¡ Ãß°¡µÈ ¸Þ½ÃÁö Çڵ鷯 Áß¿¡¼­ Message ÀÎÀÚÀÇ Msg Çʵå¿Í ¿¬°áµÈ ¸Þ½ÃÁö Çڵ鷯°¡ ÀÖ´ÂÁö °Ë»çÇØ¼­ ÀÖ´Ù¸é ±× ¸Þ½ÃÁö Çڵ鷯¸¦ È£ÃâÇØ ÁÖ°í ¾øÀ¸¸é DefaultHandler¸¦ È£ÃâÇØ ÁÖµµ·Ï µÇ¾î ÀÖ´Ù.

1.9. ¿ä¾à

Áö±Ý±îÁö ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¶§ ÇÊ¿äÇÑ ¿©·¯°¡Áö °³³ä°ú ¿ø¸®¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸¾Ò´Ù. ÀÌ Àå¿¡¼­ »ìÆì º» ³»¿ëÀº ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÔ¿¡ ÀÖ¾î Åä´ë°¡ µÇ´Â °³³äÀ̹ǷΠÀß ¼÷ÁöÇϰí ÀÖ¾î¾ß ÇÑ´Ù. ¿©±â¼­ ¼³¸íÇÑ ³»¿ë À̿ܿ¡µµ À©µµ ½Ã½ºÅÛÀÇ ÀüÅëÀûÀÎ ÇÁ·Î±×·¡¹Ö ¹æ¹ý°ú ±âº»ÀûÀÎ ¿ø¸®, ¿¹¸¦ µé¾î ±Û²Ã, GDI, ¸®¼Ò½º, ½Ã½ºÅÛ ¸Þ½ÃÁö, ½Ã½ºÅÛ API µî¿¡ ´ëÇØ¼­µµ ¾Ë¾Æ µÎ¸é ¸¹Àº µµ¿òÀÌ µÉ °ÍÀÌ´Ù.
´ÙÀ½ Àå¿¡¼­´Â À̹ø Àå¿¡¼­ ¼³¸íÇÑ °³³äµéÀÌ ¾î¶»°Ô ½ÇÁ¦·Î Àû¿ëµÇ´ÂÁö ¿©·¯ °¡Áö ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇØ º¸¸é¼­ ÀÚ¼¼ÇÏ°Ô ¾Ë¾Æ º¸µµ·Ï ÇϰڴÙ.


ÀúÀ۱ǿ¡ ´ëÇÑ °øÁö
ÀÌ ¹®¼­¿¡ Æ÷ÇÔµÈ ¸ðµç ±Û°ú ¼Ò½º ÄÚµå´Â ÀÛÀÚÀÎ Àú ±è¼ºµ¿ÀÇ ÁöÀû Àç»êÀÌÁö¸¸ ¹«´ÜÀ¸·Î ¹èÆ÷Çϰųª Ã¥À̳ª °­ÀÇ ±³ÀçµîÀ» À§ÇÑ º¹Á¦ µî ÀúÀÛ±ÇÀ» ÀúÇØÇÏ´Â ÇàÀ§¸¦ Á¦¿ÜÇϰí´Â ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¶ÇÇÑ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÑ ¸µÅ©´Â ÀÚÀ¯·Ó°Ô ÇÒ ¼ö ÀÖÀ¸³ª Àü¹®À» ÀüÁ¦ÇÏ´Â ÀÏÀº Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.