1. DC¾ò±â CClientDC dc(this); 2. Client ¿µ¿ª ±¸Çϱâ GetClientRect(&rect); WM_SIZE ¸Þ½ÃÁö¹ß»ýÈÄ cx,cy »ç¿ë 3. ¹®ÀÚ¿­ »ç°¢Çü¾È¿¡ ±×¸®±â pDC->DrawText(¹®ÀÚ¿­,»ç°¢Çü,Style); Style: DT_BOTTOM - ¹®ÀÚ¿­À» »ç°¢Çü ¸Ç¾Æ·¡ÁÙ¿¡¹è¿­ ¹Ýµå½Ã DT_SINGLELINE°ú ÇÔ²²»ç¿ë DT_CENTER - ¹®ÀÚ¿­À» °¡·ÎÁß¾Ó¿¡ ¹èÄ¡ DT_VCENTER - ¹®ÀÚ¿­À» ¼¼·ÎÁß¾Ó¿¡ ¹èÄ¡ DT_LEFT,RIGHT - ¹®ÀÚ¿­À» ÁÂ,¿ì·Î ¹èÄ¡ DT_SINGLELINE - ¹®ÀÚ¿­À» ÇÑÁٷθ¸ ¾´´Ù 4. Brush »ç¿ë¹ý CBrush brushname(RGB(red,green,blue)); //ºê·¯½¬ »ý¼º CBrush *oldBrush=pDC->SelectObject(&brushname); //ÀÌÀüBrush ÀúÀå, »õ·Î¿î Brush ¼±Åà pDC->SelectObject(oldBrush); //¿ø·¡ÀÇ ºê·¯½¬·Î ¹Ýȯ 5. Pen»ç¿ë¹ý CPen pen(Pen Style,RGB(red,green,blue)); //ºê·¯½¬»ý¼º //Style: PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_GEOMETRIC,PS_COSMETRIC - ÆæÁ¾·ù PS_ENDCAP_ROUND,PS_ENDCAP_SQUARE - Æ泡À» µÕ±Û°Ô,°¢Áö°Ô ¼³Á¤ CPen *oldPen=pDC->SelectObject(&pen); //ÀÌÀüPenÀúÀå, »õ·Î¿î Pen¼³Á¤ pDC->SelectObject(oldPen); //Ææ¹Ýȯ 6. È­¸é´Ù½Ã±×¸®±â View Class¿¡¼­ - Invalidate(TRUE) : È­¸éÀ» Áö¿ì°í´Ù½Ã±×¸°´Ù Invalidate(FALSE) : È­¸éÀ» µ¤¾î¾º¿î´Ù UpdateAllViews(NULL); // Doc Class¿¡¼­ View ÀÇ OnDraw È£Ãâ RedrawWindow(); 7. ¸Þ½ÃÁö,ÇÔ¼ö ¼öµ¿À¸·Î ³Ö±â (EX)¹öưŬ¸¯ÇÔ¼ö³Ö±â Çì´õÆÄÀÏÀÇ AFX_MSG_MAP ºÎºÐ¿¡ ÇÔ¼ö¸¦ Á¤ÀÇ EX) afx_msg void funcName(); .cppÆÄÀÏÀÇ AFX_MSG ºÎºÐ¿¡ ¸Þ½ÃÁö¸¦ Ãß°¡ÇÑ´Ù EX) ON_BN_CLICKED(ID_NAME,funcName)... ID µî·Ï: View ¸Þ´ºÀÇ Resource Symbol ¿¡ µé¾î°¡¼­ ¸Þ´º ID ¸¦ µî·ÏÇØÁØ´Ù.. .cppÆÄÀÏÀÇ ¸Ç¾Æ·¡¿¡¼­ ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù EX) void CClass::funcName() { ... } 8. ¸¶¿ì½ºÄ¿¼­ ¹Ù²Ù±â ¸®¼Ò½ºÅÇ¿¡¼­ Ä¿¼­¸¦ ±×¸®°í ÀúÀåÇÑµÚ ID°ªÀº ÁØ´ÙÀ½ SetCapture(); //Ä¿¼­ÀÇÀÔ·ÂÀ» Ŭ¶óÀ̾ðÆ®¿µ¿ªÀ» ¹þ¾î³ª´õ¶óµµ ¹Þ¾Æ³½´Ù SetCursor(AfxGetApp()->LoadCursor(nIDResource)); //APPŬ·¡½ºÀÇ LoadCursor ViewÀÇ SetCursor »ç¿ë ReleaseCapture(); //SetCursor()»óŸ¦ ÇØÁ¦ÇÑ´Ù 9. »ö»óÇ¥ »ç¿ëÇϱâ CColorDialog dlg; if(dlg.DoModal()==IDOK) //Dialog ¸¦ ¶ç¿îÈÄ OK¹öÆ°À»´©¸£¸é ½ÇÇàÇҺκРMemberFunc: GetColor() //¼±ÅÃµÈ »ö»óÀ» ¹Þ¾Æ¿Â´Ù return ÇüÀº COLORREF Çü 10. Æ˾÷¸Þ´º ¸¸µé±â CMenu menu; //¸Þ´º °´Ã¼»ý¼º CMenu *pmenu; //¸Þ´º Æ÷ÀÎÅÍ»ý¼º menu.LoadMenu(IDR_MAINFRAME); //¸Þ´º¸¦ ºÒ·¯¿Â´Ù pmenu=menu.GetSubMenu(3); //¸Þ´ºÀÇ 3¹ø° ¸Þ´º¸¦ °¡Á®¿Â´Ù menu.CheckMenuItem(ID_MENU,m_kind==ID_MENU ? MF_CHECKED : MF_UNCHECKED); //¸Þ´º üũÇϱâ (¸Þ´º ID, ID üũÁ¶°Ç) pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this) //(TMP_Style,xÁÂÇ¥,yÁÂÇ¥,hWnd) ¸Þ´º ¶ç¿ì±â *ÁÖÀÇ»çÇ×* [¾È³»]ű×Á¦ÇÑÀ¸·Îµî·ÏµÇÁö¾Ê½À´Ï´Ù-OnContextMenu(CWnd* pWnd, CPoint point) //¿©±â¼­ point ´Â ½ºÅ©¸° ±âÁØÀÌ°í, OnRButtonDown(UINT nFlags, CPoint point) //¿©±â¼­ point ´Â Ŭ¶óÀ̾ðÆ® ±âÁØÀÌ´Ù! 11. Ŭ¶óÀ̾ðÆ® Æ÷ÀÎÅ͸¦ ½ºÅ©¸° Æ÷ÀÎÅÍ·Î º¯°æ ClientToScreen(&point); 12. ±×¸²ÆDZâ´É if(m_flag==FALSE) return; //m_falg=±×¸®±â ±â´É Âü,°ÅÁþ¼³Á¤ ±×¸®±â ¾Æ´Ï¸é ºüÁ®³ª°£´Ù CClientDC dc(this); CPen myPen(PS_SOLID,m_width,m_color); CPen *pOldPen=dc.SelectObject(&myPen); switch(m_shape) { case ID_FREELINE: //ÀÚÀ¯¼±±×¸®±â dc.MoveTo!(m_oldpt.x,m_oldpt.y); //Áö³­Æ÷ÀÎÅͺÎÅÍ dc.LineTo(point.x,point.y); //»õÆ÷ÀÎÅͱîÁö ±×¸°´Ù break; case ID_RECT: //»ç°¢Çü±×¸®±â dc.SetROP2(R2_NOTXORPEN); dc.Rectangle(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y); //Áö¿öÁö´Â È¿°ú dc.Rectangle(m_spt.x,m_spt.y,point.x,point.y); //±×·ÁÁö´Â È¿°ú break; case ID_ELLIPSE: //¿ø±×¸®±â dc.SetROP2(R2_NOTXORPEN); dc.Ellipse(m_spt.x,m_spt.y,m_oldpt.x,m_oldpt.y); //Áö¿öÁö´Â È¿°ú dc.Ellipse(m_spt.x,m_spt.y,point.x,point.y); //±×·ÁÁö´Â È¿°ú break; case ID_LINE: //¼±±×¸®±â dc.SetROP2(R2_NOTXORPEN); dc.MoveTo!(m_spt.x,m_spt.y); //½ÃÀÛÁ¡ºÎÅÍ dc.LineTo(m_oldpt.x,m_oldpt.y); //Áö³­Á¡±îÁö ±×Àº¼±À» Áö¿î´Ù dc.MoveTo!(m_spt.x,m_spt.y); //½ÃÀÛÁ¡ºÎÅÍ dc.LineTo(point.x,point.y); //»õ·Î¿îÁ¡±îÁö ±×¸°´Ù break; } m_oldpt=point; //¹Ù·ÎÀÌÀü°ª º¸°ü dc.SelectObject(pOldPen); //Ææ ¹Ýȯ 13. MessageBox AfxMessageBox() -> Àü¿ªÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿µ ¸Þ¼¼Áö ¹Ú½º¸¦ Ãâ·ÂÇÑ´Ù. //¾îµð¼­µçÁö »ç¿ëÇÒ¼ö ÀÕ´Ù int CWnd::MessageBox("¸Þ¼¼Áö","âÁ¦¸ñ","¾ÆÀÌÄÜ|¹öÆ°(»ó¼ö°ª)"); //ViewŬ·¡½º¿¡¼­ »ç¿ëÇÑ´Ù ¾ÆÀÌÄÜ »ó¼ö°ª MB_IC[¾È³»]ű×Á¦ÇÑÀ¸·Îµî·ÏµÇÁö¾Ê½À´Ï´Ù-xxONERROR, MB_ICONWARNING, MB_ICONQUESTION,MB_ICONINFOMATION MB_SYSTEMMODAL //½Ã½ºÅÛ¸ð´Þ ´ëȭ⠴ݱâÀü¿¡ ´Ù¸¥ÀÛ¾÷ ¸øÇÔ MB_APPLMODAL //ÀÀ¿ë¸ð´Þ ¹öÆ° »ó¼ö°ª MB_OK, MB_OKCANCEL, MB_YESNO 14. OS ÄÁÆ®·Ñ ExitWindowEx(EWX_SHUTDOWN,NULL); //Shut Down ExitWindowsEx(EWX_FORCE,0); //°­Á¦Á¾·á ExitWindowsEx(EWX_LOGOFF,0); //·Î±×¿ÀÇÁ ExitWindowsEx(EWX_POWEROFF,0); //Shut Down -> Turn Off ExitWindowsEx(EWX_REBOOT); //Shut Down -> Reboot 15. DialogBox ¸Þ½ÃÁö ±³È¯ UpdateData(FALSE); // ÄÁÆ®·Ñ¿¡ ¸â¹öº¯¼öÀÇ ³»¿ëÀ» Ç¥½ÃÇØÁØ´Ù UpdateData(TRUE); // ÄÁÆ®·Ñ ³»¿ëÀ» ´ÙÀ̾ó·Î±× Ŭ·¡½ºÀÇ ¸â¹öº¯¼ö·Î ÀúÀå 16. Àڷắȯ atoi,itoa - int <=> ASCII(char) º¯È¯ str.Format(" %d %d",x,y); // intÇüÀ» ¹®ÀÚ¿­·Î º¯È¯ atol,ltoa - ASCII <=> long º¯È¯ atof - ACSII => float º¯È¯ fcvt,gcvt - ½Ç¼ö¸¦ text·Î º¯È¯ LPtoDP, DPtoLP - ÀåÄ¡ÁÂÇ¥ <=> ³í¸®ÁÂÇ¥ º¯È¯ 17. CEdit Class »ç¿ëÇϱâ CEdit e_str.SetSel(int StartChae, int EndChar); //óÀ½¹®ÀÚºÎÅÍ ¸¶Áö¸·±îÁö ºí·Ï ÁöÁ¤ CEdit e_str.GetSel(int SChar,int EChar); //ºí·° ÁöÁ¤ÇÑ Ã³À½¹®ÀÚ¿Í ¸¶Áö¸·¹®ÀÚ ¹Þ±â CString str=m_str.Mid(SChar,EChar-SChar); //ºí·°ÁöÁ¤ÇÑ ºÎºÐÀ» °¡Á®¿Â´Ù 18. ÄÁÆ®·Ñ°ú Àڷᱳȯ SetDlgItemText(ÄÁÆ®·Ñ ID,¹®ÀÚ¿­) //ÄÁÆ®·Ñ¿¡ ¹®ÀÚ¿­À» ³Ö´Â´Ù GetDlgItemText(ÄÁÆ®·Ñ ID,¹®ÀÚ¿­) //ÄÁÆ®·ÑÀÇ ³»¿ëÀ» ¹®ÀÚ¿­¿¡ ³Ö´Â´Ù GetDlgItem(ÄÁÆ®·Ñ ID); //ÄÁÆ®·ÑÀÇ ÁÖ¼Ò¸¦ °¡Á®¿Â´Ù 19. »óŹÙÁ¶ÀÛ CMainFrame »ý¼ºÀÚ À§¿¡ static UINT indicators[] = //À̾ȿ¡ »õ·Î¿î ID¸¦ ³Ö°í ±× IDÀÇ °»½ÅÇڵ鷯¸¦ ¸¸µç´ÙÀ½ ÄÚµù pCmdUI->SetText("Ç¥½ÃÇÒ³»¿ë¡°); 20. ¼öµ¿À¸·Î Bitmap ÄÁÆ®·Ñ »ç¿ëÇϱâ CStatic bitmap; //bitmap ÄÁÆ®·Ñº¯¼ö bitmap.SetBitmap(CBitmap m_bitmap); //ÄÁÆ®·Ñ¿¡ ºñÆ®¸ÊÁöÁ¤ GetDlgItem(IDC_BITMAP)->ShowWindow(SW_SHOW,HIDE); // ±×¸²À» º¸À̰ųª ¼û±ä´Ù. 21. ÀÀ¿ëÇÁ·Î±×·¥ ½ÇÇàÇϱâ WinExec("ÇÁ·Î±×·¥°æ·Î¡°,SW_SHOW,HIDE); //ÀÀ¿ëÇÁ·Î±×·¥½ÇÇà,°æ·Î´Â \\·Î ±¸ºÐÇÑ´Ù 22. Bitmap »ç¿ëÇϱâ CBitmap bitmap.LoadBitmap(IDC_BITMAP); //ºñÆ®¸Ê°´Ã¼¿¡ ºñÆ®¸ÊÁöÁ¤ CDC memDC; //±×¸²±×¸± ¸Þ¸ð¸®DC»ý¼º MemDC.CreateCompatibleDC(pDC); //È­¸é DC¿Í ¸Þ¸ð¸® DC ȣȯ »ý¼º CBitmap *pOldBitmap=MemDC.SelectObject(&m_bitmap); //¸Þ¸ð¸®¿¡ ±×¸²À»±×¸°´Ù. pDC->BitBlt(int x, int y,int Width, int Height, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop); //BitBlt(±×¸²xÁÂÇ¥,±×¸²yÁÂÇ¥,±×¸²³ÐÀÌ,±×¸²³ôÀÌ,±×¸²±×·ÁÁø¸Þ¸ð¸®DC,±×¸²½ÃÀÛxÁÂÇ¥,±×¸²½ÃÀÛyÁÂÇ¥,½ºÅ¸ÀÏ); pDC->StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop ) //StretchBlt(±×¸²xÁÂÇ¥,±×¸²yÁÂÇ¥,±×¸²³ÐÀÌ,±×¸²³ôÀÌ,±×¸²±×·ÁÁø¸Þ¸ð¸®DC,±×¸²xÁÂÇ¥,±×¸²yÁÂÇ¥,¸Þ¸ð¸®±×¸²³ÐÀÌ,¸Þ¸ð¸®±×¸²³ôÀÌ,½ºÅ¸ÀÏ); MemDC.SelectObject(pOldBitmap); // ¸Þ¸ð¸®DC¹Ýȯ 23. Font ¹Ù²Ù±â CFontDialog dlg; //ÆùÆ®´ÙÀ̾ó·Î±× »ý¼º LOGFONT m_logFont; //ÆùÆ®¹ÞÀ»º¯¼ö¼±¾ð if(dlg.DoModal()==IDOK) //ÆùÆ®´ÙÀ̾ó·Î±×Ç¥½Ã {dlg.GetCurrentFont(&m_logFont)} //¼±ÅÃµÈ ÆùÆ®¹Þ±â OnDraw() CFont newFont,*pOldFont; //ÆùÆ® °´Ã¼ ¸¸µé±â newFont.CreateFontIndirect(&m_logFont); //ÆùÆ® »ý¼º pOldFont=(CFont *)pDC->SelectObject(&newFont); //ÆùÆ® ¼±Åà OnCreate() CClientDC dc(this); //DC »ý¼º CFont *pFont=dc.GetCurrentFont(); //Ŭ¶óÀ̾ðÆ® ¿µ¿ªÀÇ ÆùÆ®¸¦ pFont->GetLogFont(&m_logFont); //·Î±×ÆùÆ® ¸â¹ö°ªÀ¸·Î ÁöÁ¤ 24. Font ¸¸µé±â LOGFONT logfont; //ÆùÆ®¸¦ ¸¸µç´Ù logfont.lfHeight=50; //¹®ÀÚ¿­ ³ôÀÌ logfont.lfWidth=0; //³Êºñ logfont.lfEscapement=0; //¹®ÀÚ¿­±â¿ï±â logfont.lfOrientation=0; //¹®ÀÚ°³º°°¢µµ logfont.lfWeight=FW_NORMAL; //±½±â logfont.lfItalic=TRUE; //ÀÌÅŸ¯ logfont.lfUnderline=TRUE; //¹ØÁÙ logfont.lfStrikeOut=FALSE; //Ãë¼Ò¼± logfont.lfCharSet=HANGUL_CHARSET; //Çʼö logfont.lfOutPrecision=OUT_DEFAULT_PRECIS; logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS; //°¡º¯ÆøÆùÆ® °íÁ¤ÆøÆùÆ® logfont.lfPitchAndFamily=DEFAULT_PITCH|FF_SWISS; //±Û²ÃÀ̸§ strcpy(logfont.lfFaceName,"±Ã¼­Ã¼"); CClientDC dc(this); CFont newFont; //ÆùÆ®°´Ã¼»ý¼º newFont.CreateFontIndirect(&logfont); //ÆùÆ®ÁöÁ¤ CFont *pOldFont=dc.SelectObject(&newFont); //ÆùÆ®¼±Åà dc.TextOut(100,100,m_text); dc.SelectObject(pOldFont); //ÆùÆ®¹Ýȯ 25. Font ¸¸µé±â 2 CFont newFont; newFont.CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename ); CFont *pOldFont=dc.SelectObject(&newFont); 26. ComboBox »ç¿ëÇϱâ CComboBox combo; //ÄÞº¸¹Ú½º ¼±¾ð combo.Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); //Style - WS_CHILD|WS_VISIBLE int n=combo.GetCurSel(); //¼±ÅÃµÈ ¾ÆÀÌÅÛÀÇ index¸¦ °¡Á®¿Â´Ù combo.AddString("¹®ÀÚ¿­"); //¹®ÀÚ¿­À» Ãß°¡ÇÑ´Ù combo.GetLBText(n,str); //n¹ø° ¾ÆÀÌÅÛÀ» str¿¡ ÀúÀå 27. Spin »ç¿ëÇϱâ SpinÀº ¹Ù·Î¾ÕÀÇ Tab Order¿¡ µû¶ó ºÙ´Â´Ù m_spinr.SetRange(1900,3000); //½ºÇÉ ¹üÀ§ ÁöÁ¤ m_spinr.SetPos(m_nYear); //½ºÇÉ À§Ä¡ ÁöÁ¤ 28. CTime»ç¿ëÇϱâ CTime time; //½Ã°£°´Ã¼»ý¼º time=CTime::GetCurrentTime(); //ÇöÀç½Ã°£À» ÀúÀå time.GetYear(),time.GetMonth();,time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond() 29. CListBox ¸Þ¼Òµå AddString("¹®ÀÚ¿­"); //¸®½ºÆ®¿¡ ¹®ÀÚ¿­ Ãß°¡ DeleteString(index); //¸®½ºÆ®¿¡¼­ Ç׸ñ »èÁ¦ GetCount() //Àüü Ç׸ñ °¹¼ö¸¦ ¾ò´Â´Ù. GetSelcount() //¼±ÅÃµÈ Ç׸ñ °¹¼ö ¸®ÅÏ GetSel() //¼±ÅÃµÈ °ÍÀÎÁö ¾Æ´ÑÁö¸¦ ¸®ÅÏÇÑ´Ù -> ¾ç¼ö = TRUE , À½¼ö => FALSE GetText(int index,¹®ÀÚ¿­º¯¼ö) //index ¹ø° ¹®ÀÚ¿­À» ¹®ÀÚ¿­ º¯¼ö¿¡ ³Ö´Â´Ù FindStringExact(¹®ÀÚ¿­) //ÁöÁ¤ ¹®ÀÚ¿­ÀÇ index °ª ¸®ÅÏ -> ¾øÀ¸¸é ¸®ÅÏ°ª LB_ERR ¹Ýȯ FindString("a") //"a"·Î ½ÃÀÛÇÏ´Â Ç׸ñÀ» ¸ðµÎ ã´Â´Ù. ResetCountent() //¸ðµç ³»¿ëÀ» Áö¿î´Ù. 30. ÆÄÀÏÀÔÃâ·Â ÇÁ·ÎÁ§Æ®»ý¼º½Ã Step4 => Advanced => ÀúÀåÆÄÀÏÈ®ÀåÀÚÁöÁ¤ .h ÆÄÀÏ¿¡ DECLARE_SERIAL(CSawon) //ÀÌ Å¬·¡½º¸¦ ÀúÀå,·Îµå°¡´ÉÇÑ Å¬·¡½º·Î ¾²°Ù´Ù´Â ¼±¾ð .cpp ÆÄÀÏ¿¡ IMPLEMENT_SERIAL(CSawon,CObject,1) //À̰Ÿ¦ ÇØ¾ß ÀúÀåÀÌ °¡´ÉÇÏ´Ù void CFileioDoc::Serialize(CArchive& ar) if (ar.IsStoring()) //ÀúÀåÇϱâ {ar< else //¿­±â {ar>>m_shape; //ºÒ·¯¿Ã°É ¾´´Ù. ÀÐÀ»¶§µµ¼ø¼­´ë·ÎÀоî¾ßÇÑ´Ù} 31. MicroSoft FlexGrid »ç¿ëÇϱâ! CMSFlexGrid m_Grid; //FlexGrid ÄÁÆ®·Ñ º¯¼ö CString strTitle[]={"°í°´ÄÚµå","°í°´¼º¸í","°í°´Æ÷ÀÎÆ®","½ÅÀå","¸ö¹«°Ô","°í°´µî±Þ","BMTÁö¼ö","ÆÇÁ¤°á°ú"}; // Grid ÀÇ Á¦¸ñ¿¡ ³ÖÀ»¹®Àڹ迭 int Width[]={900,900,1100,800,800,900,1000,900}; // Grid ÀÇ ¿­³ÐÀÌ ÁöÁ¤ÇÒ ¹è¿­ m_Grid.SetRows(m_cnt+2); //ÀüüÇà¼ö ÁöÁ¤ m_Grid.SetCols(8); //Àüü¿­¼ö ÁöÁ¤ m_Grid.Clear(); //Áö¿ì±â m_Grid.SetFixedCols(0); //°íÁ¤¿­Àº ¾ø´Ù. m_Grid.SetRow(0); // Ç༱Åà for(int i=0;i<=7;i++) { m_Grid.SetColWidth(i,Width[i]); //¿­ ³ÐÀÌ ¼³Á¤ m_Grid.SetCol(i); //¿­ ¼±Åà m_Grid.SetText(strTitle[i]); // ¼±ÅõÈÇà, ¼±Åõȿ­¿¡ Text ¸¦ ³Ö´Â´Ù } 32. 4´ë Class°£ ÂüÁ¶ //°¢°¢ Çì´õÆÄÀÏ include #include "MainFrm.h" //¸ÞÀÎÇÁ·¹ÀÓ Çì´õÆÄÀÏ #include "ClassDoc.h" //DocŬ·¡½º Çì´õÆÄÀÏ #include "ClassView.h" //View¸¦ include ÇÒ¶§´Â ¹Ýµå½Ã Doc Çì´õÆÄÀÏÀÌ À§¿¡ÀÕ¾î¾ßÇÑ´Ù #include "Class.h" //APP Class ÀÇ Çì´õÆÄÀÏ void CClassView::OnMenuView() //ºäŬ·¡½º CClassApp *pApp=(CClassApp *)AfxGetApp(); //View -> App CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //View -> MainFrm CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument(); //View -> MainFrm -> Doc CClassDoc *pDoc=(CClassDoc *)GetDocument(); //View -> Doc //MainFrame Ŭ·¡½º CClassView *pView=(CClassView *)GetActiveView(); //MainFrm -> View CClassDoc *pDoc=(CClassDoc *)GetActiveDocument(); //MainFrm -> Doc CClassApp *pApp=(CClassApp *)AfxGetApp(); //MainFrm -> App //Doc Ŭ·¡½º CClassApp *pApp=(CClassApp *)AfxGetApp(); //Doc -> App CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //Doc -> MainFrm CClassView *pView=(CClassView *)pMain->GetActiveView(); // Doc -> MainFrm -> View CClassView *pView=(CClassView *)m_viewList.GetHead(); // Doc -> View //App Ŭ·¡½º CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //App -> MainFrm CClassView *pView=(CClassView *)pMain->GetActiveView(); //App -> MainFrm -> View CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument(); //App -> MainFrm -> Doc 33. ToolBar Ãß°¡Çϱâ CMainFrame À¸·Î °¡¼­ ¸â¹öº¯¼ö Ãß°¡ CToolBar m_wndToolBar1; OnCreate ·Î °¡¼­ ´ÙÀ½ ³»¿ëÀ» Ãß°¡ÇØÁØ´Ù (À§ÀÇ toolbar ºÎºÐÀ» º¹»çÇÏ°í À̸§¸¸ ¹Ù²Ù¸é µÈ´Ù.3±ºµ¥..) if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } ±× ÇÔ¼ö³»¿¡¼­ //TODO ¾Æ·¡¿¡ ³»¿ëÃß°¡..¿ª½Ã..º¹»çÇؼ­ À̸§¸¸ ¹Ù²Ù¸é µÈ´Ù. m_wndToolBar1.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM); //DockControlBar(&m_wndToolBar1); <= À̺κР´ë½Å.. À̰Ÿ¦ ³Ö´Â´Ù.. CRect toolRect; //Åø¹Ù ¿µ¿ªÀ» ¾òÀ» »ç°¢Çü this->RecalcLayout(); //Çö»óÅÂÀÇ Client ¿µ¿ªÀ» ±¸Çؼ­ ÀúÀåÇÑ´Ù m_wndToolBar.GetWindowRect(&toolRect); //Åø¹Ù¿µ¿ªÀ» ÀúÀåÇÑ´Ù toolRect.left+=1; //»ç°¢ÇüÀÇ ¿ÞÂÊÀ» 1Pixel ÁÙÀδ٠DockControlBar(&m_wndToolBar1,AFX_IDW_DOCKBAR_TOP,&toolRect); //ToolRect¿¡ Åø¹Ù¸¦ ºÙÀδ٠return 0; 34. ToolBar¿¡ ComboBoxºÙÀ̱â CComboBox m_combo; //°´Ã¼»ý¼º ID µî·Ï => view ¸Þ´º => resource symbol => new => ID_COMBO oncreate ¿¡ ³»¿ë Ãß°¡ (ÄÞº¸¸¦ ¸¸µé°í Ç¥½ÃÇÏ´Â ³»¿ë) m_wndToolBar.SetButtonInfo(10,IDC_COMBO,TBBS_SEPARATOR,150); //Åø¹ÙÀÇ 10¹ø°¹öÆ°À» ÆíÁýÇÑ´Ù CRect itemRect; //ÄÞº¸¸¦³ÖÀ» »ç°¢ÇüÀ» ¸¸µç´Ù m_wndToolBar.GetItemRect(10,&itemRect); //Åø¹ÙÀÇ 10¹ø° ¹öÆ°À» »ç°¢Çü¿¡ ³Ö´Â´Ù itemRect.left+=5; //¾Õ¿©¹é itemRect.right+=5; //µÚ¿©¹é itemRect.bottom+=100; //ÄÞº¸°¡¿­¸± °ø°£È®º¸ m_combo.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,itemRect,&m_wndToolBar,IDC_COMBO); //ÄÞº¸¹Ú½º¸¦ Åø¹Ù¿¡ ºÙ¿©ÁØ´Ù m_combo.AddString("À̸§"); //³»¿ëÃß°¡ m_combo.SetCurSel(0); //¼¿ ¼±Åà 35. Toolbar¿¡ ¼öµ¿À¸·Î³ÖÀº ComboBox »ç¿ëÇϱâ afx_msg void [¾È³»]ű×Á¦ÇÑÀ¸·Îµî·ÏµÇÁö¾Ê½À´Ï´Ù-xxOnSelectCombo(); //¿øÇü ON_CBN_SELCHANGE(IDC_COMBO,[¾È³»]ű×Á¦ÇÑÀ¸·Îµî·ÏµÇÁö¾Ê½À´Ï´Ù-xxOnSelectCombo) //¸Þ¼¼Áö¸Ê¿¡ Ãß°¡ CMainFrame *pMain=(CMainFrame *)GetParent(); //¸ÞÀÎÇÁ·¹ÀÓ ÁÖ¼ÒÂüÁ¶ CComboBox *pCom=(CComboBox *)(pMain->m_wndToolBar.GetDlgItem(IDC_COMBO)); //ÄÞº¸¹Ú½ºÀÇ ÁÖ¼Ò¸¦ °¡Á®¿Â´Ù, Á¢±ÙÇÒ ¶§ ¸ÞÀÎÇÁ·¹ÀÓ -> Åø¹Ù -> ÄÞº¸¹Ú½º ÀÇ ¼ø¼­·Î °¡¾ßÇÑ´Ù int n=pCom->GetCurSel(); //ÇöÀç¼±ÅÃµÈ ¼¿ÀÇ À妽º¸¦ °¡Á®¿Â´Ù if(n==CB_ERR) return; //¼±Åõȼ¿ÀÌ ¾øÀ¸¸é ÁßÁöÇÑ´Ù CString str; pMain->m_combo.GetLBText(n,str); //¼±Åõȼ¿ÀÇ Text¸¦ °¡Á®¿Â´Ù 36. UPDATE_COMMAND »ç¿ëÇϱâ pCmdUI->Enable(TRUE); //¹öÆ° È°¼ºÈ­ pCmdUI->SetText((bAdd)?"Ãë¼Ò":"½Å±Ô"); //¹öÆ°ÀÇ text ¼³Á¤ pCmdUI->SetCheck(TRUE); //¹öÆ° üũ 37. ÇÁ·Î±×·¥Á¤º¸ÀúÀå CWinApp::GetProfileString(¼½¼Ç¸í,Ç׸ñ¸í,±âº»°ª); // ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. (¹®ÀÚ¿­) CWinApp::GetProfileInt(¼½¼Ç¸í,Ç׸ñ¸í,±âº»°ª); //ºÒ·¯¿Ã¶§»ç¿ë (¼ýÀÚ) CWinApp::WriteProfileString(¼½¼Ç¸í,Ç׸ñ¸í,°ª); //ÀúÀåÇÒ¶§ »ç¿ë (¹®ÀÚ¿­) CWinApp::WriteProfileInt(¼½¼Ç¸í,Ç׸ñ¸í,°ª); //ÀúÀåÇÒ¶§ »ç¿ë (¼ýÀÚ) //ºÒ·¯¿Ã¶§ »ç¿ëÇÒÇÔ¼ö void CMainFrame::ActivateFrame(int nCmdShow) //ÇÁ·Î±×·¥ ½ÇÇàÈÄ ÇÁ·¹ÀÓ»ý¼ºµÉ¶§ ½ÇÇà //ÀúÀåÇÒ ¶§ WM_DESTROY ¸Þ½ÃÁö »ç¿ë 38. ÄÁÆ®·Ñ¹Ù Ç¥½ÃÇϱâ CMainFrame *pMain=(CMainFrame *)GetParent(); //MainFrame ÁÖ¼Ò°¡Á®¿À±â pMain->ShowControlBar(&pMain->m_wndToolBar,bTool1,FALSE); //Åø¹Ù¸¦ bTool2 ¿¡µû¶ó º¸ÀÌ°í °¨Ãá´Ù 39. Window âũ±â,À§Ä¡Á¤º¸ ÀúÀåÇϱâ MainFrame ÀÇ WM_DESTROY ¿¡ WINDOWPLACEMENT w; this->GetWindowPlacement(&w); //À©µµ¿ìÀÇ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. CString strRect; strRect.Format("%04d,%04d,%04d,%04d", //04d ´Â 4ÀÚ¸® È®º¸ÇÏ°í ³²Àº°Ç 0À¸·Î ä¿ö¶ó w.rcNormalPosition.left,w.rcNormalPosition.top, w.rcNormalPosition.right,w.rcNormalPosition.bottom); //À©µµ¿ìÀÇ À§Ä¡,Å©±â È®º¸.. BOOL bMax,bMin; //À©µµ¿ìÀÇ »óŸ¦ ÀúÀåÇϱâÀ§ÇÑ º¯¼ö //w.falg ´Â ÀÌÀü»óÅÂÀÇ Á¤º¸¸¦ °¡Áö°í ÀÕ´Ù!! if(w.showCmd==SW_SHOWMINIMIZED) //ÃÖ¼ÒÈ­ »óÅ { bMin=TRUE; if(w.flags==0) //falg °ªÀÌ 0 À̸é ÀÌÀü »óÅ°¡ º¸Åë»óÅÂÀÌ´Ù!! bMax=FALSE; else //ÀÌÀü»óÅ°¡ ÃÖ´ëÈ­ »óÅ bMax=TRUE; } else { if(w.showCmd==SW_SHOWMAXIMIZED) //ÃÖ´ëÈ­»óÅ { bMax=TRUE; bMin=FALSE; } else //º¸Åë »óÅ { bMax=FALSE; bMin=FALSE; } } AfxGetApp()->WriteProfileString("WinStatus","Rect",strRect); AfxGetApp()->WriteProfileInt("WinStatus","Max",bMax); AfxGetApp()->WriteProfileInt("WinStatus","Min",bMin); //Àоî¿ÃÂ÷·Ê.. ActivateFrame ÇÔ¼ö·Î °¡¼­ WINDOWPLACEMENT w; //À©µµ¿ìÀÇ »óŸ¦ ÀúÀåÇÏ´Â ±¸Á¶Ã¼.. BOOL bMax,bMin; //ÃÖ´ë,ÃÖ¼Ò»óŸ¦ ÀúÀåÇÒ º¯¼ö CString strRect; //âũ±â¸¦ ¹Þ¾Æ¿Ã º¯¼ö strRect=AfxGetApp()->GetProfileString("WinStatus","Rect","0000,0000,0500,0700"); bMin=AfxGetApp()->GetProfileInt("WinStatus","Min",FALSE); bMax=AfxGetApp()->GetProfileInt("WinStatus","Max",FALSE); int a=atoi(strRect.Left(4)); //¹®ÀÚ¿­À» int ·Î ¹Ù²ãÁØ´Ù. int b=atoi(strRect.Mid(5,4)); //atoi ¾Æ½ºÅ° °ªÀ» intÇüÀ¸·Î ¹Ù²ãÁØ´Ù.. int c=atoi(strRect.Mid(10,4)); int d=atoi(strRect.Mid(15,4)); w.rcNormalPosition=CRect(a,b,c,d); if(bMin) { w.showCmd=SW_SHOWMINIMIZED; if(bMax) { w.flags=WPF_RESTORETOMAXIMIZED ; } else { w.flags=0; } } else { if(bMax) { w.showCmd=SW_SHOWMAXIMIZED; } else { w.showCmd=SW_SHOWNORMAL; } } this->SetWindowPlacement(&w); //¼³Á¤µÈ °ªÀ¸·Î À©µµ¿ì¸¦ ±×¸®°Ô ÇÑ´Ù.. //CFrameWnd::ActivateFrame(nCmdShow); //ÀÌ°Ç ¹Ýµå½Ã ÁÖ¼®Ã³¸®ÇÑ´Ù.. 40. progress Bar ¾²±â m_progress.SetRange(m_first,m_last); //Progress ¹üÀ§¼³Á¤Çϱâ m_progress.SetStep(m_step); //Progress Step¼³Á¤Çϱâ //m_progress.StepIt(); //½ºÅܸ¸Å­ ¿òÁ÷À̱â //¶Ç´Â ´ÙÀ½À» »ç¿ëÇÑ´Ù for(int a=m_first;a<=m_last;a+=m_step) //a°¡ óÀ½ºÎÅÍ ³¡±îÁö { m_progress.SetPos(a); // À§Ä¡¸¦ a¿¡ ¸ÂÃá´Ù Sleep(50); //õõÈ÷ ¿òÁ÷ÀÌ°ÔÇÑ´Ù } 41. ÆÄÀÏ´ëÈ­»óÀÚ FileDialog »ç¿ëÇϱâ void CConDlg1::OnFileopen() //ÆÄÀÏ¿­±â ¹öÆ° { CFileDialog *fdlg; //ÆÄÀÏ´ëÈ­»óÀÚ °´Ã¼ »ý¼º // Æ÷ÀÎÅÍ·Î ¸¸µç´Ù.. static char BASED_CODE szFilter[] = "Animate Video Files (*.avi)|*.avi|All Files (*.*)|*.*||"; //ÇÊÅ͸¦ ¸¸µé¾î ÁØ´Ù..ÀÌ°Ç ÇÒÁÙ ¸ð¸§.. fdlg =new CFileDialog(TRUE, ".avi", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); //´ëÈ­»óÀÚ ¸¸µé±â..ÀÌ·¸°Ô Çؾߴí´Ù.. if(fdlg->DoModal()==IDOK) //ÀÌÁ¦..´ëÈ­»óÀÚ¸¦ ¶ì¿ì°í.. { //OK ´©¸£¸é ½ÇÇàµÉ ºÎºÐ.. m_filename=fdlg->GetPathName(); //´ëÈ­»óÀÚ¿¡¼­ °æ·Î¸¦ ¹Þ¾Æ¼­ ÀúÀå. UpdateData(FALSE); } } ¼±»ý´ÔÀÌ ÇØÁØ°Å //ÆÄÀÏ ´ÙÀ̾ó·Î±× ¸¸µé±â CFileDialog fdlg(TRUE,"avi",".avi",OFN_OEVRWRITEPROMPT,"Vidoe Files(*.avi)|*.avi|All Files(*.*)|*.*||"); 42. Animate Control »ç¿ëÇϱâ m_animate.Open(m_filename); //ÆÄÀÏÀ» ¿¬´Ù m_animate.Play(0,-1,1); //(óÀ½ÇÁ·¹ÀÓ,¸¶Áö¸·ÇÁ·¹ÀÓ,¹Ýº¹È½¼ö) m_animate.Stop(); //Á¤Áö½ÃÅ°±â m_ani.SetAutoStart(TRUE); //ÀÚµ¿À¸·Î ½ÃÀÛÇÑ´Ù 43. Control ÀÇ Style ¹Ù²ãÁÖ±â Control.ModyfyStyle(Á¦°ÅÇÒ½ºÅ¸ÀÏ,Ãß°¡ÇÒ½ºÅ¸ÀÏ); //½ºÅ¸ÀÏÀº MSDN³»¿ë ÂüÁ¶ 44. ½Ã½ºÅÛ ³¯Àڹٲٱ⠹öÆ° //SetSystemTime(),GetSystemTime() //GMT Ç¥Áؽø¦ °¡Á®¿Â´Ù. //GetLocalTime(),SetLocalTime() //ÇöÀç Áö¿ª½Ã°£À» °¡Á®¿Â´Ù. SYSTEMTIME st; GetLocalTime(&st); //ÇöÀç ½Ã°£, ³¯ÀÚ¸¦ ³Ö´Â´Ù. st.wYear=m_date2.GetYear(); st.wMonth=m_date2.GetMonth(); st.wDay=m_date2.GetDay(); SetSystemTime(&st); 45. ½Ã½ºÅÛ ½Ã°£ ¹Ù²Ù±â ¹öÆ° UpdateData(TRUE); SYSTEMTIME st; GetLocalTime(&st); st.wHour=m_time.GetHour(); st.wMinute=m_time.GetMinute(); st.wSecond=m_time.GetSecond(); SetLocalTime(&st); 46.½Ã½ºÅÛÀÇ µå¶óÀÌºê ¹®ÀÚ ¾ò±â char temp[50]; GetLogicalDriveStrings(sizeof(temp),temp); CString str,str1; int n=0; while(*(temp+n)!=NULL) { str=temp+n; str1+= " "+str.Left(2); n+=4; } 47. ÇöÀç ÀÛ¾÷°æ·Î ¾ò±â char temp[MAX_PATH]; //MAX_PATH ´Â °æ·Î±æÀÌÀÇ Ãִ븦 define ÇسõÀº°Í. GetCurrentDirectory(sizeof(temp),temp); // ÇöÀÛ¾÷ÇÏ´Â °æ·Î¸¦ ¾ò¾î¿Â´Ù.(°æ·Î ±æÀÌ,¹®ÀÚÇü); 48. Tree Control »ç¿ëÇϱâ HTREEITEM hmov,hmus; //ÇÚµéÀ»¹ÞÀ» º¯¼ö ÀÌ°Ô ÀÕ¾î¾ß ÇÏÀ§ µð·ºÅ丮 »ý¼º°¡´É hmov=m_tree.InsertItem("¿µÈ­",TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST´Â default hm1=m_tree.InsertItem("¿ÜÈ­",hmov); //hmov ¾Æ·¡ ¡°¿ÜÈ­¡±Æ®¸® »ý¼º CImageList m_image; //±×¸²À» »ç¿ëÇϱâ À§ÇÑ Å¬·¡½º´Ù!! ¾Ë¾ÆµÎÀÚ.. m_tree.SetImageList(&m_image,TVSIL_NORMAL); //Tree View Style Image List => TVSIL hmov=m_tree.InsertItem("¿µÈ­",0,1,TVI_ROOT,TVI_LAST); //,TVI_ROOT,TVI_LAST´Â default hmus=m_tree.InsertItem("°¡¿ä",1,2); //("¹®ÀÚ¿­",óÀ½±×¸²¹øÈ£,¼±Åýñ׸²) hm1=m_tree.InsertItem("¿ÜÈ­",2,3,hmov); //±×¸² ¹øÈ£´Â default ·Î 0ÀÌ µé¾î°£´Ù.. 49. List Control »ç¿ëÇϱâ m_list.ModifyStyle(LVS_TYPEMASK, LVS_ICON); //¸®½ºÆ®¸¦ Å«¾ÆÀÌÄÜÇüÅ·Πº¸Àδ٠m_list.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); //¸®½ºÆ®¸¦ ÀÛÀº¾ÆÀÌÄÜÇüÅ·Πº¸Àδ٠m_list.ModifyStyle(LVS_TYPEMASK, LVS_LIST); //¸®½ºÆ®¸¦ ¸®½ºÆ®ÇüÅ·Πº¸Àδ٠m_list.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); //¸®½ºÆ®¸¦ ÀÚ¼¼È÷ÇüÅ·Πº¸Àδ٠CImageList m_treeimage; //À̹ÌÁö¸®½ºÆ® CImageList m_small, m_large; m_large.Create(IDB_LARGE,32,0,RGB(255,255,255)); //À̰Ŵ Ŭ·¡½º¿¡¼­ Ãß°¡ÇØÁØ°Å´Ù m_small.Create(IDB_SMALL,16,0,RGB(255,255,255)); (bmp ID°ª, m_list.SetImageList(&m_large,LVSIL_NORMAL); m_list.SetImageList(&m_small,LVSIL_SMALL); CString name[]={"È«±æµ¿","Áø´Þ·¡","Çѱ¹³²","°³³ª¸®"}; CString tel[]={"400-3759","304-7714","505-9058","700-9898"}; CString born[]={"1980-1-1","1981-12-20","1980-05-15","1981-08-31"}; CString sex[]={"³²ÀÚ","¿©ÀÚ","³²ÀÚ","¿©ÀÚ"}; m_list.InsertColumn(0,"À̸§",LVCFMT_LEFT,70); m_list.InsertColumn(1,"ÀüÈ­¹øÈ£",LVCFMT_LEFT,80); m_list.InsertColumn(2,"»ýÀÏ",LVCFMT_LEFT,90); m_list.InsertColumn(3,"¼ºº°",LVCFMT_LEFT,50); LVITEM it; //¸®½ºÆ® ±¸Á¶Ã¼ char temp[100]; for(int a=0;a<4;a++) { int n=(sex[a]=="³²ÀÚ")?0:1; m_list.InsertItem(a,name[a],n); //insert item Àº ÇàÀ» ¸¸µé°í.. it.mask=LVIF_TEXT|LVIF_IMAGE; //¸¶½ºÅ© ¼³Á¤ it.iItem=a; it.iSubItem=1; //¿­ ¼³Á¤ strcpy(temp,tel[a]); //ÀÌ°Å ¸ðÇϴ°ųÄ.. it.pszText=temp; m_list.SetItem(&it); // setitem ¿­¿¡ Á¤º¸¸¦ ³Ö´Â´Ù. it.iSubItem=2; //¿­ ¼³Á¤ strcpy(temp,born[a]); //ÀÌ°Å ¸ðÇϴ°ųÄ.. it.pszText=temp; m_list.SetItem(&it); // setitem ¿­¿¡ Á¤º¸¸¦ ³Ö´Â´Ù. it.iSubItem=3; //¿­ ¼³Á¤ strcpy(temp,sex[a]); //ÀÌ°Å ¸ðÇϴ°ųÄ.. it.pszText=temp; m_list.SetItem(&it); // setitem ¿­¿¡ Á¤º¸¸¦ ³Ö´Â´Ù. 50. Bitmap Button »ç¿ëÇϱâ CBitmapButton À» »ç¿ëÇÑ´Ù! CButton ¿¡¼­ »ó¼Ó ¹Þ´ÂŬ·¡½ºÀÓ.. m_button1.Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,CRect(310,20,370,50), this,IDC_MYBUTTON); //¹öÆ°¸¸µé±â m_button1.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //¹öÆ°ÀÇ ±×¸²¼³Á¤ m_button1.SizeToContent(); //¹öÆ°À» ±×¸² Å©±â·Î ¸ÂÃç ÁØ´Ù!! ±×³É ¹öÆ°À» ºñÆ®¸Ê¹öÆ°À¸·Î ¹Ù²Ù±â -> ¹öÆ°À» ¸¸µç´Ù ¼Ó¼º¿¡¼­ OWNERDRA ¼Ó¼º¿¡ üũ!! m_button2.LoadBitmaps(IDB_UP,IDB_DOWN,IDB_FOCUS,IDB_DISABLE); //¹öÆ°ÀÇ ±×¸²¼³Á¤ m_button2.SizeToContent(); //¹öÆ°À» ±×¸² Å©±â·Î ¸ÂÃç ÁØ´Ù!! 51. Áߺ¹¾ø´Â ³­¼ö¹ß»ýÇϱâ int su; //¹ß»ýµÈ ³­¼öÀúÀå int a,b; BOOL bDasi; //¼ýÀÚ°¡Áߺ¹µÉ°æ¿ì ´Ù½ÃÇϱâÀ§ÇÑ º¯¼ö for(a=0;a<9;a++) //³­¼ö 9°³ ¹ß»ý { bDasi=TRUE; while(bDasi) { bDasi=FALSE; su=rand()%10; //³­¼ö¹ß»ý for(b=0;b { if(temp[b]==su) //Áߺ¹À̸é { bDasi=TRUE; //Áߺ¹ÀÌ ÀÕÀ¸¸é ´Ù½Ãwhile ¹®À» ½ÇÇàÇÑ´Ù break; }//if }//for }//while temp[a]=su; //Áߺ¹ÀÌ ¾Æ´Ï¸é ´ëÀÔÇÑ´Ù 52. ¸Þ´º ¹üÀ§·Î »ç¿ëÇϱâ ON_COMMAND_RANGE(ID_LEVEL3,ID_LEVEL9,OnLevel); //¹üÀ§¸Þ¼¼Áö ¹ß»ý //¸Þ´º IDÀÇ °ªÀÌ ¿¬¼ÓµÈ ¼ýÀÚÀÏ °æ¿ì ¹üÀ§·Î ÁöÁ¤Çؼ­ »ç¿ëÇÒ¼öÀÕ´Ù 53. ÇÑ,¿µ ÀüȯÇÔ¼ö void CCustView::SetHangul(BOOL bCheck) //T:ÇÑ±Û F:¿µ¹® ÀÌ°Ç ¿Ü¿ìÀÚ.. { HIMC hm=ImmGetContext(this->GetSafeHwnd()); //ºäŬ·¡½ºÀÇ À©µµ¿ì ÇÚµéÆ÷ÀÎÅ͸¦ ¾ò´Â´Ù. if(bCheck) { ::ImmSetConversionStatus(hm,1,0); //1Àº ÇÑ±Û 0Àº ¿µ¹® } else { ::ImmSetConversionStatus(hm,0,0); //¿µ¹®À¸·Î ¹Ù²ãÁØ´Ù } ::ImmReleaseContext(this->GetSafeHwnd(),hm); //ÀåÄ¡¸¦ Ç®¾îÁØ´Ù } #include "imm.h" //Çì´õ ¹Ýµå½Ã Ãß°¡ÇÏ°í imm32.lib (¶óÀ̺귯¸® ÆÄÀÏ)¸¦ ¹Ýµå½Ã ¸µÅ©ÇØÁÖ¾î¾ß ÇÑ´Ù! **** ¶óÀ̺귯¸® Ãß°¡Çϱâ ÇÁ·ÎÁ§Æ®¸Þ´º -> ¼ÂÆà -> ¸µÅ©ÅÇ 54. DLLÇÔ¼öÁ¤ÀÇÇϱâ ÀÓÆ÷Æ®ÇÔ¼ö : extern "C" __declspec(dllimport!) ¸®ÅÍÇü ÇÔ¼ö¸í(¸Å°³º¯¼ö,...) ; - ¸ÞÀÎÇÁ·Î±×·¥¿¡¼­ DLL¿¡ ÀÖ´Â ÇÔ¼ö¸¦ È£ÃâÇÒ¶§ »ç¿ëÇÑ´Ù. ¿¢½ºÆ÷Æ®ÇÔ¼ö : extern "C" __declspec(dllexport) ¸®ÅÍÇü ÇÔ¼ö¸í(¸Å°³º¯¼ö,...) { ³»¿ë; } API ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ Q&AÀÔ´Ï´Ù. 1. ƯÁ¤ µð·ºÅ丮 µÚÁö±âÁöÁ¤ÇÑ µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏÀ» ã¾Æ³»´Â Äڵ带 ¸¸µé·Á¸é ¾î¶»°Ô ÇØ¾ß Çմϱî ? ÀÌ ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Â API°¡ ¹Ù·Î FindFirstFile°ú FindNextFile, FindClose¶ó´Â APIµéÀÔ´Ï´Ù. »ç¿ë ¿¹Á¦´Â ´ÙÀ½°ú °°½À´Ï´Ù. WIN32_FIND_DATA findFileData; HANDLE hFileHandle; // szDir¿¡ µÚÁö°íÀÚ ÇÏ´Â µð·ºÅ丮ÀÇ °æ·Î¸íÀ» ÁØ´Ù. ¿¹¸¦ µé¸é "C:\\TEMP\\*.*" // ã¾ÆÁø ÆÄÀÏÀÇ ¼Ó¼ºÀº findFileDataÀÇ dwFileAttributes¸¦ »ìÆ캻´Ù. hFileHandle = FindFirstFile(m_szDir, &findFileData); if (hFileHandle != INVALID_HANDLE_VALUE) // ÆÄÀÏÀ» ãÀº °æ¿ì { // ãÀº ÆÄÀÏÀÇ À̸§Àº cFileName Çʵå·Î µé¾î¿Â´Ù. ... // ´ÙÀ½ ÆÄÀÏÀ» ã´Â´Ù. while(FindNextFile(hFileHandle, &findFileData)) { ... } FindClose(hFileHandle); } 2. API¸¦ ÀÌ¿ëÇÏ´Â À¯´ÏÄÚµå¿Í ANSI ¹®ÀÚ¿­°£ÀÇ º¯È¯ ¹æ¹ýAPI¸¦ ÀÌ¿ëÇؼ­ À¯´ÏÄÚµå¿Í ANSI ¹®ÀÚ¿­°£ÀÇ º¯È¯Àº ¾î¶»°Ô ¼öÇàÇմϱî ? Visual C++¿¡¼­ À¯´ÏÄÚµå ¹®ÀÚ¿­Àº BSTRÀ̶õ ŸÀÔÀ¸·Î Ç¥½ÃµË´Ï´Ù. ¶Ç À¯´ÏÄÚµå¿Í ANSI ¹®ÀÚ¿­°£ÀÇ º¯È¯À» À§Çؼ­ À©µµ¿ì ½Ã½ºÅÛ¿¡´Â MultiByteToWideChar¿Í WideCharToMultiByte¶ó´Â API°¡ Á¸ÀçÇÕ´Ï´Ù. MFC¿¡¼­ÀÇ BSTR ŸÀÔ º¯È¯¹æ¹ýÀ̳ª ATL·Î ÇÏ´Â BSTR ŸÀÔ º¯È¯µµ Âü°íÇϽñ⠹ٶø´Ï´Ù. ANSI ¹®ÀÚ¿­¿¡¼­ À¯´ÏÄÚµå·ÎÀÇ º¯È¯ ¹æ¹ý // sTimeÀ̶õ ANSI ¹®ÀÚ¿­À» bstrÀ̶õ À̸§ÀÇ À¯´ÏÄÚµå(BSTR ŸÀÔ) º¯¼ö·Î º¯È¯ char sTime[] = "À¯´ÏÄÚµå º¯È¯ ¿¹Á¦"; BSTR bstr; // sTimeÀ» À¯´ÏÄÚµå·Î º¯È¯Çϱ⿡ ¾Õ¼­ ¸ÕÀú ±× ±æÀ̸¦ ¾Ë¾Æ¾ß ÇÑ´Ù. int nLen = MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), NULL, NULL); // ¾ò¾î³½ ±æÀ̸¸Å­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. bstr = SysAllocStringLen(NULL, nLen); // ÀÌÁ¦ º¯È¯À» ¼öÇàÇÑ´Ù. MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), bstr, nLen); // ÇÊ¿ä¾ø¾îÁö¸é Á¦°ÅÇÑ´Ù. SysFreeString(bstr);À¯´ÏÄڵ忡¼­ ANSI ¹®ÀÚ¿­·ÎÀÇ º¯È¯ ¹æ¹ý // newValÀ̶õ BSTR ŸÀÔ¿¡ ÀÖ´Â À¯´ÏÄÚµå ¹®ÀÚ¿­À» sTimeÀ̶ó´Â ANSI ¹®ÀÚ¿­·Î º¯È¯ char *sTime; int nLen = WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 0, NULL, NULL); sTime = malloc(nLen+1); WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 128, NULL, NULL); // ÇÊ¿ä¾øÀ¸¸é ¸Þ¸ð¸®¸¦ Á¦°ÅÇÑ´Ù. free(sTime);À¯´ÏÄÚµå ¹®ÀÚ¿­À» UTF-8À¸·Î º¯È¯Çϱâ WideCharToMultiByte ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ù ¹ø° ÀÎÀÚ·Î CP_UTF8À» ÁöÁ¤ÇÏ¸é µÈ´Ù. UTF-8Àº À¯´ÏÄÚµåÀÇ ÀÎÄÚµù ½ºÅ´ ÁßÀÇ Çϳª·Î ½±°Ô ¸»ÇÏÀÚ¸é ¹®ÀÚ¿­ ½ºÆ®¸²¿¡¼­ 0À» »©°í Ç¥ÇöÇÏ´Â ¹æ¹ýÀ̶ó°í º¼ ¼ö ÀÖ´Ù. 3. ·¹Áö½ºÆ®¸® Àбâ/¾²±âAPI¸¦ ÀÌ¿ëÇؼ­ ·¹Áö½ºÆ®¸®¿¡ ÇÑ Ç׸ñÀ» »ý¼ºÇϰųª ±âÁ¸ Ç׸ñÀÇ °ªÀ» ÀоîµéÀÌ·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? ·¹Áö½ºÆ®¸® °ü·Ã API¸¦ »ç¿ëÇÏ·Á¸é winreg.h¶ó´Â Çì´õ ÆÄÀÏÀ» ¼Ò½º¿¡ Æ÷ÇÔÇØ¾ß ÇÕ´Ï´Ù. ·¹Áö½ºÆ®¸®¿¡ Å°¸¦ »ý¼ºÇÏ´Â ¹æ¹ý°ú ·¹Áö½ºÆ®¸®¿¡ Á¸ÀçÇÏ´Â Å°ÀÇ °ªÀ» Àд ¹æ¹ýÀ» Â÷·Ê·Î »ìÆ캸°Ú½À´Ï´Ù. ·¹Áö½ºÆ®¸® Å° »ý¼º ¿¹Á¦ // ¿¹¸¦ µé¾î HKEY_LOCAL_MACHINE¹ØÀÇ System\CurrentControlSet\Services\GenPort¶ó´Â Å°¸¦ // »ý¼ºÇÏ°í °Å±â¿¡ DWORD ŸÀÔÀÇ °ªÀ¸·Î TypeÀ» ¸¸µé°í ¹®ÀÚ¿­ ŸÀÔÀÇ °ªÀ¸·Î Group // À» ¸¸µé¾î º»´Ù. #include "winreg.h" LONG error = 0; HKEY hKey; DWORD dwDisp, dwData; char lpData[] = "Write this down"; // ¸ÕÀú ¸¸µé·Á´Â Å°°¡ ÀÌ¹Ì Á¸ÀçÇÏ´Â °ÍÀÎÁö »ìÇôº»´Ù. error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\GenPort", 0, KEY_ALL_ACCESS, &hKey); if (error != ERROR_SUCCESS) // ¾ø´Ù¸é »õ·Î »ý¼ºÇÑ´Ù. { // Å°¸¦ »ý¼ºÇÑ´Ù. error = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\GenPort", 0, "REG_BINARY", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, &dwDisp); // À§ÀÇ Å° ¹Ø¿¡ TypeÀ̶õ DWORD ŸÀÔÀÇ °ªÀ» ¸¸µé°í 1·Î ÃʱâÈ­ dwData = 0x1; error = RegSetValueEx( hKey, "Type", 0, REG_DWORD,&dwData,4); // À§ÀÇ Å° ¹Ø¿¡ GroupÀ̶õ ¹®ÀÚ¿­ ŸÀÔÀÇ °ªÀ» ¸¸µé°í lpDataÀÇ °ªÀ¸·Î ÃʱâÈ­ error = RegSetValueEx( hKey, "Group", 0, REG_SZ, lpData, strlen(lpData)); // Å°¸¦ ´Ý´Â´Ù. RegCloseKey(hKey); }±âÁ¸ÀÇ ·¹Áö½ºÆ®¸® Å°¿¡¼­ °ª Àбâ // HKEY_CURRENT_USER\Software\Netscape\Netscape Navigator\Main ¹ØÀÇ Install Directory // °ªÀÇ ¹®ÀÚ¿­ °ªÀ» ÀоîµéÀδÙ. DWORD dwType, cbData; HKEY hSubKey; long lRet; char pszString[255]; // Å°¸¦ ¿ÀÇÂÇÑ´Ù. if ((lRet = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Netscape\\Netscape Navigator\\Main", 0, KEY_READ KEY_QUERY_VALUE , &hSubKey)) == ERROR_SUCCESS) { cbData = 255; // ¹®ÀÚ¿­ °ªÀ» Àоî¿Ã µ¥ÀÌÅÍÀÇ Å©±â¸¦ ÁØ´Ù. if ((lRet = RegQueryValueEx(hSubKey, "Install Directory", NULL, &dwType, pszString, &cbData)) == ERROR_SUCCESS) { // Á¦´ë·Î ÀÐÈù °æ¿ì } else { // ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì } RegCloseKey(hSubKey); }·¹Áö½ºÆ®¸® Å° »èÁ¦Çϱâ - RegDeleteKey ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. 4. À©µµ¿ì Ž»ö±â·ÎºÎÅÍÀÇ Drag&DropÀ» ¹ÞÀ¸·Á¸éÀ©µµ¿ì Ž»ö±â·ÎºÎÅÍ Á¦°¡ ¸¸µç À©µµ¿ì·ÎÀÇ drag&dropÀÌ °¡´ÉÇÏ°Ô ÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß Çմϱî ? ´ÙÀ½ ¼ø¼­¸¦ µû¶ó¼­ ÇÁ·Î±×·¡¹ÖÇÏ½Ã¸é µË´Ï´Ù. ÇÁ·Î±×·¥ÀÇ ÃʱâÈ­½Ã¿¡ DragAcceptFiles(hWnd, TRUE) ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ù ¹ø° ÀÎÀÚÀÎ hWnd´Â µå·ÓÀÇ Å¸°ÙÀÌ µÇ´Â À©µµ¿ìÀÇ ÇÚµéÀÌ´Ù. Ž»ö±â·ÎºÎÅÍ ÆÄÀÏÀÌ µå·ÓµÇ´Â ¼ø°£¿¡ WM_DROPFILES ¸Þ½ÃÁö°¡ ³¯¶ó¿Â´Ù. À̸¦ ó¸®ÇÑ´Ù. case WM_DROPFILES : { POINT pt; // ¾î´À À§Ä¡¿¡ µå·ÓµÇ¾ú´ÂÁö ±× Ç׸ñÀ» ¾Ë¾Æ³½´Ù. if (DragQueryPoint((HDROP)wParam, &pt)) { UINT i = 0; // ¸ðµÎ ¸î °³ÀÇ ÆÄÀÏÀÌ µå·ÓµÇ¾ú´ÂÁö ¾Ë¾Æ³½´Ù. // ¸¸ÀÏ Æú´õ°¡ µå·ÓµÇ¾ú´Ù¸é Æú´õÀÇ À̸§¸¸ ³Ñ¾î¿Â´Ù. UINT uCount = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL ,0); for(i = 0;i < dwret =" GetLogicalDriveStrings(256," token =" buffer;"> 0) { DWORD FileSystemFlag; char FileSystemName[64]; strcpy(DriveString, token); // VolumeNameÀ¸·Î µå¶óÀ̺꿡 ´ëÇÑ ¼³¸í ¹®ÀÚ¿­ÀÌ ³Ñ¾î¿Â´Ù. if (GetVolumeInformation(token, VolumeName, 255, NULL, NULL, &FileSystemFlag, FileSystemName, 63)) { // ¿øÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÑ´Ù. } dwRet -= (strlen(token)+1); token = token + strlen(token)+1; // ´ÙÀ½ µå¶óÀ̺ê·Î ÁøÇàÇÑ´Ù. } 6. µå¶óÀ̺ê/µð·ºÅ丮/ÆÄÀÏÀÇ À̹ÌÁö ¸®½ºÆ® À妽º ¾ò±âƯÁ¤ µå¶óÀ̺ê/µð·ºÅ丮/ÆÄÀÏÀÌ ½Ã½ºÅÛ À̹ÌÁö ¸®½ºÆ®¿¡¼­ ¾î¶² À妽º¸¦ °®´ÂÁö ¾Ë°í ½Í½À´Ï´Ù. °¢ ÆÄÀÏÀ̳ª µå¶óÀÌºê ¹× µð·ºÅ丮¿¡ ´ëÇÑ Á¤º¸´Â Shell ¶óÀ̺귯¸®¿¡¼­ Á¦°øÇØÁÖ´Â SHGetFileInfo ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é µË´Ï´Ù. ´ÙÀ½ÀÇ ÇÔ¼ö´Â ù ¹ø° ÀÎÀÚÀÎ lpFileNameÀ¸·Î ÁÖ¾îÁø ÆÄÀÏ¿¡ ´ëÇÑ ¼³¸íÀ» µÎ ¹ø° ÀÎÀÚ·Î ¹Þ¾Æ¿À°í ¼¼ ¹ø° ÀÎÀڷδ ½Ã½ºÅÛ À̹ÌÁö ¸®½ºÆ®¿¡¼­ÀÇ À妽º¸¦ ¾ò¾î¿É´Ï´Ù. void GetFileInfo(LPSTR lpFileName, LPSTR lpDesc, int *nIndex) { DWORD dwAttr; SHFILEINFO sfi; int hIcon = SHGetFileInfo(lpFileName, dwAttr, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME SHGFI_SYSICONINDEX); *nIndex = sfi.iIcon; strcpy(lpDesc, sfi.szTypeName); } 7. ¸®½ºÆ® ÄÁÆ®·Ñ¿¡ Ä®·³ Çì´õ ³Ö±â¸®Æ÷Æ®ºä Çü½ÄÀÇ ¸®½ºÆ® ÄÁÆ®·Ñ¿¡ Ä÷³ Çì´õ¸¦ Áý¾î ³ÖÀ¸·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? // <¹®¼­¸í, µî·Ï³¯Â¥, »óÅÂ> : 3°³ÀÇ Çì´õ¸¦ ¸¸µç´Ù. LV_COLUMN col; col.mask = LVCF_FMT LVCF_TEXT LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 100; col.pszText = "¹®¼­¸í"; col.cchTextMax = strlen(col.pszText); ListView_SetColumn(hListView, 0, &col); col.mask = LVCF_FMT LVCF_TEXT LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 100; col.pszText = "µî·Ï³¯Â¥"; col.cchTextMax = strlen(col.pszText); ListView_InsertColumn(hListView, 0, &col); col.mask = LVCF_FMT LVCF_TEXT LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 100; col.pszText = "»óÅÂ"; col.cchTextMax = strlen(col.pszText); ListView_InsertColumn(hListView, 1, &col); 8. ¸®½ºÆ®ºä¿¡ Ç׸ñ »ðÀÔÇϱ⸮½ºÆ®ºä¿¡ ÇÑ Ç׸ñÀ» Ãß°¡ÇÏ°í ½Í½À´Ï´Ù. // À̹ÌÁö ¸®½ºÆ®¿Í ºÎ°¡ Á¤º¸¸¦ »ç¿ëÇÏÁö ¾Ê´Â ¸®½ºÆ®ºä ÄÁÆ®·ÑÀÌ´Ù. int nIndex; LV_ITEM item; // - ù¹ø° Ä÷³ - item.mask = LVIF_TEXT; // À̹ÌÁö ¸®½ºÆ®¸¦ »ç¿ëÇÏ·Á¸é LVIF_IMAGE¸¦ Ãß°¡ÇÏ°í // ºÎ°¡Á¤º¸¸¦ ÁöÁ¤ÇؾßÇÒ ÀÏÀÌ ÀÖ´Ù¸é LVIF_PARAMÀ» Ãß°¡ÇÑ´Ù. item.pszText = lpDocName; item.cchTextMax = strlen(lpDocName); item.iItem = 1; item.iSubItem = 0; nIndex = ListView_InsertItem(hListView, &item); // - µÎ¹ø° Ä÷³ - item.mask = LVIF_TEXT; item.iItem = nIndex; item.pszText = lpDate; item.cchTextMax = strlen(lpDate); item.iSubItem = 1; ListView_SetItem(hListView, &item); // - ¼¼¹ø° Ä÷³ - item.mask = LVIF_TEXT; item.iItem = nIndex; item.pszText = ""; item.cchTextMax = strlen(lpDocName); item.iSubItem = 2; ListView_SetItem(hListView, &item); 9. ¸®½ºÆ®ºä ÄÁÆ®·Ñ¿¡¼­ÀÇ Á¤·Ä ±¸Çö¸®½ºÆ®ºä ÄÁÆ®·Ñ¿¡¼­ Ä®·³ Çì´õ¸¦ ´­·¶À» ¶§ Á¤·ÄÀÌ µÇµµ·Ï ÇÏ·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? ÀÏ´Ü ¸®½ºÆ®ºä ÄÁÆ®·ÑÀÇ »ý¼º½Ã À©µµ¿ì ½ºÅ¸ÀÏ·Î LVS_NOSORTHEADER¸¦ ÁÖÁö ¾Ê´Â´Ù. ¸®½ºÆ®ºä·ÎºÎÅÍ Ä®·³ Çì´õ°¡ ´­·ÈÀ» ¶§ ¿À´Â À̺¥Æ®¸¦ ¹Þ¾ÆµéÀδÙ. NM_LISTVIEW *pnmtv = (NM_LISTVIEW FAR *)lParam; switch(pnmtv->hdr.code) { case LVN_COLUMNCLICK : { // ¾î´À Ç׸ñ(pnmtv->iSubItem)ÀÌ ´­·È´ÂÁöºÎÅÍ °Ë»çÇÑ´Ù. // g_iSubItemÀº ¾î´À Ç׸ñÀÌ ´­·È´ÂÁö ±â·ÏÇصδ À妽ºÀÌ´Ù. g_iSubItem = pnmtv->iSubItem; // Á¤·ÄÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. CompareFunc°¡ Á¤·ÄÇÔ¼öÀÌ´Ù. ListView_SortItems(hListView, (PFNLVCOMPARE)CompareFunc, (LPARAM)this); break; }¸®½ºÆ®ºä Ç׸ñÀ» Á¤·ÄÇϴµ¥ »ç¿ëµÇ´Â CompareFunc¶ó´Â ÇÔ¼ö¸¦ ¸¸µç´Ù. ÀÌ´Â º¸Åë C ÇÔ¼ö·Î ¸¸µé°Å³ª Ŭ·¡½º¸¦ »ç¿ëÇÒ °æ¿ì¿¡´Â Ŭ·¡½º ³»ÀÇ static ÇÔ¼ö·Î ¸¸µç´Ù. CompareFuncÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù. int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { LV_FINDINFO lvfi; int iFirstItem, iSecondItem; lvfi.flags = LVFI_PARAM; lvfi.lParam = lParam1; iFirstItem = ListView_FindItem(hListWnd, -1, &lvfi); lvfi.flags = LVFI_PARAM; lvfi.lParam = lParam2; iSecondItem = ListView_FindItem(hListWnd, -1, &lvfi); char lpFirst[100]; char lpSecond[100]; ListView_GetItemText(hListWnd, iFirstItem, g_iSubItem, lpFisrt, 100); ListView_GetItemText(hListWnd, iSecondItem, g_iSubItem, lpSecond, 100); // g_iSubItem Ä÷³ÀÇ ¼º°Ý¿¡ µû¶ó ºñ±³ÇÑ´Ù. ¹®ÀÚ¿­À̶ó¸é ¾Æ·¡¿Í °°ÀÌ ÇÑ´Ù. int iRet = strcmpi(lpFirst, lpSecond); return iRet; } 10. ¹öÀü Á¤º¸ ¾Ë¾Æ³»±â ÄÚµåÆÄÀÏÀÇ ¹öÀüÀ» API¸¦ ÅëÇØ ¾Ë¾Æ³»·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? ResourceÀÇ ÇÑ Å¸ÀÔÀ¸·Î VERSIONINFO¶ó´Â °ÍÀÌ Á¸ÀçÇÕ´Ï´Ù. ¿©±â¿¡ ÇØ´ç ÆÄÀÏÀÇ ¹öÀü Á¤º¸¸¦ ±â·ÏÇϵµ·Ï µÇ¾îÀÖ½À´Ï´Ù. ÀÌ ¹öÀü Á¤º¸¸¦ Àоî¿À´Âµ¥ ver.dllÀ̶ó´Â DLL¿¡ µé¾îÀÖ´Â APIµéÀ» »ç¿ëÇÕ´Ï´Ù. ÁÖÀÇÇÒ Á¡Àº ¹öÀü ¸®¼Ò½º´Â ¾ð¾îº°·Î ¼³Á¤ÀÌ µÇ±â ¶§¹®¿¡ ¿µ¾î·Îµµ Àо°í Çѱ¹¾î ·Îµµ ÀоîºÁ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½ ¿¹Á¦¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù. // szDrvNameÀ̶õ ÆÄÀÏ¿¡ µé¾îÀÖ´Â ¹öÀü Á¤º¸¸¦ Àоî¿Â´Ù. #include DWORD dwSize, handle; LPSTR lpstrVffInfo; HANDLE hMem; LPSTR lpVersion; // ÀÌ º¯¼ö·Î ÆÄÀÏÀÇ ¹öÀü Á¤º¸°¡ µé¾î¿Â´Ù. char szDrvName[80]; // ¹öÀü Á¤º¸¸¦ ¾Ë¾Æ³»°íÀÚ ÇÏ´Â ÆÄÀÏ À̸§ÀÌ ¿©±â¿¡ µé¾î¿Â´Ù. .... // ¹öÀü Á¤º¸ ºí·ÏÀÇ Å©±â¸¦ ¾Ë¾Æ¿Â´Ù. dwSize = GetFileVersionInfoSize(szDrvName , &handle); if (dwSize) // ¹öÀü Á¤º¸ ºí·ÏÀÌ Á¸ÀçÇϸé { // ¹öÀü Á¤º¸ ºí·ÏÀ» Æ÷ÇÔÇÒ ¸Þ¸ð¸® ºí·ÏÀ» ÇÒ´ç ¹Þ¾ÆµÐ´Ù. hMem = GlobalAlloc(GMEM_MOVEABLE, dwSize); lpstrVffInfo = GlobalLock(hMem); // ¹öÀü Á¤º¸ ºí·ÏÀÇ ³»¿ëÀ» Àоî¿Â´Ù. GetFileVersionInfo(szDrvName, handle, dwSize, lpstrVffInfo); // ¹öÀü Á¤º¸ ºí·Ï¿¡¼­ ¹öÀü Á¤º¸¸¦ Àоî¿Â´Ù. VerQueryValue((LPVOID)lpstrVffInfo, (LPSTR)"file://stringfileinfo//041204B0//FileVersion", (void FAR* FAR*)&lpVersion, (UINT FAR *)&dwSize); // lpVersion¿¡ µé¾îÀÖ´Â ¹öÀü Á¤º¸¸¦ »ç¿ëÇÑ´Ù. .... GlobalUnlock(hMem); GlobalFree(hMem); }À§¿¡¼­ 041204B0°¡ ¹Ù·Î ¹öÀü ¸®¼Ò½º¿¡ »ç¿ëµÈ ¾ð¾î°¡ ¹«¾ùÀÎÁö¸¦ ³ªÅ¸³À´Ï´Ù. ÀÌ´Â ¿µ¾î¸¦ ³ªÅ¸³»¸ç Çѱ¹¾îÀÇ °æ¿ì¿¡´Â 040904B0¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ÀÌ ¹Û¿¡µµ version.lib¸¦ ¸µÅ©ÀÇ ¶óÀ̺귯¸® Ç׸ñ¿¡ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù. 11. ½Ã½ºÅÛ »ç¾ç ¾Ë¾Æ³»±â ÇöÀç ½Ã½ºÅÛ¿¡ ºÎÂøµÇ¾î ÀÖ´Â ¸ÞÀÎ ¸Þ¸ð¸®ÀÇ ¾ç°ú CPU¿Í ¿î¿µÃ¼Á¦ÀÇ Á¾·ù¸¦ ¾Ë°í ½Í½À´Ï´Ù. ¸ÕÀú ½Ã½ºÅÛ¿¡ ºÎÂøµÇ¾î ÀÖ´Â ¸ÞÀÎ ¸Þ¸ð¸®ÀÇ Å©±â´Â GlobalMemoryStatus¶ó´Â API¸¦ ÀÌ¿ëÇÏ¸é µË´Ï´Ù. ¿¹Á¦ ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù. //=========================================================== // lMemTotal : ½ÇÁ¦ ¸Þ¸ð¸®ÀÇ Àüü Å©±â (KB ´ÜÀ§) // lAvailMemTotal : »ç¿ë °¡´ÉÇÑ ½ÇÁ¦ ¸Þ¸ð¸®ÀÇ Å©±â (KB ´ÜÀ§) // lVirtualTotal : °¡»ó ¸Þ¸ð¸®ÀÇ Àüü Å©±â (KB ´ÜÀ§) //=========================================================== void GetMemoryStatus(long *lMemTotal, long *lAvailMemTotal, long *lVirtualTotal) { double var; MEMORYSTATUS memoryStatus; memset (&memoryStatus, sizeof (MEMORYSTATUS), 0); memoryStatus.dwLength = sizeof (MEMORYSTATUS); GlobalMemoryStatus (&memoryStatus); lMemTotal = memoryStatus.dwTotalPhys / 1024; lAvailMemTotal = memoryStatus.dwAvailPhys / 1024; lVirtualTotal = memoryStatus.dwTotalVirtual / 1024; }´ÙÀ½À¸·Î CPUÀÇ Á¾·ù¸¦ ¾Ë¾Æ³»´Â ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù. //=============================================================== // GetProcessorInfo : ÇÁ·Î¼¼¼­¿¡ ´ëÇÑ Á¤º¸¸¦ Àоî¿Â´Ù. // lpCPUSpeed : CPUÀÇ ¼Óµµ. ±â·ÏµÈ ½Ã½ºÅÛ¿¡¼­¸¸ Àоî¿Â´Ù. // lpProcessorType : ÇÁ·Î¼¼¼­ÀÇ Á¾·ù // lpNumProcessors : ÇÁ·Î¼¼¼­ÀÇ °³¼ö. NTÀÇ °æ¿ì¿¡¸¸ Àǹ̰¡ ÀÖ´Ù. //=============================================================== void GetProcessorInfo(LPSTR lpCPUSpeed, LPSTR lpProcessorType, LPSTR lpNumProcessors) { SYSTEM_INFO sysInfo; LONG result; HKEY hKey; DWORD data; DWORD dataSize; lpCPUSpeed[0] = 0; // --------------------------------------------- // ÇÁ·Î¼¼¼­ÀÇ ¼Óµµ¸¦ ¾ò¾î³½´Ù. // --------------------------------------------- result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey); if (result == ERROR_SUCCESS) { result = ::RegQueryValueEx (hKey, "~MHz", NULL, NULL,(LPBYTE)&data, &dataSize); wsprintf(lpCPUSpeed, "%d MHz", data); } RegCloseKey (hKey); // ------------------------------------------ // Çϵå¿þ¾î Á¤º¸¸¦ ¾ò¾î³½´Ù. // ------------------------------------------ GetSystemInfo (&sysInfo); // ÇÁ·Î¼¼¼­ ŸÀÔºÎÅÍ °Ë»çÇÑ´Ù. if (sysInfo.dwProcessorType == PROCESSOR_INTEL_386) strcpy(lpProcessorType, "Intel 386"); else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_486) strcpy(lpProcessorType, "Intel 486"); else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_PENTIUM) { if (sysInfo.wProcessorLevel == 6) strcpy(lpProcessorType, "Intel Pentium (II/Pro)"); else strcpy(lpProcessorType, "Intel Pentium"); } else strcpy(lpProcessorType, "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ"); // ÇÁ·Î¼¼¼­ÀÇ °¹¼ö¸¦ °Ë»çÇÑ´Ù. wsprintf(lpNumProcessors, "%d", sysInfo.dwNumberOfProcessors); } ´ÙÀ½À¸·Î ÇöÀç »ç¿ë ÁßÀÎ ¿î¿µÃ¼Á¦ÀÇ Á¾·ù¸¦ ¾Ë¾Æ³»´Â ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù. //=============================================================== // GetOSVersion : OSÀÇ ¹öÀüÀ» ¾ò¾î¿Â´Ù. // -------------------------------------------------------------- // lpstInfo // lpstBuildNumber // lpstServicePack //=============================================================== void GetOSVersion (LPSTR lpstInfo, LPSTR lpstBuildNumber, LPSTR lpstServicePack) { int stat = 0; TCHAR data [64]; DWORD dataSize; DWORD win95Info; OSVERSIONINFO versionInfo; HKEY hKey; LONG result; lpstServicePack[0] = 0; versionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); // ¹öÀü Á¤º¸¸¦ ¾ò¾î³½´Ù. if (!::GetVersionEx (&versionInfo)) { strcpy(lpstInfo, "¿î¿µÃ¼Á¦ Á¤º¸¸¦ ¾òÀ» ¼ö ¾ø½À´Ï´Ù."); return; } // NTÀÌ¸é ¼­¹öÀÎÁö ¿÷½ºÅ×À̼ÇÀÎÁö °Ë»çÇÑ´Ù. ÀÌ´Â ·¹Áö½ºÆ®¸®¸¦ º¸°í °Ë»çÇÑ´Ù. if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { strcpy(lpstInfo, "Windows NT"); dataSize = sizeof (data); result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey); if (result != ERROR_SUCCESS) return; result = ::RegQueryValueEx (hKey, "ProductType", NULL, NULL, (LPBYTE) data, &dataSize); RegCloseKey (hKey); if (result != ERROR_SUCCESS) return; if (lstrcmpi (data, "WinNT") == 0) strcpy(lpstInfo, "Windows NT Workstation"); else if (lstrcmpi (data, "ServerNT") == 0) strcpy(lpstInfo, "Windows NT Server"); else strcpy(lpstInfo, "Windows NT Server - Domain Controller"); // NT ¹öÀüÀ» ¾Ë¾Æ³½´Ù. if (versionInfo.dwMajorVersion == 3 versionInfo.dwMinorVersion == 51) strcat(lpstInfo, " 3.51"); else if (versionInfo.dwMajorVersion == 5) // À©µµ¿ì 2000ÀÇ °æ¿ì strcat(lpstInfo, " 5.0"); else strcat(lpstInfo, " 4.0"); // Build ¹øÈ£¸¦ ¾Ë¾Æ³½´Ù. wsprintf(lpstBuildNumber, "%d", versionInfo.dwBuildNumber); } else if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { strcpy(lpstInfo, "Windows 95"); if ((versionInfo.dwMajorVersion > 4) ((versionInfo.dwMajorVersion == 4) && (versionInfo.dwMinorVersion > 0))) { strcpy(lpstInfo, "Windows 98"); } // À©µµ¿ì 95´Â Build ¹øÈ£°¡ ÇÏÀ§ ¿öµå¿¡ µé¾î°£´Ù. win95Info = (DWORD)(LOBYTE(LOWORD(versionInfo.dwBuildNumber))); wsprintf(lpstBuildNumber, "%d", win95Info); } else wsprintf(lpstInfo, "Windows 3.1"); // ¼­ºñ½º ÆÑ Á¤º¸¸¦ ¾ò¾î³½´Ù. strcpy(lpstServicePack, versionInfo.szCSDVersion); } 12. IEÀÇ ¼³Ä¡ ¿©ºÎ¿Í ¹öÀü È®ÀÎÇöÀç ½Ã½ºÅÛ¿¡ IE°¡ ¼³Ä¡µÇ¾ú´ÂÁö ¿©ºÎ¿Í ±× ¹öÀüÀ» ¾Ë·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? »ç½Ç µ¿ÀÛ½ÃÄѺ¸Áö ¾Ê°í¼­´Â IE°¡ Á¦´ë·Î ¼³Ä¡µÇ¾îÀÖ´ÂÁö ¾Ë¾Æ³»´Â ¹æ¹ýÀº ¾øÁö¸¸ ·¹Áö½ºÆ®¸®¸¦ ÅëÇØ IE°¡ ¼³Ä¡µÇ¾ú´ÂÁö ¿©ºÎ¿Í ¹öÀüÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. ±× ÇÔ¼ö´Â ´ÙÀ½°ú °°½À´Ï´Ù. //=========================================================================== // GetIEVersion : IEÀÇ ¹öÀüÀ» ¾ò´Â´Ù. Á¤º¸¸¦ ãÀ» ¼ö ¾øÀ¸¸é FALSE¸¦ ¸®ÅÏÇÑ´Ù. //=========================================================================== BOOL GetIEVersion(LPSTR lpVer) { LONG result; HKEY hKey; DWORD dwType; char data[65]; DWORD dataSize = 64; // -------------------- // IEÀÇ ¹öÀüÀ» ¾ò´Â´Ù. // -------------------- result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Internet Explorer", 0, KEY_QUERY_VALUE, &hKey); if (result == ERROR_SUCCESS) { result = ::RegQueryValueEx (hKey, "Version", NULL, &dwType, (unsigned char *)data, &dataSize); strcpy(lpVer, data); } else return FALSE; RegCloseKey (hKey); return TRUE; } 13. IEÀÇ º¸¾È ¼³Á¤ º¸±âIE¿¡ º¸¸é ³× ´Ü°èÀÇ º¸¾È ¿µ¿ªÀÌ ÀÖ½À´Ï´Ù. ±× ¿µ¿ªº°·Î ¼³Á¤µÇ¾îÀÖ´Â º¸¾È ¼³Á¤°ªÀ» ÀÐÀ¸·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? IE¿¡´Â ´ÙÀ½°ú °°Àº ³× °¡Áö º¸¾È ¿µ¿ªÀÌ Á¸ÀçÇÕ´Ï´Ù. ÀÎÅÍ³Ý ¿µ¿ª ·ÎÄà ÀÎÅÍ³Ý ¿µ¿ª ½Å·ÚÇÒ ¼ö ÀÖ´Â »çÀÌÆ® ¿µ¿ª Á¦ÇÑµÈ »çÀÌÆ® ¿µ¿ª IE´Â º¸¾È ¿µ¿ª ¼³Á¤°ú °ü·ÃÇÏ¿© Internet Security Manager¿Í Internet Zone Manager¶ó´Â ÀÎÅÍÆäÀ̽º°¡ Á¸ÀçÇÕ´Ï´Ù. À̸¦ ÀÌ¿ëÇØ º¸¾È ¿µ¿ªÀÇ º¸¾ÈÀ» ¼³Á¤ÇÏ°í ƯÁ¤ IP³ª µµ¸ÞÀÎ À̸§À» µî·ÏÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº ·¹ÆÛ·±½º¸¦ ã¾Æº¸±â ¹Ù¶ø´Ï´Ù. #include "objbase.h" #include "urlmon.h" char szTemp1[256]; char szTemp2[256]; HRESULT hr; IInternetSecurityManager *pSecurityMgr; IInternetZoneManager *pZoneMgr; DWORD dwEnum, dwZoneCount; // --- º¯¼ö ¼±¾ðºÎ DWORD dwZone; ZONEATTRIBUTES zoneAttr; int nLevel = 2; // COM ¶óÀ̺귯¸®¸¦ ÃʱâÈ­ÇÑ´Ù. CoInitialize(NULL); dwEnum = 0; pSecurityMgr = NULL; pZoneMgr = NULL; // Internet Security ÀÎÅÍÆäÀ̽º ÃʱâÈ­ hr = CoCreateInstance(CLSID_InternetSecurityManager, NULL, CLSCTX_ALL, //INPROC_SERVER, IID_IInternetSecurityManager, (void**)&pSecurityMgr); if (hr != S_OK) { return; } hr = CoCreateInstance(CLSID_InternetZoneManager, NULL, CLSCTX_ALL, //INPROC_SERVER, IID_IInternetZoneManager, (void**)&pZoneMgr); if (hr != S_OK) { return; } dwEnum = 0; // º¸¾È ¿µ¿ª ¿­°ÅÀÚ(Zone Enumerator)¸¦ ÃʱâÈ­ÇÑ´Ù. pZoneMgr->CreateZoneEnumerator(&dwEnum, &dwZoneCount, 0); for(DWORD i = 1;i <>GetZoneAt(dwEnum, i, &dwZone); pZoneMgr->GetZoneAttributes(dwZone, &zoneAttr); // zoneAttr.szDisplayName¿¡ º¸¾È ¿µ¿ªÀÇ À̸§ÀÌ µé¾î¿À´Âµ¥ À¯´ÏÄÚµåÀÌ´Ù. À̸¦ º¯È¯ÇÑ´Ù. WideCharToMultiByte(CP_ACP, 0, zoneAttr.szDisplayName, -1, szTemp1, 255, NULL, NULL); // zoneAttr.dwTemplateCurrentLevel¿¡´Â º¸¾È ¿µ¿ªÀÇ º¸¾È°ª ¼³Á¤ÀÌ µé¾î¿Â´Ù. wsprintf(szTemp2, "%x", zoneAttr.dwTemplateCurrentLevel); } // º¸¾È ¿µ¿ª ¿­°ÅÀÚ(Zone Enumerator)¸¦ Á¦°ÅÇÑ´Ù. if (dwEnum != 0) pZoneMgr->DestroyZoneEnumerator(dwEnum); pSecurityMgr->Release(); pZoneMgr->Release(); // COM ¶óÀ̺귯¸®¸¦ ¸Þ¸ð¸®¿¡¼­ ³»¸°´Ù. CoUninitialize();} 14. ActiveX ÄÁÆ®·ÑÀÇ µî·Ï ¹æ¹ýRegsvr32 °°Àº À¯Æ¿¸®Æ¼¸¦ ÀÌ¿ëÇÏÁö ¾Ê°í ÇÁ·Î±×·¥ ³»¿¡¼­ ÄÁÆ®·ÑÀ» ·¹Áö½ºÆ®¸®¿¡ µî·ÏÇÏ·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? ¸ðµç AcitveX ÄÁÆ®·ÑÀº ÀÚ½ÅÀ» ·¹Áö½ºÆ®¸®¿¡ µî·ÏÇϱâÀ§ÇÑ ¸ñÀûÀ¸·Î DllRegisterServer¶ó´Â ÇÔ¼ö¸¦ °®°í ÀÖ½À´Ï´Ù. ActiveX ÄÁÆ®·ÑÀ» ¸Þ¸ð¸®·Î ·ÎµåÇÑ ´ÙÀ½¿¡ ÀÌ ÇÔ¼ö¸¦ ºÒ·¯ÁÖ¸é ¿øÇÏ´Â ÀÏÀ» ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹Ý´ë·Î ActiveX ÄÁÆ®·ÑÀ» ·¹Áö½ºÆ®¸®¿¡¼­ Á¦°ÅÇϱâ À§ÇÑ ¿ëµµ·Î DllUnRegisterServer¶ó´Â ÇÔ ¼öµµ Á¸ÀçÇÕ´Ï´Ù. // ============================================================== // RegisterOCX ÁöÁ¤µÈ ActiveX ÄÁÆ®·ÑÀ» ·¹Áö½ºÆ®¸®¿¡ µî·ÏÇÑ´Ù. // -------------------------------------------------------------- // LPSTR pszString µî·ÏÇÏ°íÀÚ ÇÏ´Â ActiveX ÄÁÆ®·ÑÀÇ Àý´ë °æ·Î¸í // ============================================================== BOOL WINAPI RegisterOCX(LPSTR pszString) { int iReturn = 0; HRESULT (STDAPICALLTYPE * lpDllEntryPoint)(); HINSTANCE hLib; // OLE ¶óÀ̺귯¸®¸¦ ÃʱâÈ­ÇÑ´Ù. if (FAILED(OleInitialize(NULL))) { MessageBox(GetFocus(), "OLE ÃʱâÈ­ ½ÇÆÐ", "¿¡·¯", MB_OK); return FALSE; } // ÁöÁ¤µÈ activeX ÄÁÆ®·ÑÀ» ¸Þ¸ð¸®·Î ·ÎµåÇÑ´Ù. hLib = LoadLibrary(pszString); if (hLib <= NULL) { MessageBox(GetFocus(), "ÆÄÀÏÀ» ·ÎµåÇϴµ¥ ½ÇÆÐÇß½À´Ï´Ù.", "¿¡·¯", MB_OK); OleUninitialize(); return FALSE; } // "DllRegisterServer" ÇÔ¼öÀÇ À§Ä¡¸¦ ã´Â´Ù. lpDllEntryPoint = (long (__stdcall *)(void))GetProcAddress(hLib, "DllRegisterServer"); // ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. if (lpDllEntryPoint) { if (FAILED((*lpDllEntryPoint)())) { DWORD dwRet; char szTemp[128]; dwRet = GetLastError(); wsprintf(szTemp, "¿¡·¯ ¹øÈ£ : %lx", dwRet); MessageBox(GetFocus(), szTemp, "DllRegisterServer ¿¡·¯", MB_OK); FreeLibrary(hLib); OleUninitialize(); return FALSE; } } else { MessageBox(GetFocus(), "DllRegisterServer¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.", "¿¡·¯", MB_OK); FreeLibrary(hLib); OleUninitialize(); return FALSE; } FreeLibrary(hLib); OleUninitialize(); return TRUE; } 15. µ¥ÀÌÅÍ ÆÄÀÏÀÇ ½ÇÇàŽ»ö±â¿¡¼­ ½ÇÇà ÆÄÀÏÀÌ ¾Æ´Ñ µ¥ÀÌÅÍ ÆÄÀÏÀ» ´õºíŬ¸¯ÇÏ¸é ±× µ¥ÀÌÅÍ ÆÄÀÏ°ú ¿¬°áµÈ ½ÇÇà ÆÄÀÏÀÌ ½ÇÇàµÇ¸é¼­ ±× ÆÄÀÏÀ» ¹°°í ¿Ã¶ó°©´Ï´Ù. À̸¦ ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¾Ë·ÁÁÖ¼¼¿ä. ShellExecuteEx¶ó´Â API¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÀÎÀÚ·Î µ¥ÀÌÅÍ ÆÄÀÏ È¤Àº ½ÇÇà ÆÄÀÏÀÇ °æ·Î¸¦ ¹Þ¾Æ¼­ ½ÇÇàÇØÁÝ´Ï´Ù. µ¥ÀÌÅÍ ÆÄÀÏÀÇ °æ¿ì¿¡´Â ¿¬°áµÈ ½ÇÇà ÆÄÀÏÀ» ã¾Æ¼­ ±×°É ½ÇÇàÇØÁÝ´Ï´Ù. BOOL Execute(LPSTR lpPath) { char FilePath[255]; SHELLEXECUTEINFO ExecInfo; // lpPath¸¦ ³ª´©¾î º»´Ù. char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _splitpath(lpPath, drive, dir, fname, ext); // µð·ºÅ丮 °æ·Î¸¦ ¾ò´Â´Ù. strcpy(FilePath, drive); strcat(FilePath, dir); // ÆÄÀÏ À̸§À» ¾ò´Â´Ù. strcat(fname, "."); strcat(fname, ext); SHELLEXECUTEINFO ExecInfo; ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ExecInfo.hwnd = hWnd; ExecInfo.lpVerb = "open"; ExecInfo.lpFile = fname; ExecInfo.lpParameters = NULL; ExecInfo.lpDirectory = FilePath; ExecInfo.nShow = SW_SHOW; ExecInfo.hInstApp = g_hInstance; // g_hInstance´Â ÇÁ·Î±×·¥ÀÇ ÀνºÅϽº ÇÚµé return ShellExecuteEx(&ExecInfo); } 16. ÆÄÀÏÀÇ Á¸Àç ¿©ºÎ Å×½ºÆ® ¾î¶² ÆÄÀÏÀÌ ½ÇÁ¦·Î Á¸ÀçÇÏ´Â °ÍÀÎÁö °£´ÜÈ÷ Å×½ºÆ®Çغ¸´Â ¹æ¹ýÀº ¹«¾ùÀΰ¡¿ä ? CreateFile API¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ÆÄÀÏÀ» ¿­¶§ Ç÷¡±× ÁßÀÇ Çϳª·Î OPEN_EXISTINGÀ̶ó´Â °ÍÀÌ Àִµ¥ À̸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ´ÙÀ½ Äڵ带 ¿¹·Î º¸½Ã±â ¹Ù¶ø´Ï´Ù. hFile = CreateFile("C:\\TEMP\\test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile != INVALID_HANDLE_VALUE) { // ÆÄÀÏÀÌ Á¸ÀçÇÏ´Â °æ¿ì CloseHandle(hFile); } 17. API¸¦ ÀÌ¿ëÇÑ ÆÄÀÏ I/OAPI¸¦ ÀÌ¿ëÇÑ ÆÄÀÏ ÀÔÃâ·Â¿¡ ´ëÇÑ ¿¹Á¦ Äڵ尡 ¾ø½À´Ï±î ? ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é °£È¤ ÆÄÀÏ I/O¸¦ API¸¦ ÀÌ¿ëÇØ ¼öÇàÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖ½À´Ï´Ù. ÀÌ ¶§ ´ÙÀ½ÀÇ ¿¹Á¦ Äڵ带 º¹»çÇشٰ¡ »ç¿ëÇϸé Æí¸®ÇÒ °ÍÀÔ´Ï´Ù. MFCÀÇ CFileÀ» ÀÌ¿ëÇÑ ÆÄÀÏ I/O¿¡ ´ëÇØ ¾Ë°í ½ÍÀ¸½Ã¸é ¿ä±â¸¦ Ŭ¸¯Çϼ¼¿ä. ÆÄÀÏ ¾²±âÀÇ °æ¿ì HANDLE fp; DWORD NumberOfBytesWritten; char lpBuffer[1024]; // FileNameÀÌ ÁöÁ¤ÇÑ ÆÄÀÏÀÇ À̸§ÀÌ ÀÖÀ¸¸é ±×°É ¿­°í ¾øÀ¸¸é ±× À̸§À¸·Î Çϳª »ý¼ºÇÑ´Ù. if ((fp=CreateFile((LPCTSTR)FileName, GENERIC_WRITE GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { // ÆÄÀÏ ¿­±â ¿¡·¯ ¹ß»ý } // ÇÊ¿äÇÑ ¸¸Å­ WriteFileÀÇ È£ÃâÀ» ¹Ýº¹ÇÑ´Ù. ÆÄÀÏ Æ÷ÀÎÅÍÀÇ À̵¿½Ã¿¡´Â SetFilePointer API¸¦ ÀÌ¿ëÇÑ´Ù. WriteFile(fp, lpBuffer, 1024, &NumberOfBytesWritten, NULL); if (NumberOfBytesWritten != 1024) { // ÆÄÀÏ ¾²±â ¿¡·¯ ¹ß»ý CloseHandle(fp); } // ÀÛ¾÷ÀÌ ´Ù ³¡³µÀ¸¸é ÆÄÀÏÀ» ´Ý´Â´Ù. CloseHandle(fp); ÆÄÀÏ ÀбâÀÇ °æ¿ì HANDLE fp; DWORD NumberOfBytesRead; char lpBuffer[1024]; if ((fp=CreateFile((LPCTSTR)FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { // ÆÄÀÏ ¿­±â ¿¡·¯ ¹ß»ý } // ÇÊ¿äÇÑ ¸¸Å­ ReadFileÀÇ È£ÃâÀ» ¹Ýº¹ÇÑ´Ù. ReadFile(fp, lpBuffer, 1024, &NumberOfBytesRead, NULL); if (NumberOfBytesRead != 1024) { // ÆÄÀÏ Àб⠿¡·¯ ¹ß»ý CloseHandle(fp); } // ÀÛ¾÷ÀÌ ´Ù ³¡³µÀ¸¸é ÆÄÀÏÀ» ´Ý´Â´Ù. CloseHandle(fp); ÆÄÀÏ Æ÷ÀÎÅÍÀÇ À̵¿½Ã¿¡´Â SetFilePointer¶ó´Â API¸¦ »ç¿ëÇÏ°í ÆÄÀÏÀÇ Å©±â¸¦ ¾Ë°í ½ÍÀ» ¶§´Â GetFileSize¶ó´Â API¸¦ »ç¿ëÇÑ´Ù. 18. GetParent APIÀÇ ¸®ÅÏ°ª´ÙÀ̾ó·Î±× ¹Ú½º¿¡¼­ GetParent API¸¦ È£ÃâÇßÀ» ¶§ ¸®ÅϵǴ °ªÀÌ ÀÌ»óÇÕ´Ï´Ù. GetParent APIÀÇ ¸®ÅÏ°ªÀº º¸ÅëÀÇ À©µµ¿ì¿¡¼­´Â À©µµ¿ì »ý¼º½Ã ÁöÁ¤ÇÑ ºÎ¸ð/ÀÚ½Ä À©µµ¿ì °£ÀÇ °ü°è¿¡ µû¶ó ´Þ¶óÁý´Ï´Ù. ÇÏÁö¸¸ ´ÙÀ̾ó·Î±× ¹Ú½ºÀÇ °æ¿ì¿¡´Â ´Ù¸¨´Ï´Ù. ´ÙÀ̾ó·Î±× ¹Ú½º´Â GetParent¸¦ È£ÃâÇÏ¸é ¹«Á¶°Ç ±× °ÍÀÌ ¼ÓÇÑ ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ¸ÞÀÎ À©µµ¿ì ÇÚµéÀÌ ¸®Åϵ˴ϴÙ. 19. ƯÁ¤ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í Á¾·á¸¦ ±â´Ù¸®±âƯÁ¤ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ ´ÙÀ½¿¡ ±× ÇÁ·Î±×·¥ÀÌ Á¾·áµÉ ¶§ ´Ù¸¥ ÀÏÀ» ÇÏ°í ½Í½À´Ï´Ù. ¾î¶»°Ô ÇؾßÇմϱî ? ´ÙÀ½Àº CreateProcess¸¦ ÀÌ¿ëÇؼ­ ƯÁ¤ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀÌ ³¡³ª±â¸¦ ±â´Ù¸®´Â ÄÚµåÀÔ´Ï´Ù. // buffer¿¡ ½ÇÇàÇÏ°íÀÚÇÏ´Â ÆÄÀÏÀ̸§ÀÌ µé¾î¿Â´Ù. void DoCreate(HWND hWnd, LPSTR buffer) { STARTUPINFO sui; PROCESS_INFORMATION pi; DWORD ret; memset(&sui, 0x00, sizeof(STARTUPINFO)); sui.cb = sizeof(STARTUPINFO); ret = CreateProcess(buffer, NULL, NULL, NULL, FALSE, 0, NULL, NULL,&sui, &pi); if (ret == TRUE) // Á¦´ë·Î ½ÇÇàµÇ¾úÀ¸¸é { hProcess = pi.hProcess; // ½ÇÇàÀÌ ³¡³ª±â¸¦ ´ë±âÇÑ´Ù. WaitForSingleObject(hProcess, 0xffffffff); CloseHandle(hProcess); } } 20. ÆÄÀÏ ¿­±â ´ÙÀ̾ó·Î±× ¶ç¿ì±âAPI¸¦ ÀÌ¿ëÇØ ÆÄÀÏ ¿ÀÇ ´ÙÀ̾ó·Î±×¸¦ ¶ç¿ì°í ½Í½À´Ï´Ù. API¸¦ ÀÌ¿ëÇØ ÆÄÀÏ ¿ÀÇ ´ÙÀ̾ó·Î±×¸¦ ¶ç¿ì´Â ¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù. #define MAXCHARS 255 OPENFILENAME ofn; char buffer[MAXCHARS]; memset(&ofn, 0x00, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = "¸ðµç ÆÄÀÏ\000*.*\000\000"; ofn.lpstrInitialDir = m_szTemp; ofn.nFilterIndex = 1; ofn.lpstrFile = buffer; ofn.nMaxFile = MAXCHARS; ofn.lpstrTitle = "ÆÄÀÏ ¼±ÅÃÇϱâ"; if (GetOpenFileName(&ofn)) // »ç¿ëÀÚ°¡ ÆÄÀÏÀ» Á¦´ë·Î ¼±ÅÃÇÑ °æ¿ì { // .... } 21. ±ä ÆÄÀÏ À̸§°ú ªÀº ÆÄÀÏ À̸§°£ÀÇ º¯È¯ ¹æ¹ýÁÖ¾îÁø ±ä ÆÄÀÏ À̸§¿¡ ÇØ´çÇϴ ªÀº ÆÄÀÏ À̸§À» ¾Ë·Á¸é ¾î¶»°Ô ÇؾßÇϳª¿ä ? ±ä ÆÄÀÏ À̸§¿¡¼­ ªÀº ÆÄÀÏ À̸§À¸·ÎÀÇ º¯È¯ : GetShortPathName API »ç¿ë ªÀº ÆÄÀÏ À̸§¿¡¼­ ±ä ÆÄÀÏ À̸§À¸·ÎÀÇ º¯È¯ : GetFullPathName API »ç¿ë 22. ½Ã½ºÅÛ À̹ÌÁö ¸®½ºÆ® ¾ò¾î³»±âŽ»ö±â µî¿¡¼­ »ç¿ëµÇ´Â ½Ã½ºÅÛ À̹ÌÁö ¸®½ºÆ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÀÖ´ÂÁö ¾Ë°í ½Í½À´Ï´Ù. ¹°·Ð ÀÖ½À´Ï´Ù. SHGetFileInfo¶ó´Â API¸¦ ÀÌ¿ëÇÏ¸é µË´Ï´Ù. À̸¦ ÀÌ¿ëÇϸé 16X16À̳ª 32X32 Å©±âÀÇ À̹ÌÁö ¸®½ºÆ®¸¦ ¾ò¾î³¾ ¼ö ÀÖ½À´Ï´Ù. SHFILEINFO sfi; HIMAGELIST sysSmallList, sysLargeList; sysSmallList = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX SHGFI_SMALLICON); sysLargeList = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX SHGFI_ICON); 23. ¸®½ºÆ®ºä ÄÁÆ®·Ñ¿¡¼­ ½ºÅ¸ÀÏ µ¿Àû º¯°æÇϱ⸮½ºÆ®ºä ÄÁÆ®·Ñ¿¡¼­ ¸®½ºÆ®(LVS_ICON) ½ºÅ¸ÀÏÀ» »ç¿ë ÁßÀε¥ À̸¦ ½ÇÇà Áß¿¡ ¸®Æ÷Æ®(LVS_REPORT) ½ºÅ¸ÀÏ·Î º¯°æÇÏ°í ½Í½À´Ï´Ù. ¾î¶»°Ô ÇؾßÇÒ±î¿ä ? À©µµ¿ìÀÇ ½ºÅ¸ÀÏÀº À©µµ¿ì ¿¢½ºÆ®¶ó ¹ÙÀÌÆ®¶ó´Â ¿µ¿ª¿¡ ÀúÀåµË´Ï´Ù. ÀÌ °÷ÀÇ µ¥ÀÌÅ͸¦ ÀÐ°í ¾²´Âµ¥ GetWindowLong, SetWindowLong °°Àº API¸¦ »ç¿ëÇϴµ¥ ´ÙÀ½ Äڵ带 ¿¹·Î º¸½Ã±â ¹Ù¶ø´Ï´Ù. ¸®½ºÆ® ½ºÅ¸ÀÏ¿¡¼­ ¸®Æ÷Æ® ½ºÅ¸ÀÏ·Î LONG lStyle = GetWindowLong(hListWnd, GWL_STYLE); SetWindowLong(hListWnd, GWL_STYLE, (lStyle & ~LVS_LIST) LVS_REPORT);¸®Æ÷Æ® ½ºÅ¸ÀÏ¿¡¼­ ¸®½ºÆ® ½ºÅ¸ÀÏ·Î LONG lStyle = GetWindowLong(hListWnd, GWL_STYLE); SetWindowLong(hListWnd, GWL_STYLE, (lStyle & ~LVS_REPORT) LVS_LIST); 24. À©µµ¿ì¿Í ´ÙÀ̾ó·Î±×¿¡¼­ Ŭ·¡½º Æ÷ÀÎÅÍÀÇ »ç¿ëÁ¦°¡ ¸¸µç C++ Ŭ·¡½º³»¿¡¼­ À©µµ¿ì¸¦ »ý¼ºÇÕ´Ï´Ù. »ý¼ºÇÑ À©µµ¿ìÀÇ À©µµ¿ì ÇÁ·Î½ÃÀú´Â ±× Ŭ·¡½ºÀÇ Á¤Àû ¸â¹ö ÇÔ¼ö·Î ¼±¾ðµÇ¾î ÀÖ½À´Ï´Ù. Á¤Àû ÇÔ¼öÀÇ °æ¿ì¿¡´Â µ¥ÀÌÅÍ ¸â¹ö¸¦ Á¢±ÙÇÏÁö ¸øÇϱ⠶§¹®¿¡ Á¢±ÙÇÏ°Ô ÇÏ·Á°í À©µµ¿ì¸¦ »ý¼ºÇÑ ±× Ŭ·¡½ºÀÇ °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Àü¿ª º¯¼ö·Î À¯ÁöÇÏ¿© »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù. º°·Î ±ú²ýÇÑ ¹æ¹ýµµ ¾Æ´Ñ °Í °°°í ¶Ç µ¿½Ã¿¡ ¿©·¯ °³ÀÇ °´Ã¼°¡ µ¿ÀÛÇÒ °æ¿ì¿¡´Â ¿¡·¯°¡ ³¯ ¼ö¹Û¿¡ ¾ø´Âµ¥ ÇØ°á ¹æ¹ýÀÌ ¾øÀ»±î¿ä ? ÀÌ´Â ´ÙÀ̾ó·Î±×ÀÇ °æ¿ì¿¡µµ ¸¶Âù°¡ÁöÀÔ´Ï´Ù. À©µµ¿ì »ý¼º½Ã »ç¿ëÇÏ´Â CreateWindow³ª CreateWindowEx °°Àº ÇÔ¼ö¸¦ º¸¸é ¸¶Áö¸· ÀÎÀÚ·Î À©µµ¿ì »ý¼º µ¥ÀÌÅͶó´Â °ÍÀ» ÁöÁ¤ÇÏ°Ô µÇ¾îÀÖ½À´Ï´Ù. ´ÙÀ̾ó·Î±× »ý¼º½Ã¿¡´Â DialogBox¶ó´Â API¸»°í DialogBoxParamÀ̶ó´Â API°¡ À־ ¸¶Áö¸· ÀÎÀÚ·Î ÃʱâÈ­ µ¥ÀÌÅ͸¦ ³Ñ°ÜÁÙ ¼ö ÀÖµµ·Ï µÇ¾îÀִµ¥ ÀÌ°Í°ú À©µµ¿ì ¿¢½ºÆ®¶ó ¹ÙÀÌÆ®¸¦ °°ÀÌ »ç¿ëÇϸé Á¤ÀûÇÔ¼ö·Î ¼±¾ðµÈ À©µµ¿ì ÇÁ·Î½ÃÀú³ª ´ÙÀ̾ó·Î±×¹Ú½º ÇÁ·Î½ÃÀú³»¿¡¼­ °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î »ìÆ캸°Ú½À´Ï´Ù. À©µµ¿ìÀÇ °æ¿ì ´ÙÀ½°ú °°ÀÌ CExplorerBar¶ó´Â Ŭ·¡½º³»¿¡¼­ À©µµ¿ì¸¦ Çϳª »ý¼ºÇÕ´Ï´Ù. CreateWindowEx ÇÔ¼ö³ª CreateWindow ÇÔ¼öÀÇ ¸¶Áö¸· ÀÎÀÚ·Î this Æ÷ÀÎÅ͸¦ ÁöÁ¤ÇÕ´Ï´Ù. BOOL CExplorerBar::RegisterAndCreateWindow(void) { .... CreateWindowEx( 0, EB_CLASS_NAME, NULL, WS_CHILD WS_CLIPSIBLINGS WS_BORDER, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, m_hwndParent, NULL, g_hInst, (LPVOID)this); }À§¿¡¼­ »ý¼ºÇÑ À©µµ¿ìÀÇ À©µµ¿ì ÇÁ·Î½ÃÀú´Â WndProcÀÌ°í CExplorerBar Ŭ·¡½ºÀÇ Á¤Àû ¸â¹ö ÇÔ¼ö·Î Á¸ÀçÇÑ´Ù°í °¡Á¤ÇÏ°Ú½À´Ï´Ù. LRESULT CALLBACK CExplorerBar::WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { CExplorerBar *pThis = (CExplorerBar*)GetWindowLong(hWnd, GWL_USERDATA); switch (uMessage) { case WM_NCCREATE: { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; pThis = (CExplorerBar*)(lpcs->lpCreateParams); SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis); } break; case WM_CREATE : return pThis->OnCreate();WM_NCCREATE ¸Þ½ÃÁö¿¡¼­ lParam ÀÎÀÚ·Î ³Ñ¾î¿À´Â CExplorerBar °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ¼­ À©µµ¿ì ¿¢½ºÆ®¶ó ¹ÙÀÌÆ®·Î ÀúÀåÇÏ°í ÀÖ½À´Ï´Ù. À©µµ¿ì ¿¢½ºÆ®¶ó ¹ÙÀÌÆ®´Â À©µµ¿ì ¸¶´Ù ÇÒ´çµÇ´Â °íÀ¯ÀÇ ¿µ¿ªÀ¸·Î »ç¿ëÀÚ Á¤ÀÇ ¿µ¿ªÀ¸·Î GWL_USERDATA°¡ Á¤ÀǵǾî ÀÖ½À´Ï´Ù. ¿©±â¿¡´Ù CExplorerBar °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀúÀåÇصΰí À©µµ¿ì ÇÁ·Î½ÃÀú¿¡ ÁøÀÔÇÒ ¶§¸¶´Ù ÀÌ °ªÀ» pThis¶ó´Â º¯¼ö¿¡ ´ëÀÔÇØ ³õ°í »ç¿ëÇÕ´Ï´Ù. Âü°í·Î WM_NCCREATE´Â WM_CREATE ¸Þ½ÃÁöº¸´Ù ¸ÕÀú ¹ß»ýÇÏ´Â ¸Þ½ÃÁöÀÔ´Ï´Ù. ´ÙÀ̾ó·Î±×ÀÇ °æ¿ì ¿¹¸¦ µé¾î CKTree¶ó´Â Ŭ·¡½º³»ÀÇ ÇÑ ¸â¹ö ÇÔ¼ö¿¡¼­ ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ¶ç¿î´Ù°í °¡Á¤ÇÏ°Ú½À´Ï´Ù. BOOL CKTree::SelectFolder(short sTypes, long dwFolderID, short bCreationEnabled) { // ...... if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_FOLDER_SELECT), hWnd, (DLGPROC)SelectFolderDlg, (LPARAM)this))DialogBoxParam ÇÔ¼ö´Â DialogBox ÇÔ¼öº¸´Ù ÀÎÀÚ°¡ Çϳª ´õ Àִµ¥ ±×°ÍÀÌ ¹Ù·Î ´ÙÀ̾ó·Î±× ÇÁ·Î½ÃÀúÀÇ WM_INITDIALOG ¸Þ½ÃÁöÀÇ lParam ÀÎÀÚ·Î ³Ñ¾î°©´Ï´Ù. ¿©±â¿¡ CKTree °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ±é´Ï´Ù. ±×¸®°í³ª¼­ ´ÙÀ̾ó·Î±× ¹Ú½º ÇÁ·Î½ÃÀúÀÇ WM_INITDIALOG ¸Þ½ÃÁö¿¡¼­ À̸¦ ¹Þ¾Æ¼­ LRESULT CALLBACK SelectFolderDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: { // lParamÀ¸·Î ³Ñ¾î¿Â °ªÀ» KPointer¶ó´Â À©µµ¿ì ÇÁ·ÎÆÛƼ¿¡ ÀúÀåÇÑ´Ù. SetProp(hDlg, "KPointer", (HANDLE)lParam); ....... case WM_NOTIFY : { // CKTree °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ°¡ ÇÊ¿äÇϸé KPointer À©µµ¿ì ÇÁ·ÎÆÛƼ °ªÀ» ÀоîµéÀδÙ. CKTree *pKTree = (CKMartTree *)GetProp(hDlg, "KPointer"); if (pKTree->m_bWait) { .....¿©±â¼­´Â ¾Õ¼­ À©µµ¿ì¿Í´Â ´Þ¸® À©µµ¿ì ÇÁ·ÎÆÛƼ¶ó´Â °ÍÀ» ÀÌ¿ëÇؼ­ ³Ñ¾î¿Â Æ÷ÀÎÅÍ Á¤º¸¸¦ ÀúÀåÇÏ°í ÇÊ¿äÇÒ ¶§ Àоî¿É´Ï´Ù. ¿©±â¼­ ¾Õ¼­ÀÇ À©µµ¿ì ¿¢½ºÆ®¶ó ¹ÙÀÌÆ®¸¦ »ç¿ëÇصµ ¹«¹æÇÕ´Ï´Ù. 25. ƯÁ¤ ÇÁ¸°ÅÍ·Î Ãâ·ÂÇϱâÁ¦ PC¿¡´Â µÎ ´ëÀÇ ÇÁ¸°ÅÍ°¡ ºÙ¾îÀÖ½À´Ï´Ù. ´ÙÀ̾ó·Î±×¸¦ ¶ç¿ìÁö ¾Ê°í »óȲ¿¡ µû¶ó ´Ù¸¥ ÇÁ¸°ÅÍ·Î Ãâ·ÂÇÏ°í ½ÍÀºµ¥ µ¿ÀûÀ¸·Î HDC¸¦ »ý¼ºÇÏ´Â ¹æ¹ýÀ» ¸ð¸£°Ú½À´Ï´Ù. CreateDC¸¦ ÀÌ¿ëÇÏ¸é µË´Ï´Ù. ½Ã½ºÅÛ µð·ºÅ丮ÀÇ WIN.INI¸¦ º¸¸é [Devices]¶ó´Â ¼½¼ÇÀÌ Àִµ¥ ÀÌ ¾Æ·¡·Î ÀÌ ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¸ðµç ÇÁ¸°ÅÍ µå¶óÀ̹öÀÇ ¸ñ·ÏÀÌ ³ª¿É´Ï´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ³ª¿É´Ï´Ù. [Devices] HUNFAX=HUNFAX,FaxModem »ï¼º SLB-6216H PCL5=SSMPCL5,\\¿µ¾÷ÆÀ\º¼·ýÇÁ¸°ÅÍ ......ÇÁ¸°Åͺ°·Î DeviceName=DriverName,OutputName¿Í °°Àº ±¸Á¶·Î ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù. ÀÌ °ªµéÀ» CreateDCÀÇ ÀÎÀÚ·Î »ç¿ëÇÏ¸é µË´Ï´Ù. ¿¹¸¦ µé¾î À§¿¡¼­ µÎ ¹ø° ÇÁ¸°ÅÍÀÇ DC¸¦ »ý¼ºÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ CreateDC¸¦ È£ÃâÇÕ´Ï´Ù. // hDC = CreateDC(DriverName, DeviceName, OutputName, NULL); hDC = CreateDC ("SSMPCL5", "»ï¼º SLB-6216H PCL5", "\\\\¿µ¾÷ÆÀ\\º¼·ýÇÁ¸°ÅÍ", NULL) ;CreateDCÀÇ ¸¶Áö¸· ÀÎÀڷδ ÇÁ¸°ÅÍÀÇ ¼³Á¤°ªÀ» º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î °¡·Î·Î Âï´Â´ÙµçÁö 2ÀåÀ» Âï´Â´ÙµçÁö ÇÏ´Â ¼³Á¤À» º¯°æÇϴµ¥ »ç¿ëµË´Ï´Ù. NULLÀ» ÁÖ¸é µðÆúÆ® °ªÀ» »ç¿ëÇÕ´Ï´Ù. ´Ù¸¥ ¼³Á¤À» »ç¿ëÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù. CreateDC È£Ãâ ¾Õ¿¡¼­ DocumentProperties¶ó´Â ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÇÁ¸°ÅÍÀÇ ±âº» ¼³Á¤À» Àоî¿Â ´ÙÀ½¿¡ À̸¦ º¯°æÇÕ´Ï´Ù. ´ÙÀ½ ¿¹´Â Ãâ·Â ¹æÇâÀ» °¡·Î·Î º¯°æÇÏ´Â ¿¹Á¦ÀÔ´Ï´Ù. // ÇÁ¸°ÅÍÀÇ µðÆúÆ® ¼³Á¤À» Àоî¿Â´Ù. LPDEVMODE lpoutDevMode; HANDLE hPrinter; HDC hPrnDC; // ÇÁ¸°ÅÍÀÇ ÇÚµéÀ» ¾ò´Â´Ù. if (OpenPrinter( lpDeviceName, &hPrinter, NULL)) { // OpenPrinter·Î ¾òÀº ÇÁ¸°ÅÍÀÇ Ãʱ⠼³Á¤À» DocumentProperties API·Î ¾ò¾î¿Â´Ù. // ¸ÕÀú ¸¶Áö¸· ÀÎÀÚ¸¦ 0À¸·Î Çؼ­ DocumentProperties¸¦ È£ÃâÇÏ¿© ÇÊ¿äÇÑ ¹öÆÛÀÇ Å©±â¸¦ ¾Ë¾Æ¿É´Ï´Ù. long lSize = DocumentProperties(GetFocus(), hPrinter, lpPrinterName, NULL, NULL, 0); lpoutDevMode = (LPDEVMODE)malloc(lSize); long lRet = DocumentProperties(GetFocus(), hPrinter, lpPrinterName, lpoutDevMode, NULL, DM_OUT_BUFFER); if (lRet == IDOK) { // ÇÁ¸°ÅÍÀÇ Àμ⠹æÇâ ¼³Á¤À» º¯°æÇÑ´Ù. // ¿©±â¼­ ¿øÇÏ´Â º¯È¯À» ¼öÇàÇÑ´Ù. lpoutDevMode->dmOrientation = DMORIENT_LANDSCAPE; } hPrnDC = CreateDC (lpDriverName, lpDeviceName, lpOutputName, lpoutDevMode) ; free(lpoutDevMode); return hPrnDC; } 26. ¸Þ´º °ü·Ã ÇÔ¼ö¸Þ´º Ç׸ñÀ» Çϳª Ãß°¡ÇÏ·Á°í ÇÕ´Ï´Ù. InsertMenuItem API¸¦ »ç¿ëÇϴµ¥ À©µµ¿ì 3.1¿¡¼­¿Í »ç¿ë¹ýÀÌ ´Ù¸¥ °Í °°½À´Ï´Ù. »ç¿ë¹ýÀÌ ´Þ¶óÁ³½À´Ï´Ù. MENUITEMINFO mii; memset(&mii, 0x00, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE; mii.fType = MFT_SEPARATOR; InsertMenuItem(hSubMenu, GetMenuItemCount(hSubMenu), TRUE, &mii); mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_TYPE MIIM_STATE MIIM_ID; mii.fType = MFT_STRING; mii.fState = MFS_DEFAULT MFS_UNHILITE; mii.wID = ID_WORKPLACE_REMOVE; mii.dwTypeData = "¹Ù±¸´Ï¿¡¼­ Á¦°Å"; InsertMenuItem(hSubMenu, GetMenuItemCount(hSubMenu), TRUE, &mii); 27. ÄÚµå ½ÇÇà Áß¿¡ ´Ù¸¥ À©µµ¿ì ¸Þ½ÃÁö ó¸®Çϱâ ÇϳªÀÇ ÇÔ¼ö ³»¿¡¼­ ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ÀÛ¾÷À» ÇÏ°í ÀÖ½À´Ï´Ù. ÀÌ ¶§ ÀÛ¾÷ Ãë¼Ò¸¦ À§ÇÑ º°µµÀÇ ´ÙÀ̾ó·Î±×¸¦ Çϳª ¶ç¿ö µÎ¾ú´Âµ¥ ÀÌ ÂÊÀÇ ¹öÆ°ÀÌ ´­¸®Áö ¾Ê½À´Ï´Ù. ¾î¶»°Ô ÇؾßÇÒ±î¿ä ? ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ÀÛ¾÷À» º°µµÀÇ ½º·¹µå·Î ¸¸µé¾î ó¸®ÇÏ´øÁö ¾Æ´Ï¸é ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ÀÛ¾÷À» ¼öÇàÇÏ´Â ÇÔ¼ö ¾È¿¡¼­ ´ÙÀ½ Äڵ带 °¡²û È£ÃâÇØÁÖ¸é µË´Ï´Ù. ¸¸ÀÏ ·çÇÁ¸¦ µ¹°í ÀÖ´Ù¸é ·çÇÁ³»¿¡¼­ Çѹø¾¿ È£ÃâÇØÁÖ¸é µË´Ï´Ù. MSG msg; while (PeekMessage(&msg, NULL, NULL, NULL, TRUE)) { TranslateMessage(&msg); DispatchMessage(&msg); }VB¿¡¼­¶ó¸é DoEvents¶ó´Â ¸Þ¼Òµå¸¦ È£ÃâÇØÁÖ¸é µË´Ï´Ù. 28. ¸ÞÀÎ À©µµ¿ì¿¡¼­ ĸ¼ÇÀ» Á¦°ÅÇÏ°í ½Í½À´Ï´Ù. ¾î¶»°Ô ÇØ¾ß Çմϱî ?À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ WS_CAPTIONÀ̶õ ½ºÅ¸ÀÏÀ» ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ Ç×»ó À©µµ¿ìÀÇ Ä¸¼ÇÀÌ º¸ÀÔ´Ï´Ù. À̸¦ Á¦°ÅÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß Çϳª¿ä ? ĸ¼ÇÀ» Á¦°ÅÇÏ·Á´Â À©µµ¿ìÀÇ WM_NCCREATE ¸Þ½ÃÁö¸¦ ó¸®ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ¸Þ½ÃÁö´Â WM_CREATE ¸Þ½ÃÁöº¸´Ù ¾Õ¼­ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöÀÔ´Ï´Ù. NC´Â Non-Client¸¦ ³ªÅ¸³À´Ï´Ù. GetWindowLong°ú SetWindowLong API¸¦ ÀÌ¿ëÇؼ­ WS_CAPTION ½ºÅ¸ÀÏÀ» Á¦°ÅÇÕ´Ï´Ù. ÀÌ µÎ API´Â ¾Õ¼­ ¸®½ºÆ®ºä ÄÁÆ®·Ñ¿¡¼­ ½ºÅ¸ÀÏ µ¿Àû º¯°æÇϱ⿡¼­ ÀÌ¹Ì »ç¿ëÇغ» ¹Ù ÀÖ½À´Ï´Ù. case WM_NCCREATE : { long lStyle; lStyle = GetWindowLong(hWnd, GWL_STYLE); lStyle = (lStyle & (~WS_CAPTION)); SetWindowLong (hWnd, GWL_STYLE, lStyle); return TRUE; } 29. »ç°¢Çü ÇüÅ ÀÌ¿ÜÀÇ ¸ð¾çÀ» °®´Â À©µµ¿ì¸¦ ¶ç¿ì°í ½Í½À´Ï´Ù.À©µµ¿ì´Â ±âº» ¸ð¾çÀÌ »ç°¢ÇüÀε¥ ´Ù¸¥ ÇüÅÂÀÇ ¸ð¾çÀ» °®´Â À©µµ¿ì¸¦ ¶ç¿ì·Á¸é ¾î¶»°Ô ÇؾßÇմϱî ? ¿øÇÏ´Â ¸ð¾çÀ» RegionÀ̶õ °ÍÀ¸·Î ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ¸¸µç ´ÙÀ½¿¡ ÀÌ°ÍÀ» ¿øÇÏ´Â ½ÃÁ¡¿¡ SetWindowRgn¶ó´Â API¸¦ ÀÌ¿ëÇØ À©µµ¿ì¿¡ ¼³Á¤ÇØÁÖ¸é µË´Ï´Ù. ¿¹¸¦ µé¾î Ÿ¿ø ¸ð¾çÀÇ À©µµ¿ì¸¦ ¶ç¿ì°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇØÁÖ¸é µË´Ï´Ù. HRGN g_hRgn; g_hRgn = CreateEllipticRgn(0, 0, 700, 600); SetWindowRgn(hWnd, g_hRgn, FALSE); ÀÌ·¸°Ô ÇßÀ» °æ¿ì À©µµ¿ìÀÇ À§Ä¡ À̵¿ÀÌ ¹®Á¦°¡ µË´Ï´Ù. º¸Åë ĸ¼ÇÀ» Àâ°í À̵¿½ÃÄÑ¾ß Çϴµ¥ ĸ¼ÇÀÌ ¾øÀ¸´Ï±î ¹®Á¦°¡ µË´Ï´Ù. ÀÌ¿¡ °üÇÑ °ÍÀº 31. À©µµ¿ìÀÇ À̵¿ ó¸®Çϱ⸦ Âü°íÇϱ⠹ٶø´Ï´Ù. 30. ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¸ðµç ÇÁ¸°ÅÍ µå¶óÀ̹ö ¾Ë¾Æ³»±âÇöÀç ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¸ðµç ÇÁ¸°ÅÍ µå¶óÀ̹öÀÇ Á¾·ù¸¦ ¾Ë¾Æ³»°í ½Í½À´Ï´Ù. EnumPrinters¶ó´Â API¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ´ÙÀ½ ÄÚµå´Â ÇöÀç ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¸ðµç ÇÁ¸°ÅÍ µå¶óÀ̹ö(·ÎÄðú ³×Æ®¿÷ ÇÁ¸°ÅÍ Æ÷ÇÔ)ÀÇ À̸§À» ¸Þ½ÃÁö¹Ú½º·Î º¸¿©ÁÖ´Â ¿¹Á¦ÀÔ´Ï´Ù. BOOL bSuccess; DWORD cbRequired, cbBuffer, nEntries; PRINTER_INFO_1 *lpBuffer = NULL; // ¹öÆÛÀÇ Å©±â¸¦ ¾Ë¾Æ³½´Ù. cbRequired·Î µé¾î¿Â´Ù. EnumPrinters(PRINTER_ENUM_CONNECTIONS PRINTER_ENUM_LOCAL, NULL, 1, (unsigned char *)lpBuffer, 0, &cbRequired, &nEntries); cbBuffer = cbRequired; // ¹öÆÛ¸¦ ´Ù½Ã ¹öÆÛ¸¦ Àâ´Â´Ù. lpBuffer = (PRINTER_INFO_1 *)malloc(cbBuffer); // ÇÁ¸°ÅÍÀÇ Á¾·ù¸¦ ¾Ë¾Æ³½´Ù. bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS PRINTER_ENUM_LOCAL, NULL, 1, (unsigned char *)lpBuffer, cbRequired, &cbRequired, &nEntries); if (bSuccess == FALSE) { free(lpBuffer); // ´Ù¸¥ ÀÌÀ¯·Î ¿¡·¯°¡ ³­ °æ¿ì return; } // ¾Ë¾Æ³½ ÇÁ¸°Å͸¦ Çϳª¾¿ enumerateÇÑ´Ù. for (int i = 0;i < hdevice =" CreateFile(">", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0); if (DeviceIoControl(hDevice, W32_SETHWND, &hWnd, 4, NULL, 0, &byteReturned, NULL)) { // Success !!! }Vxd µå¶óÀ̹ö´Â kernel ¸ðµå(À̸¦ À©µµ¿ì¿¡¼­´Â Ring 0¶ó°í ºÎ¸¨´Ï´Ù)¿¡¼­ µ¿ÀÛÇϱ⠶§¹®¿¡ ¸ðµç Çϵå¿þ¾î¿Í ¸Þ¸ð¸®¸¦ ¹Ù·Î Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. VxD µå¶óÀ̹ö¸¦ ÀÛ¼ºÇÏ·Á¸é DDK¸¦ ÀÌ¿ëÇϰųª NumegaÀÇ DriverStudio³ª KRFTech»çÀÇ WinDriver¸¦ ÀÌ¿ëÇØ¾ß ÇÕ´Ï´Ù. 34. Thread ½ÇÇà½Ã ¿¡·¯CreateThread¸¦ ÀÌ¿ëÇØ ½º·¹µå¸¦ ¸¸µé¾î »ý¼ºÇÏ°í ÀÖ½À´Ï´Ù. ·çƾ¿¡ ÀÌ»óÀº ¾ø´Â °Í °°Àºµ¥ ½º·¹µå°¡ ¸¹ÀÌ »ý¼ºµÇ¾î ½Ã°£ÀÌ Á» Áö³ª¸é ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. ÀÌÀ¯°¡ ¹«¾ùÀϱî¿ä ? Á¤¸»·Î ½º·¹µå Äڵ忡 º° ÀÌ»óÀÌ ¾ø´Ù¸é CreateThread API ´ë½Å¿¡ beginthread³ª beginthreadex¸¦ »ç¿ëÇغ¸±â ¹Ù¶ø´Ï´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ Knowledge base¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù. 35. À©µµ¿ì ¿î¿µÃ¼Á¦ Á¾·áÇϱâÇÁ·Î±×·¥¿¡¼­ ƯÁ¤ »óȲÀÌ µÇ¸é À©µµ¿ì ¿î¿µÃ¼Á¦¸¦ Á¾·áÇÏ°í ½Í½À´Ï´Ù. ExitWindowsEx API¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ÀÌ ÇÔ¼öÀÇ ¿øÇüÀº ´ÙÀ½°ú °°½À´Ï´Ù. BOOL ExitWindowsEx(UINT uFlags, DWORD dwReserved);uFlags·Î Á¾·á¹æ¹ýÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°Àº °ªÀÌ °¡´ÉÇÕ´Ï´Ù. EWX_LOGOFF ÇöÀç »ç¿ëÀÚ¸¦ ·Î±×¿ÀÇÁÇÑ´Ù. EWX_POWEROFF ½Ã½ºÅÛÀ» Á¾·áÇÏ°í ÆÄ¿ö¿ÀÇÁÇÑ´Ù. ÆÄ¿ö¿ÀÇÁ´Â À̸¦ Áö¿øÇÏ´Â Çϵå¿þ¾î¿¡¼­¸¸ °¡´ÉÇÏ´Ù. EWX_REBOOT ½Ã½ºÅÛÀ» Á¾·áÇÏ°í ½Ã½ºÅÛÀ» Àç½Ãµ¿ÇÑ´Ù. EWX_SHUTDOWN ½Ã½ºÅÛÀ» Á¾·áÇÑ´Ù. EWX_FORCE WM_QUERYSESSIONÀ̳ª WM_ENDQUERYSESSIONÀ» º¸³»Áö ¾Ê°í ½ÇÇàÁßÀÎ ¸ðµç ÇÁ·Î¼¼½º¸¦ Á¾·áÇÑ´Ù. À§ÀÇ ³× °¡Áö Ç÷¡±×µé°ú ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. 36. µðÆúÆ® À¥ ºê¶ó¿ìÀú ¾Ë¾Æ³»±âµðÆúÆ®·Î ÁöÁ¤µÈ À¥ ºê¶ó¿ìÀú¸¦ ½ÇÇàÇÏ´Â ¹æ¹ýÀ» ¾Ë°í ½Í½À´Ï´Ù. µðÆúÆ®·Î ÁöÁ¤µÈ À¥ ºê¶ó¿ìÀú´Â ·¹Áö½ºÆ®¸®¿¡ ÀÚ½ÅÀ» µî·ÏÇÕ´Ï´Ù. .htm (ȤÀº .html) ÆÄÀÏÀÇ ÆíÁý±â·Î ¸µÅ©µµ µÇÁö¸¸ http, ftp, gopher µîÀÇ ÇÁ·ÎÅäÄÝ ¿¬°á ÇÁ·Î±×·¥À¸·Î µî·ÏµË´Ï´Ù. Á¦ »ý°¢¿¡ °¡Àå ÁÁÀº °ÍÀº http ÇÁ·ÎÅäÄÝÀÇ ¿¬°á ÇÁ·Î±×·¥À» ã¾Æº¸´Â °ÍÀ¸·Î »ý°¢µË´Ï´Ù. ´ÙÀ½ ·¹Áö½ºÆ®¸® Ç׸ñ¿¡ º¸¸é ¿¬°áµÈ À¥ ºê¶ó¿ìÀúÀÇ Àý´ë °æ·Î¸¦ ¾Ë ¼ö ÀÖ½À´Ï´Ù. HKEY_CLASSES_ROOT\http\shell\open\commandÀÌ Ç׸ñÀÇ °ªÀ» Àд ¹æ¹ýÀº 3. ·¹Áö½ºÆ®¸® Àбâ/¾²±â¸¦ Âü°íÇÏ°í ÇÁ·Î±×·¥ÀÇ ½ÇÇà¿¡ °üÇÑ ºÎºÐÀº 19. ƯÁ¤ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í Á¾·á¸¦ ±â´Ù¸®±â¸¦ Âü°íÇϰųª ShellExecute API ȤÀº WinExec API¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. ÀÌ ±â´ÉÀ» ¼öÇàÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°½À´Ï´Ù. void LaunchDefaultWebBrowser(HWND hWnd){ // HKEY_CLASSES_ROOT\http\shell\open\command DWORD dwType, cbData; HKEY hSubKey; long lRet; LPSTR pszString, pszSrcPath; // Å°¸¦ ¿ÀÇÂÇÑ´Ù. if ((lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, "http\\shell\\open\\command", 0, KEY_READ KEY_QUERY_VALUE , &hSubKey)) == ERROR_SUCCESS) { cbData = 255; // ¹®ÀÚ¿­ °ªÀ» Àоî¿Ã µ¥ÀÌÅÍÀÇ Å©±â¸¦ ÁØ´Ù. pszString = (LPSTR)malloc(255); pszSrcPath = pszString; if ((lRet = RegQueryValueEx(hSubKey, "", NULL, &dwType, (unsigned char *)pszString, &cbData)) == ERROR_SUCCESS) { // pszString¿¡ µðÆúÆ® À¥ ºê¶ó¿ìÀúÀÇ °æ·Î°¡ µé¾î¿Â´Ù. // pszString¿¡¼­ "¸¦ Á¦°ÅÇÑ´Ù. RemoveChar(pszString, '"'); WinExec(pszString, SW_SHOWNORMAL); } free(pszString); RegCloseKey(hSubKey); }} void RemoveChar(LPSTR lpSrc, char chRemove){ LPTSTR pstrSource = lpSrc; LPTSTR pstrDest = lpSrc; LPTSTR pstrEnd = lpSrc + strlen(lpSrc); while (pstrSource < pstrdest =" *pstrSource;" pstrdest =" _tcsinc(pstrDest);" pstrsource =" _tcsinc(pstrSource);" pstrdest =" '\0';}" lpmmi =" (LPMINMAXINFO)lParam;">ptMaxSize.x = rc.right; lpmmi->ptMaxSize.y = rc.bottom; lpmmi->ptMaxPosition.x = 0; lpmmi->ptMaxPosition.y = 0; lpmmi->ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK); lpmmi->ptMinTrackSize.y = GetSystemMetrics(SM_CYMINTRACK); lpmmi->ptMaxTrackSize.x = GetSystemMetrics(SM_CXMAXTRACK); lpmmi->ptMaxTrackSize.y = GetSystemMetrics(SM_CYMAXTRACK); break;} 38. Thread¿¡¼­ Automation ¸Þ¼Òµå È£Ãâ½Ã ¿¡·¯ ¹ß»ýThread¸¦ »ý¼ºÇÏ°í Automation ¸Þ¼Òµå¸¦ È£ÃâÇߴµ¥ ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. App Ŭ·¡½ºÀÇ InitInstance ÇÔ¼ö¿¡¼­ AfxOleInit¸¦ È£ÃâÇÏ´Â ºÎºÐÀ» CoInitializeEx(NULL, COINIT_MULTITHREADED)¸¦ È£ÃâÇÏ´Â °ÍÀ¸·Î º¯°æÇϱ⠹ٶø´Ï´Ù. ±×¸®°í App Ŭ·¡½º¿¡ ExitInstance ÇÔ¼ö¸¦ Ãß°¡ÇÏ°í °Å±â¼­ CoUninitialize¸¦ È£ÃâÇϵµ·Ï ÇÏ¸é µË´Ï´Ù. MFCÀÇ AfxOleInit´Â ±âº»ÀûÀ¸·Î STA(Single Threading Apartment) ¸ðµ¨À» »ç¿ëÇÕ´Ï´Ù. Thread¿¡¼­ ÀÚ½ÅÀÌ »ý¼ºÇÏÁö ¾Ê´Â COM °´Ã¼¸¦ Á¢±ÙÇÒ ¶§´Â MTA(Multiple Threading Apartment) ¸ðµ¨À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. 39. ÃÖ»óÀ§ À©µµ¿ìÀÇ Á¾·á ¹æ¹ýÇöÀç ÃÖ»óÀ§ À©µµ¿ì¸¦ ã¾Æ¼­ Á¾·áÇÏ´Â Äڵ带 ¸¸µé°í ½Í½À´Ï´Ù. ÀÏ´Ü ÇöÀç »ç¿ëÀÚ°¡ ÀÛ¾÷ ÁßÀÎ ÃÖ»óÀ§ À©µµ¿ìÀÇ ÇÚµéÀº GetForegroundWindow API·Î ¾ò¾î³À´Ï´Ù. ±×·±µ¥ ±× À©µµ¿ì°¡ ÀÚ½Ä À©µµ¿ìÀÏ ¼ö Àֱ⠶§¹®¿¡ GetParent API¸¦ ¹Ýº¹ÀûÀ¸·Î »ç¿ëÇؼ­ ÃÖ»óÀ§ ž ·¹º§ À©µµ¿ìÀÇ ÇÚµéÀ» ¾Ë¾Æ³À´Ï´Ù. Á¾·áÇÏ´Â ¹æ¹ýÀº ¸ÕÀú DestroyWindow¸¦ È£ÃâÇؼ­ ½ÃµµÇغ¸°í ½ÇÆÐÇÏ¸é ½Ã½ºÅÛ ¸Þ´ºÀÇ "´Ý±â" ¸í·ÉÀ» ÀÌ¿ëÇØ Ã³¸®ÇÕ´Ï´Ù. »ç½Ç ÀÌ °Íµµ ½ÇÆÐÇÒ ¼ö Àִµ¥ ¹«Á¶°Ç Á¾·á½ÃÅ°°í ½Í´Ù¸é ¾Æ·¡ Äڵ忡¼­ ÁÖ¼® ó¸®ÇØ ³õÀº GetWindowThreadProcessId/Terminate API ºÎºÐÀ» »ç¿ëÇÏ¸é µË´Ï´Ù. HWND hTopWnd = GetForegroundWindow(); if (hTopWnd == NULL) { return; } while(GetParent(hTopWnd)) { hTopWnd = GetParent(hTopWnd); } if (DestroyWindow(hTopWnd) == FALSE) { SendMessage(hTopWnd, WM_SYSCOMMAND, SC_CLOSE, NULL); //GetWindowThreadProcessId(hTopWnd, &dwProcessId); //TerminateProcess(dwProcessId); } 40. ÀÎÅÍ³Ý ÀͽºÇ÷η¯ÀÇ À§Ä¡ °æ·Î ¾Ë¾Æ³»±âÀÎÅÍ³Ý ÀͽºÇ÷η¯°¡ ¼³Ä¡µÈ Àý´ë °æ·Î¸¦ ¾Ë°í ½Í½À´Ï´Ù. ·¹Áö½ºÆ®¸®ÀÇ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\IExplore.exe ÀÇ ±âº» °ªÀ¸·Î ÀÎÅÍ³Ý ÀͽºÇ÷η¯ÀÇ ¼³Ä¡ °æ·Î°¡ µé¾î¿É´Ï´Ù. ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¼³Ä¡ °æ·Î¸¦ ¾ò¾î ÁÝ´Ï´Ù. ÀÎÀÚ·Î ³Ñ¾î°¡´Â lpPath´Â Àû¾îµµ 256¹ÙÀÌÆ® ÀÌ»óÀÇ Å©±â¸¦ °®´Â ¹®ÀÚ ¹è¿­À̾î¾ß ÇÕ´Ï´Ù. BOOL GetIEPath(LPTSTR lpPath) { long lRet; HKEY hKey; lRet = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IExplore.exe", &hKey); if (lRet == ERROR_SUCCESS) { long cbData = 255; RegQueryValue(hKey, "", lpPath, &cbData); RegCloseKey(hKey); } else return FALSE; return TRUE;}