ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;

            }

     

               

     

    댓글 0

Designed by black7375.