CStatic ...이리저리사용하기 (1)

2015. 10. 2. 13:26IT-개발/winapi 및 MFC

반응형

CStatic 컨트롤에 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" 이런 경로를 표현하고 싶어서


해보니~ 문자열이 길어서 짤린다. 그래서 생략되게 나오는 법을 알아보니... 있단다~ 어디서 본듯 하기도 하고~


리소스뷰에서 static 컨트롤을 선택하니 ... 눈에 띄는 녀석이 두녀석 있다.


End Ellipsis 


Path Ellipsis


Ellipsis : 생략 이라는 뜻이란다... 영어는 일단 잘하고 볼 일이다. ㅠㅠ..


실제로 이 두 녀석중 하나를 true로 설정하면 컨트롤보다 긴 문자열이 나타날때, 다음과 같이 생략되게 표현된다.


End Ellipsis : "C:\Program Files (x86)\Google\Chrome\..."


Path Ellipsis : "C:\Program Files (x86)\...\chrome.exe"


요기까지는 어디까지나 걍 기본 CStatic을 사용했을때 이다.... 가만히 내가 사용하고 있는 CStatic을 보니.... 


상속받아서 새로 만든거다... 그래서인지 이 둘중 하나를 true로 설정해도 동작을 하지 않는다.. ㅠㅠ...


OnPaint에서 자기 맘대로 동작하도록 코딩되어 있다.... 요기서 그럼 위에 처럼 End Ellipsis. Path Ellipsis 가


적용되게 하려면 어떻하나?


DrawText() 함수 부분을 찾아보니~~ 역시나~~ 이런 설정이 안먹히도록 하드코딩 되어 있다..


pDC->DrawText(sText, -1, rect, nFormat); 에서 nFormat에 다음의 설정들을 조합해서 넣으면


DrawText에 다양한 옵션을 적용할 수 있다.


DT_PATH_ELLIPSIS


DT_END_ELLIPSIS


이 두개는 내가 위에서 원하는 출력을 얻기 위해 필요한 옵션이고 이외에도 많다.


MSDN에 자세한 설명도 있다...

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx


/*

 * DrawText() Format Flags

 */

#define DT_TOP                      0x00000000

#define DT_LEFT                     0x00000000

#define DT_CENTER                   0x00000001

#define DT_RIGHT                    0x00000002

#define DT_VCENTER                  0x00000004

#define DT_BOTTOM                   0x00000008

#define DT_WORDBREAK                0x00000010

#define DT_SINGLELINE               0x00000020

#define DT_EXPANDTABS               0x00000040

#define DT_TABSTOP                  0x00000080

#define DT_NOCLIP                   0x00000100

#define DT_EXTERNALLEADING          0x00000200

#define DT_CALCRECT                 0x00000400

#define DT_NOPREFIX                 0x00000800

#define DT_INTERNAL                 0x00001000


#if(WINVER >= 0x0400)

#define DT_EDITCONTROL              0x00002000

#define DT_PATH_ELLIPSIS            0x00004000

#define DT_END_ELLIPSIS             0x00008000

#define DT_MODIFYSTRING             0x00010000

#define DT_RTLREADING               0x00020000

#define DT_WORD_ELLIPSIS            0x00040000

#if(WINVER >= 0x0500)

#define DT_NOFULLWIDTHCHARBREAK     0x00080000

#if(_WIN32_WINNT >= 0x0500)

#define DT_HIDEPREFIX               0x00100000

#define DT_PREFIXONLY               0x00200000

#endif /* _WIN32_WINNT >= 0x0500 */

#endif /* WINVER >= 0x0500 */


에고고 어쨌든.....


msadn에 보니 DT_END_ELLIPSIS 요런거 하고 싶으면, DT_MODIFYSTRING를 꼭 함께 하란다...


그래서 요렇게 해줬다. 그러니~~ 잘나오네요... ㅎㅎ


nFormat |= (DT_END_ELLIPSIS | DT_MODIFYSTRING);   // DT_MODIFYSTRING 는 않해줘도 잘 된다. ㅋㅋㅋ 해보니~


혹시나해서... 요넘은 빼도록 했다.


nFormat &= ~(DT_WORDBREAK | DT_EDITCONTROL);


요렇게 해서 비트값을 제거 해줬다.


이글은 CStatic에 대한 건가? DrawText에 대한건가? 아님 비트 연산 +, - 해주는 방법에 대한건가?


모르겠지만 짬뽕으로 나간다~ ㅋㅋㅋ 잘 기억해놓자~