<LRESULT¿Í CALLBACKÀÇ µ¥ÀÌÅÍÇü¿¡ °üÇØ>

 À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ º¸¸é LRESULT¿Í CALLBACKÀ̶ó´Â µ¥ÀÌÅÍÇüÀÌ ÀÖ½À´Ï´Ù. Ã¥¿¡¼­ º¸¸é LRESULT´Â À©µµ¿ì ÇÁ·Î½ÃÀú¿¡¼­ ¹ÝȯµÇ´Â µ¥ÀÌÅÍÇüÀÌ°í CALLBACKÀº FAR PASCALÀ» ÀçÁ¤ÀÇÇÑ °ÍÀ¸·Î Äݹé·çƾÀ̳ª ÇÁ·Î½ÃÀú¿¡¼­ »ç¿ëÇÑ´Ù°í ³ª¿Í ÀÖ´õ±º¿ä. LRESULT´Â À©µµ¿ì ÇÁ·Î½ÃÀú¿¡¼­ ¹ÝȯµÇ´Â µ¥ÀÌÅÍÇüÀ̶ó°í Çϴµ¥ ¹«¾ùÀ» ¹ÝȯÇÏ´Â °ÍÀÎÁö ±Ã±ÝÇÕ´Ï´Ù. ¶ÇÇÑ CALLBACK¿¡¼­´Â FAR PASCALÇüÀÌ ¹«¾ùÀÌ°í Äݹé·çƾÀº ¹«¾ùÀ» ¸»ÇÏ´Â °ÍÀÎÁö, Ȥ½Ã ¿î¿µÃ¼Á¦°¡ ÇÊ¿ä¿¡ ÀÇÇØ È£ÃâÇÏ´Â °ÍÀ» ¸»ÇÏ´ÂÁö »ç¿ë¿¹¸¦ ÅëÇØ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇØ ÁÖ¼¼¿ä.

 ¸ÕÀú LRESULT¿¡ ´ëÇØ ¸»ÇØ º¸¸é LRESULT´Â ºñÁÖ¾ó C++¿¡¼­ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÅ ÀÖ½À´Ï´Ù.

