프로그래밍/VC++ 58

COM에서 DATE 타입 사용하기

ActiveX에서 외부에 노출할 메소드를 하나 만들려고 할 때 보이는 Data 타입 중 하나가 DATE 타입이다. DATE는 time_t 보다 더 큰 타입이라나. 암튼 그렇다. ActiveX에서 이렇게 받았다. DATE m_ChartFirstDate COleDateTime dateChartFirst(this->m_ChartFirstDate); int nYear = dateChartFirst.GetYear(); int nMonth = dateChartFirst.GetMonth(); int nDay = dateChartFirst.GetDay(); 그리고 2006년 12월 31일이 DATE 타입으로 어떤 값인지를 알아야 HTML에서 ActiveX로 값을 넘길 수 있다. 그건 이렇게 만들었다. COleDateT..

switch / case의 이상한 경험

MemoryDC에서 모든 그림을 다 그려온 다음 bitblt하려고 다음과 같이 했다. CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap bitmap; bitmap.CreateCompatibleBitmap(pDC, m_BackImage.GetWidth(), m_BackImage.GetHeight()); CBitmap *pBitmap = MemDC.SelectObject(&bitmap); switch(spec) { case 0 : foo(&MemDC); break; case 1 : foo(&MemDC); break; } 그런데 저거 안된다. foo로 호출한 MemDC안에 아무것도 안 그려진다. 그래서 함수 호출하지 않고 switch(spec) { case 0 : Mem..

슬라이더 콘트롤의 특징

슬라이더 콘트롤의 모양을 바꾸고 싶을 때가 있다. 슬라이더 기본콘트를은 이지만, 다음과 같이 새로 고칠 수 있다. 하지만 이때 알아야 할 사항이 있다. 손잡이 Thumb의 최대 크기는 11픽셀이라는 거다. 그리고 맨 왼쪽에 손잡이를 놓으면 그때의 THumb의 rect.left가 8이 나온다. 8~Thumb의 width()만큼 화면에 그려지는거다. 최대로 오른쪽에 놓으면 그때 Thumb의 Rect.left는 89이다. 89~THumb의 Height()만큼 그려진다. 89 + 11 = 100. 이 값을 넘어서면 Thumb이 짤린다. 기본 트래커의 THumb은 정확히 11픽셀의 가로를 갖는다. 그리고 위아래 특히 아래 여백이 충분하지 않으면 손잡이를 잡고 움직일 때 제대로 되지 않는 현상이 발생한다.

사용자 정의 커서 사용하기

사용자 정의 커서 사용하면 잘 안된다. SetCursor(LoadCursor(NULL, IDC_WAIT)); 이렇게 미리 정의되어 있는 거 사용하면 무쟈게 잘 되는데, 사용자 정의 커서는 잘 안된다. 예를 들어, IDC_PENCIL 을 정의해 놓고, (이런 연필 모양 커서는 C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Graphics\cursors 에 가보면 많다.) 이걸 쓰려고 하는데, 툴 버튼을 누르는 곳에서 SetCursor을 하면 안된다. WM_SETCURSOR 메시지 처리를 하면서 다시 원래 arrow로 바꿔 버리기 때문이다. 그래서 결국에는 WM_SETCURSOR 메시지 핸들러에서 마우스 커서를 바꿔줘야 한다. 아래와 같이 경우에 따..

MFC ActiveX에서 BackSpace가 안먹히는 문제 해결

출처 : http://support.microsoft.com/kb/q168777/ MFC ActiveX에서는 BackSpace가 안먹힌다. IE가 BackSpace, Tab, 화살표 키등을 트랩하고 있기 때문이다. 이 문제를 해결하려면 위의 문서를 보면 된다. ㅋ 단순히 백스페이스 문제만 해결하려면 아주 단순히 int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; OnActivateInPlace (TRUE, NULL); // == UI-Activate the control return 0; } 저렇게만 해줘도 백스페이스 문제가 해결된다. 하지..

VC++에서 ADO 사용하기

1. stdafx.h 파일에 다음을 추가한다. #pragma warning(push) //ado 버그로 인한 컴파일시 경고 뜨는것 방지. #pragma warning(disable:4146) #import "C:\\Program Files\\Common Files\\System\\ADO\\msado15.dll" \ rename("EOF", "EndOfFile") no_namespace//#import "C:\\Program Files\\Common Files\\System\\ADO\\msadox.dll" #import "C:\Program Files\Common Files\System\ADO\msadox.dll"#pragma warning(pop) 2. ADO를 사용할 파일에 다음을 include 한다...

MFC 탭컨트롤에 TCN_SELCHANGE 메시지 날리는 방법

탭컨트롤에 SetCurSel() 함수를 호출해도 탭은 바뀌지만 TCN_SELCHANGE 메시지는 날아가지 않는다. 그래서 딱 탭만 바뀌지 아무런 일도 일어나지 않는다. 그래서 탭컨트롤을 클릭할 것처럼 만들려면 TCN_SELCHANGE 메시지를 날려줘야 한다. 다음과 같이 한다. this->m_tab.SetCurSel(0); // 첫번째 탭을 선택한다. NMHDR nmhdr;nmhdr.code=TCN_SELCHANGE; nmhdr.idFrom=IDC_TAB1; nmhdr.hwndFrom=m_tab.m_hWnd;SendMessage(WM_NOTIFY,IDC_TAB1,(LPARAM)&nmhdr);

경로에서 드라이브, 경로명, 파일명, 확장자등 가져오는 방법

void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); 를 쓰면 된다. MSDN에 샘플. #include #include void main( void ) { char path_buffer[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" ); printf( "Path created with _makepath: %s\n\n", path_buffer ); _splitpath..