MFC, STL 간단 사용팁

2007.03.23 21:39개발

MFC, STL 간단 사용팁

1. 어플리케이션위치관련

    )최소화 여부판단

        if (IsIconic())

        {

            ...

        }   

    ) 종료시 프로그램 위치기억하기

        void CYourApp::OnDestroy()

        {

            __super::OnDestroy();

 

            // Some Code

            // ...

            WINDOWPLACEMENT wr;

            wr.length = sizeof(WINDOWPLACEMENT);

            GetWindowPlacement(&wr);

            // wr.rcNormalPosition 를파일에기록

            

        }

    ) 시작시이전화면 위치로실행하기

        int CYourApp::OnCreate(LPCREATESTRUCT lpCreateStruct)

        {

            if (__super::OnCreate(lpCreateStruct) == -1)

                return -1;

 

            // TODO:  Add your specialized creation code here

            // 마지막 종료위치 저장

            long lLeft, lTop;

            // 파일어딘가에서 종료시 위치를읽어옵니다

            if (-1 == lLeft || -1 == lTop)

                return 0;

 

            // 윈도우재배치

            WINDOWPLACEMENT wr;

            wr.length = sizeof(WINDOWPLACEMENT);

            GetWindowPlacement(&wr);

            CRect rtTemp = wr.rcNormalPosition;

            wr.rcNormalPosition.left = lLeft;

            wr.rcNormalPosition.top= lTop;

            wr.rcNormalPosition.right = lLeft + rtTemp.Width();

            wr.rcNormalPosition.bottom = lTop + rtTemp.Height();

            wr.showCmd = SW_SHOWNORMAL;

            SetWindowPlacement(&wr);

            // Do Some more ..   

        }

 

2. 브라우져컨트롤(CHtmlView) 관련 몇가지 팁

    ). 브라우져캐쉬(CHCHE) 제거 - 가끔씩 HTML 이 캐쉬되면서 Refresh 가 작동하지 않을때는 아래 함수를 호출해 주면 됨

        DeleteUrlCacheEntry(lpURL);

 

    ) 브라우져컨트롤(CHtmlView)에서 스크립트 오류안나오게하기 - CHtmlView::OnAmbientProperty 오버로딩해서 구현하면 됩니다( http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=6243&ref=6243 사이트에서정보얻음)

        BOOL CHtmlView::OnAmbientProperty(COleControlSite* pSite, DISPID dispid, VARIANT* pvar)

        {

            // TODO: Add your specialized code here and/or call the base class

            if (pvar && dispid == DISPID_AMBIENT_DLCONTROL) {

                V_VT(pvar) = VT_I4;

                V_I4(pvar) =

                    DLCTL_DLIMAGES|

                    DLCTL_VIDEOS|

                    DLCTL_BGSOUNDS|

                    DLCTL_NO_SCRIPTS|

                    0;

                return TRUE;

            }

            else

            {

                return CHtmlView::OnAmbientProperty(pSite, dispid, pvar);

            }

            //return CHtmlView::OnAmbientProperty(pSite, dispid, pvar);

        }

    ) CHtmlView 로부터 IHTMLDocument2, IHTMLDocument3, IHTMLElement 구하기   

        // IHTMLDocument2 IHTMLDocument3 인터페이스를구한다.

        CComPtr<IHTMLDocument2> pDoc = (IHTMLDocument2*)m_Html.GetHtmlDocument();   

        CComQIPtr<IHTMLDocument3> pHTML3 =pDoc;

        CComPtr<IHTMLElement > pHTMLElmt;

        pDoc->get_body(&pHTMLElmt);

 

        // IHTMLDocument3 로부터"td" 로시작하는 모든 태그 element 들의collection 을구한다.

        CComPtr<IHTMLElementCollection> pHtmlCol;

        HRESULT hr = pHTML3->getElementsByTagName(CComBSTR("td"), &pHtmlCol);

        long lTdCnt;

        pHtmlCol->get_length(&lTdCnt);

        CComVariant var;

        // <td> 태그만큼 반복하면서 정보를구한다.

        for( int i = 0; i < lTdCnt; i ++ )

        {

            CComPtr<IDispatch> pDispatch;

            hr = pHtmlCol->item(CComVariant(i), CComVariant(0), &pDispatch);

            if (hr != S_OK)

                continue;

            CComQIPtr<IHTMLElement>pElmt = pDispatch;

           

            // TD 태그OBJECT 에 있는 모든 COLLECTION 을구하자.

            CComPtr<IDispatch> pDispChild;

            pElmt->get_all(&pDispChild);

            CComQIPtr<IHTMLElementCollection>pCollChild = pDispChild;

 

            long lTdCnt2;

            pCollChild->get_length(&lTdCnt2);

            string sName;

            for (int j = 0; j < lTdCnt2; j++)       

            {

                // do something

            }    // end of for (int j = 0; j < lTdCnt2; j++)

        }    // end of for( int i = 0; i < lTdCnt; i ++ )

           

   

 

3. STL::string 을이용팁

    ) string 의생성자를 이용하면 아주 간단하게 문자열의 특정부분만 받아올수있다.

        sTest = "1234567890";

        // "2345" 부분만가져오고싶다면

            // string(문자열, 시작 index, 복사할길이); 생성자를이용하자       

            string sTest2 = string(sTest, 1, 4); // 1 번째인덱스에서4바이트를가져온다.       

        // "12345" 를 가져오고 싶다면

           //  string(문자열, 복사할길이); 생성자를이용한다.       

            string sTest3 = string(sTest.c_str(), 5);

    ) string::find_last_of 을이용예

        // 모듈이름으로부터 Path 부분만가져오기

        GetModuleFileName(AfxGetInstanceHandle(), szModuleName,sizeof(szModuleName));

        string sModuleName = szModuleName;

        string::size_type idx = sModuleName.find_last_of("\\");

        string sPath = sModuleName.substr(0, idx);

    ) string::replace 사용

        // "바사아자" 를 찾아"abcd" 로변경한다.

        string sOrg = "가나다라마바사아자차카타파하";

        string sReplace = "abcd";

        string sFind = "바사아자";

        string::size_type findpos = sOrg.find(sFind);

        // sFind 를 찾아 sFind 의 크기만큼 sReplace 로변경한다.

        sOrg.replace(findpos, sFind.size(), sReplace);

    ) "%" 로 둘로싸인 문자열을 찾아 리턴하는 함수예

        // "가나다%abc% 마바사" 와같은 string 이 있을때"%"로시작해"%" 로끝나는

        // 문자열이있는지찾는함수

        // return : true -> 찾기성공

        // string& s -> 원본스트링

        // sReplacement -> 찾기성공했을때%--% 로끝나는문자열

        bool CTest::FindReplacestring(string& s,string& sReplacement)

        {

            string::size_type firstidx, secondidx;      // string iterator 는반드시 string::size_type 를사용해야한다

            firstidx = s.find_first_of("%");             // 첫번째"%" 찾기

            if (string::npos == firstidx)

                return false;

 

            secondidx = s.find_first_of("%", firstidx + 1); // 두번재"%" 찾기

 

            if (string::npos == secondidx)        // string end position string::npos .

                return false;

 

            sReplacement = s.substr(firstidx, secondidx - firstidx + 1);

            return true;

        }