#define LRESULT LONG

 Áï LRESULT´Â long º¯¼öÀÇ ´Ù¸¥ À̸§ÀÏ »ÓÀÔ´Ï´Ù. longÀ̶ó´Â ¸®ÅÏ°ªÀ» ¾²Áö ¾Ê°í ±»ÀÌ LRESULT¶ó°í Àç¼±¾ðÇÑ °ÍÀº ÀÌ °ªÀÌ ¸®ÅÏ°ªÀÓÀ» Á»´õ ¸íÈ®È÷ ³ªÅ¸³»±â À§ÇÑ ÇÁ·Î±×·¡¸ÓÀÇ Àǵµ¶ó »ý°¢ÇÏ¸é µË´Ï´Ù. °á±¹ LRESULT·Î ¹ÝȯµÇ´Â °ªÀº long°ªÀ̶ó »ý°¢ÇÏ¸é µÇ´Âµ¥ ±×·¸´Ù°í Çؼ­ ²À ¼ýÀÚÀÏ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. longÀº 4 ¹ÙÀÌÆ® º¯¼öÀ̹ǷΠLRESULT¿¡ Æ÷ÀÎÅ͸¦ ij½ºÆÃÇؼ­ ¹ÝȯÇصµ ¹«°üÇÕ´Ï´Ù. Æ÷ÀÎÅÍ ¿ª½Ã 4¹ÙÀÌÆ®ÀÇ º¯¼öÀÏ »ÓÀ̴ϱî¿ä. ´ëºÎºÐÀÇ À©µµ¿ì ÇÁ·Î±×·¥¿¡¼­´Â LRESULT °ªÀ¸·Î °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â °ÍÀ» ÀÚÁÖ º¼ ¼ö ÀÖÀ» °Ì´Ï´Ù.

 CALLBACKÀº FAR PASCALÀÇ ´Ù¸¥ À̸§ÀÔ´Ï´Ù. FAR¶ó´Â °ÍÀº ¿ø°Å¸® Æ÷ÀÎÅÍÀÓÀ» ³ªÅ¸³»´Â °ÍÀÌ°í PASCALÀ̶ó´Â °ÍÀº ÇÔ¼ö È£Ãâ±Ô¾àÀ» ³ªÅ¸³»´Â °ÍÀÔ´Ï´Ù. ÇÁ·Î±×·¡¹Ö ³»¿¡¼­ ÇÔ¼öÈ£ÃâÀ̶ó´Â °ÍÀº ±× ÇÔ¼öÀÇ ½ÃÀÛÆ÷ÀÎÅÍ·Î Á¡ÇÁÇÏ´Â °ÍÀ» ÀǹÌÇÏ°í, ¶Ç À©µµ¿ì¿¡¼­´Â °¡»ó ¸Þ¸ð¸® ÁÖ¼Ò¸¦ »ç¿ëÇϹǷΠ´ëºÎºÐÀÇ ÇÔ¼ö ÁøÀԺΰ¡ ¿ø°Å¸® Æ÷ÀÎÅͶó´Â ¶æÀÔ´Ï´Ù.

 ÇÏÁö¸¸ À©µµ¿ì 95À̻󿡼­´Â ¿ø°Å¸® Æ÷ÀÎÅÍ¿Í ±Ù°Å¸® Æ÷ÀÎÅÍÀÇ ±¸ºÐÀÌ ¾øÀ¸¹Ç·Î FAR¶ó´Â °ÍÀº ¹«½ÃÇصµ »ó°ü¾ø½À´Ï´Ù. PASCAL È£Ãâ±Ô¾àÀ̶ó´Â °ÍÀº ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ³Ñ°ÜÁö´Â ÀÎÀÚ°¡ ½ºÅÿ¡ ¾î¶°ÇÑ ¼ø¼­·Î ½×ÀÏÁö¿¡ ´ëÇÑ ¾à¼ÓÀÔ´Ï´Ù. C¿¡¼­´Â ÀÎÀÚ¸¦ ¿ÞÂÊ¿¡¼­ºÎÅÍ ¿À¸¥ÂÊÀ¸·Î Â÷·Ê·Î ÀÎÀÚ °ªÀ» ½ºÅÿ¡ ³Ö¾î ³Ñ°ÜÁÖ°í ÇÔ¼ö¿¡ ÁøÀÔÇϸé ÀÌ¿Í´Â ¹Ý´ë¼ø¼­·Î ½ºÅÿ¡¼­ ±× °ªÀ» ¹Þ¾Æ¿Í »ç¿ëÇÕ´Ï´Ù. ÇÏÁö¸¸ C++¿¡¼­´Â ÀÌ¿Í ¹Ý´ëÀÇ ¼ø¼­·Î ½ºÅÿ¡ ÀÎÀÚ¸¦ ³Ö¾î »ç¿ëÇÏ°Ô µË´Ï´Ù. ¶ÇÇÑ PASCAL È£Ãâ±Ô¾àÀº ÇÔ¼ö¸¦ È£ÃâÇϸé ÀÌÀü¿¡ »ç¿ëµÇ´ø º¯¼öÀÇ °ª ax, bx, cx µîÀÇ °ªÀ» ¸ÕÀú ½ºÅÿ¡ ³Ö¾îµÎ¾ú´Ù°¡ ÇÔ¼ö°¡ ¸®ÅϵDZâ Àü¿¡ ÀÌ °ªÀ» º¹¿ø½ÃÄÑÁÖÁö¸¸ C¿¡¼­´Â ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü ÀÌ·¯ÇÑ ÀϵéÀ» ÇÏ°í ÇÔ¼ö°¡ ³¡³ª¼­ ÀÌÀüÀÇ ½ºÅÜÀ¸·Î µ¹¾Æ¿À¸é ±×Á¦¼­¾ß º¯¼ö°ªÀ» º¹¿øÇÏ´Â ÀÏÀ» ÇÕ´Ï´Ù.

 ÀÌ·¯ÇÑ °ÍÀÌ ¹Ù·Î FAR PASCALÀÌ ÀǹÌÇÏ´Â °ÍÀÌ°í ÀÌ°ÍÀ» CALLBACKÀ̶ó°í ¼±¾ðÇØ »ç¿ëÇÏ´Â °ÍÀº ÀÌ ÇÔ¼ö°¡ ÄݹéÇÔ¼ö·Î »ç¿ëµÊÀ» ÇÁ·Î±×·¡¸Ó°¡ ¸í½ÃÇϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. Áï ÀÚ½ÅÀÌ Â§ ÀÌ ÇÔ¼ö´Â À©µµ¿ì¿¡¼­ CALLBACKµÇ¾î ºÒ¸®¾îÁö´Â ÇÔ¼ö¶ó´Â °ÍÀ» ÀÚ½ÅÀ̳ª, ´Ù¸¥ »ç¶÷ÀÌ ºÁ¼­ ±Ý¹æ ¾Ë ¼ö ÀÖµµ·Ï ÀÌ·¸°Ô À̸§ ºÙ¿©³õÀº °ÍÀÔ´Ï´Ù. ÀÌ µÎ °¡Áö ¸ðµÎ »ç¿ë ¿ëµµ¸¦ ¸íÈ®È÷ ÇÏ´Â ¿ªÇÒÀ» ÇÒ »Ó ´Ù¸¥ °Í°úÀÇ Â÷ÀÌÁ¡Àº ¾ø´Âµ¥, ÀÌ·¸°Ô »ç¿ëÇÏ´Â ÀÌÀ¯´Â À©µµ¿ì ÇÁ·Î±×·¥ÀÇ Å©±â°¡ ¿¹Àü¿¡ ºñÇØ ¹«Ã´ Ä¿Á®°¡°í ÀÛ¾÷µµ ¿©·¯ »ç¶÷ÀÌ °°ÀÌ ÇÏ´Â °æ¿ì°¡ ¸¹¾Æ ¼­·ÎÀÇ Àǵµ¸¦ ´Ù¸¥ »ç¶÷¿¡°Ô ¸íÈ®ÇÏ°Ô ¼³¸íÇÏ°íÀÚ ÇÏ´Â Á¦ÀÛÀÚÀÇ Àǵµ°¡ µé¾îÀÖ´Ù°í º¸¸é µË´Ï´Ù.

 

