본문 바로가기

Language/MFC

Tab컨트롤 선택한 탭 탭명 폰트 변경

[http://imagej.tistory.com/entry/프로퍼티-시트-탭-글꼴색상변경] 글에서 언급 했듯이 서브클래싱 기법을 사용한 방법이다.

방법은 탭 글꼴색을 변경하는 방법에서 좀더 꼼수를 부린것.! 물론 이것도 프로퍼티시트 에서 경우다(Tab컨트롤을 이용해서는 테스트 해보질 않았음.)

 

일단 기존의 서브클래싱을 (물론 다른 방법이 여럿 있겠지만 일단 포스팅 했던 대로..) OnInitDialog 에서 연결하여 각 탭을 설정한다.

 

서브클래싱을 통하여 설정을 해 놓고 디버깅을 해보면 탭 이 변경될때 마다 클래스의 DrawItem 함수가 호출되는 것을 확인할 수 있는데 선택된 탭 명을 설정하기 위하여 폰트 변경을 하고자 하여도 선택된 탭의 정보가 넘어가거나 세팅하기가 쉽지가 않다. 왜냐면 제어가 탭이 선택되서 DrawItem이 호출되는 것이 아니라 탭을 다시 그리기 위하여 호출되는 것이기 때문에최 우선으로 호출이 일어난다.

 

이런 이유로 변경된 탭이 어느 부분이냐를 알기 위하여 한번 호출을 한 뒤 변경을 알고 재 호출을 시도해야 한다.

 

서브클래싱을 연결하고 ModifyStyle함수를 이용하여 DrawItem을 호출하는데 재 호출을 하기 위해서는 이 함수가 아니라 메시지를 날려야 한다.

 

API 메시지 함수를 이용하여 DrawItem을 다시 호출 하는 것이다. 물론 호출하기 전에 선택된 탭 정보를 탭 클래스 멤버(하나 만들어서...)에 저장하는 것도 잊지 말자.

 

...탭 맴버 변수를 만들어서 변경된 탭의 인덱스를 저장..

 

PropertyDlg.h파일

CTab m_MyTabCtrl;

 

 

PropertyDlg.cpp 파일

Property::OninitDialog()

{

//서브 클래싱

m_CurTabCtrl.SubclassDlgItem(this->GetTabControl()->GetDlgCtrlID(), this);

m_CurTabCtrl.ModifyStyle(0,TCS_OWNERDRAWFIXED);

}

 

PropertyDlg::SelectTab(const int& Tabnum)//탭이 변경된 후 호출될 함수.

{

CFont Font;

m_MyTabCtrl.m_SelectTab = Tabnum;

::SendMessage(m_MyTabCtrl.m_hWnd,WM_SETFONT,(WPARAM)Font.GetSafeHandle(),1);

}

 

이런식으로 하면 DrawItem 이 호출이 되며 DrawItem 내부에서 플래그를 주어 선택된 탭의 폰트를 변경하면 된다.