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;
}
'개발' 카테고리의 다른 글
디버그 이야기 - 비정상종료 (6) | 2007.08.21 |
---|---|
개발자를 위한 개발자에 의한 문서 만들기 (9) | 2007.07.22 |
파일을 숨기는 방법 - ezRename (6) | 2007.06.27 |
안전하고, 좋은 냄새가 나는 C++ 코드 만들기 (5) | 2007.05.30 |
Adobe Flex2 처음 맛보기 - Flex 로 만든 계산기 (1) | 2007.04.14 |
STL iteraotor 사용 예제 (0) | 2007.03.26 |
댓글