<MDI¿¡¼­ Child View Handle ±¸ÇÏ´Â ¹æ¹ý>

MDI·Î ÇÁ·Î±×·¥À» ¸¸µé°í Àִµ¥ µÎ °³ÀÇ Ã¢À» ¶ç¿ì°í °¢°¢ÀÇ ºäÀÇ ÇÚµéÀ» ¾Ë°í ½ÍÀºµ¥ ¹æ¹ýÀ» ¸ð¸£°Ú½À´Ï´Ù.

MDI¿¡¼­ ÇöÀç ¶°ÀÖ´Â ºäÀÇ ÇÚµéÀ» ±¸ÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°ÀÌ ¿©·¯ °¡ÁöÀÏ ¼ö ÀÖ½À´Ï´Ù.

[1] CWinAppÀÇ Æ÷ÀÎÅ͸¦ ±¸ÇÑ´Ù.
[2] ÇöÀçÀÇ µµÅ¥¸ÕÆ® ÅÛÇø´À¸·ÎºÎÅÍ CDocumentÀÇ ¸®½ºÆ®¿¡ Á¢±ÙÇÑ´Ù.
[3] ÇöÀç ¹­¿©ÀÖ´Â µµÅ¥¸ÕÆ® ¸®½ºÆ®·ÎºÎÅÍ Â÷·Ê·Î µµÅ¥¸ÕÆ® Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù.
[4] °¢°¢ÀÇ µµÅ¥¸ÕÆ®¿¡´Â Çϳª ÀÌ»óÀÇ ºä°¡ Á¸ÀçÇϹǷΠÀ̸¦ ±¸ÇÑ´Ù.

CMainFrame::GetViewPtr()
{
     // CWinAppÀÇ Æ÷ÀÎÅ͸¦ ±¸ÇÑ´Ù.
     CTestApp* pApp = (CAddApp*)AfxGetApp();
     // ÇöÀçÀÇ µµÅ¥¸ÕÆ® ÅÛÇø´À¸·ÎºÎÅÍ µµÅ¥¸ÕÆ® ¸®½ºÆ®¿¡¼­ ù° µµÅ¥¸ÕÆ®ÀÇ À§Ä¡¸¦ ±¸ÇÑ´Ù.
     POSITION pos = pApp->m_pDocTemplate->GetFirstDocPosition();
     CTestDoc* pDoc;

     CTestView* pView;
     POSITION posView;
     while( pos != NULL ) {
          // GetNextDoc()À» ¼öÇàÇÏ¸ç µµÅ¥¸ÕÆ® ¸®½ºÆ®¿¡¼­ µµÅ¥¸ÕÆ® Æ÷ÀÎÅ͸¦ ±¸ÇÑ´Ù.
          pDoc = (CAddDoc*)pApp->m_pDocTemplate->GetNextDoc( pos );
          // ±¸ÇØÁø µµÅ¥¸ÕÆ® Æ÷ÀÎÅÍ¿¡¼­ ÇöÀç µµÅ¥¸ÕÆ®¿Í ¿¬°üµÅ ÀÖ´Â ºä Æ÷ÀÎÅ͸¦ ±¸ÇÑ´Ù.
          // ÇϳªÀÇ µµÅ¥¸ÕÆ®¿¡ ÇϳªÀÇ ºä°¡ Á¸ÀçÇÑ´Ù°í °¡Á¤
          posView = pDoc->GetFirstViewPosition();
          pView = (CAddView*)pDoc->GetNextView( posView );
     }
}

 ÀÌ¿Í °°´Ù¸é ÇöÀç ¶° Àִ âÀÇ ºä Æ÷ÀÎÅ͸¦ ¸ðµÎ ¾òÀ» ¼ö ÀÖÀ» °Ì´Ï´Ù. ¾Õ¿¡¼­ GetNextDoc()Àº ÇöÀç(¸®½ºÆ®ÀÇ À§Ä¡)ÀÇ µµÅ¥¸ÕÆ® Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ ÈÄ¿¡ pos°ªÀ» ´ÙÀ½ µµÅ¥¸ÕÆ® Æ÷ÀÎÅÍÀÇ À§Ä¡·Î ¹Ù²ß´Ï´Ù. µû¶ó¼­ ¸¶Áö¸· µµÅ¥¸ÕÆ® Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ ÈÄ¿¡´Â ´õ ÀÌ»ó ¾øÀ¸¹Ç·Î pos °ªÀ» NULL·Î ¼³Á¤ÇÕ´Ï´Ù. ±×·¯¸é ·çÇÁ¸¦ ºüÁ®³ª¿À°Ô µÇ°í ÇöÀç ¶°ÀÖ´Â ¸ðµç µµÅ¥¸ÕÆ®¿Í ±×¿¡ µû¸¥ ºä Æ÷ÀÎÅÍ ¹× ÇÚµéÀ» ±¸ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

 

<I/O Æ÷Æ® Á¦¾î¹ý>

C¿¡¼­ »ç¿ëÇÏ´Â inport, outport ¸í·ÉÀ» ºñÁÖ¾ó C++¿¡¼­ ±¸ÇöÇϴ¹æ¹ýÀ» ¾Ë°í ½Í½À´Ï´Ù. ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

<conio.h>¸¦ º¸¸é _inp(), _inpw(), _inpd(), _outp(), _outpw(), _outpd() ¶ó´Â ¶óÀ̺귯¸® ÇÔ¼ö°¡ Àִµ¥, À̸¦ ÀÌ¿ëÇÏ¸é ºñÁÖ¾ó C++¿¡¼­ ÇØ´ç Æ÷Æ® µ¥ÀÌÅ͸¦ Àаųª ÇØ´çÆ÷Æ®¿¡ µ¥ÀÌÅ͸¦ ¾µ ¼ö ÀÖ½À´Ï´Ù. _inp() ´Â 1¹ÙÀÌÆ®ÀÇ µ¥ÀÌÅ͸¦ Æ÷Æ®·ÎºÎÅÍ °¡Á®¿À´Â °ÍÀÌ°í, _inpw() ´Â 2¹ÙÀÌÆ®, _inpd() ´Â 4¹ÙÀÌÆ®ÀÇ µ¥ÀÌÅ͸¦ °¡Á®¿À´Â ÇÔ¼öµéÀÔ´Ï´Ù. _outp() °è¿­ÀÇ ÇÔ¼ö´Â ÇØ´ç ¹ÙÀÌÆ®¸¸Å­ ÇØ´ç Æ÷Æ®¿¡ ¾²±â(Write)¸¦ ÇÏ´Â °ÍÀÔ´Ï´Ù.

BYTE byteData = _inp( 0x3f8 );

 ÀÌ¿Í °°´Ù¸é 0x3f8(COM1 address)¹øÁö¿¡¼­ 1¹ÙÀÌÆ®ÀÇ µ¥ÀÌÅ͸¦ °¡Á®¿À´Â °ÍÀÌ°í,

_outp( 0x3f8, byteData );

ÀÌ¿Í °°´Ù¸é 0x3f8 ¹øÁö¿¡ 1¹ÙÀÌÆ®ÀÇ µ¥ÀÌÅ͸¦ ¾²°Ô µË´Ï´Ù.

 

<ŸÀÌƲ ¹Ù¿¡ ºñÆ®¸Ê ÀÔÈ÷±â>

ŸÀÌƲ ¹Ù¸¦ Á¦°¡ ¸¸µç ºñÆ®¸Ê ±×¸²À¸·Î ¿¹»Ú°Ô ¹Ù²Ù°í ½ÍÀºµ¥ ¾î¶»°Ô ÇØ¾ß ÇÏ´ÂÁö ±Ã±ÝÇÕ´Ï´Ù. ÀÌ¿Í ÇÔ²² ÃÖ¼ÒÈ­³ª ÃÖ´ëÈ­, ´Ý±â ¹öÆ°µµ ºñÆ®¸ÊÀ¸·Î ¹Ù²Ù°í ½ÍÀºµ¥ ¾î¶»°Ô ÇØ¾ß Çմϱî?

 Ä¸¼Ç ¹Ù¸¦ ¾ø¾Ö°í ±× ºÎºÐÀ» À§Ä¡ °ª°ú ºñÆ®¸Ê ¹öÆ° µîÀ» ÀÌ¿ëÇØ ´Ý±â, ÃÖ¼ÒÈ­, ÃÖ´ëÈ­ ¹öÆ°µéÀ» ¸¸µé¾î ÁÝ´Ï´Ù. ´ÙÀ̾ó·Î±×¸¦ ¿òÁ÷ÀÏ ¶§ ÀÏÁ¤ À§Ä¡¿¡¼­ ¸¶¿ì½º°¡ µÉ ¶§ ¿òÁ÷ÀÌ°Ô ÇÏ¸é µË´Ï´Ù. ½±°Ô ¸»Çϸé ĸ¼Ç ¹Ù¸¦ ¸¸µé¾î ÁÖ´Â ¼ÀÀÌÁö¿ä. ±×¸®°í ĸ¼Ç ¹ÙÀÇ ÁÖ ±â´ÉÀÎ Àâ°í ¿òÁ÷ÀÌ´Â °ÍÀº ´ÙÀ½¿¡¼­ ¼Ò°³ÇÏ´Â ¼Ò½º(3ºÎºÐ)¸¦ Âü°íÇϱ⠹ٶø´Ï´Ù. ´ÙÀ̾ó·Î±× ¾Æ¹« °÷À̳ª Àâ¾Æµµ âÀ» ¿òÁ÷ÀÏ ¼ö ÀÖ´Â ¼Ò½ºÀÔ´Ï´Ù.

void CDragDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
     CDialog::OnLButtonDown(nFlags, point);
     // fake windows into thinking your clicking on the caption, does not
     // maximizeon double click
     PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}


     // Generated message map function
     //{{AFX_MSG(CDragDlgDlg)
     virtual BOOL OnInitDialog();
     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
     afx_msg void OnPaint();
     afx_msg HCURSOR OnQueryDragIcon();
     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
     //}}AFX_MSG

     afx_msg UINT OnNcHitTest( CPoint point );  // <- ¿©±â¿¡ Ãß°¡

     DECLARE_MESSAGE_MAP();


UINT CDragDlg::OnNcHitTest(CPoint point);
{
     UINT nHitTest = CDialog::OnNcHitTest( point );
     // also fake windows out, but this maximizes the window
     // when you double click on it.
     return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest;
}

 

<±ÛÀÚÅ©±â º¯°æ>

ºñÁÖ¾ó C++¿¡¼­ ´ÙÀ̾ó·Î±× ¹Ú½º µî¿¡¼­ ½ºÅÂƽ(Static) ÅؽºÆ®³ª ¹öÆ° µîÀÇ Ä¸¼Ç¿¡ »ç¿ëµÇ´Â ±ÛÀÚÀÇ Å©±â¸¦ ¹Ù²Ù°í ½Í½À´Ï´Ù. ±×¸®°í °¡´ÉÇϸé ÆùÆ®µµ ¹Ù²Ù°í ½Í±¸¿ä. ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä.

 ¸ÕÀú CFontÇü ¸â¹ö º¯¼ö°¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ´ÙÀ̾ó·Î±×ÀÇ ¸â¹ö º¯¼ö·Î CFont m_font;¸¦ OnInitDialog() Çڵ鷯¿¡¼­ ´ÙÀ½°ú °°ÀÌ ÆùÆ®¸¦ ÃʱâÈ­ÇÏ°í ½ºÅÂƽ(ȤÀº ¹öÆ°)°ú ¿¬°üµÈ ÄÁÆ®·Ñ º¯¼ö(m_ctlStatic)¿¡ SetFont(...) ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ÆùÆ®¸¦ ÁöÁ¤ÇÕ´Ï´Ù. CreateFont(...) ÇÔ¼ö¿¡ ´ëÇؼ­´Â MSDNÀ» Âü°íÇϱ⠹ٶø´Ï´Ù.

m_font.CreateFont(30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "±Ã¼­Ã¼");
m_ctlStatic.SetFont(&m_font);

 

- the end of this article -