본문 바로가기

컴퓨터/MFC_API

(32)
CListCtrl의 Report 형식에서 각 Cell 의 배경과 글자색을 변경하기 CListCtrl 을 report 형식으로 하면 grid 처럼 사용할 수 있다. 이 때, 각 Cell 의 배경색과 글자색을 변경할 수 있으면 좀 더 알아 보기 좋게 표현할 수 있다. 아래 설명할 코드의 실제 결과는 다음과 같다. 기본적으로 CUSTOMDRAW 메세지 핸들러를 작성해 주면 되는데, MSDN 에 그 설명이 약간은 모호하게 나와 있는데, 자세히 풀어 보자면 다음과 같다. 환경 : Visual Studio 2010 on Windows 7 Professional SP1, English, 64-bit. ITEM 이나 subitem 이 그려질 때는 CUSTOMDRAW 구조체의 값 중 dwDrawStage 값이 CDDS_ITEMPREPAINT, 또는 CDDS_SUBITEM | CDDS_ITEMPREPA..
작업표시줄에 아이콘 생기지 않게 하기 내가 만든 프로그램의 아이콘이 작업 표시줄(task bar)에 표시되지 않도록 해보자. HWND hWnd = AfxGetMainWnd()->GetSafeHwnd(); long style = GetWindowLong(hWnd, GWL_EXSTYLE); style &= ~(WS_VISIBLE); style |= WS_EX_TOOLWINDOW; style &= ~(WS_EX_APPWINDOW); ::ShowWindow(hWnd, SW_HIDE); SetWindowLong(hWnd, GWL_EXSTYLE, style); ::ShowWindow(hWnd, SW_SHOW); 위와 같이 하면 된다. 구글에서 "C++ hide window from taskbar" 로 검색하면 나오는 첫 결과인 이 페이지를 따랐는데, ..
CRichEditCtrl 에서 유니코드 표시 지금 RTF 파일에 글자(한문)를 저장해 놓은 후 읽어들여서 CRichEditCtrl instance 에 표시를 해주고 있는데, 이게 종종 글자가 깨진 것이 보인다. 이 경우, RTF 파일을 읽을 때 그 부분의 format 까지 같이 읽어서 저장해 놓은 후 표시할 때 그 format 을 사용하는 방법으로 우회하고 있다. 보다 정확한 방법은 사실 이론상으로 하기 힘든 듯 한데 확실하진 않다. RTF 파일은 글자 개별적으로 code-page 를 지정할 수 있게끔 되어 있다. 따라서 한 RTF 파일이라 하더라도 각 글자마다 서로 다른 code-page를 사용할 수 있다. CRichEditCtrl-derived view 를 이용해서 무조건 글자를 출력해버리면 code-page 가 맞지 않아서 글자가 깨져 나올 ..
CRichEditCtrl 에서 줄바꿈 없애기 CRichEditCtrl 의 instance 에서 word-wrap (줄바꿈)을 없애려면 SetTargetDevice 함수를 사용해야 한다. CRichEditCtrl::SetTargetDevice(NULL, 0); 과 같이 하면 줄바꿈이 없어진다. SetWordWrapMode 나 GetWordWrapMode 함수가 있어서 매번 사용할 때마다 혼동하는데 이 함수가 아니라 위의 함수를 사용해야 한다. MSDN의 설명에 따르면 두 번째 인자가 0 인 경우 line-break 가 없어진다고 나와 있다. 하지만 첫 번째 인자를 NULL 로 하는 것이 어떤 의미인지는 설명이 안 나와 있다. 아마도 현재 설정되어 있는 것을 변경시키지 않는다는 의미일 듯 한데 정확하진 않고 어쨌든 저렇게 호출하면 줄바꿈을 없앨 수 있..
CRichEditCtrl 에서 바탕색/글자색 설정하기 MFC 에서 CRichEditCtrl 의 instance 를 사용할 때 배경색 혹은 글자색을 지정했는데 변경되지 않으면 다음을 확인해 본다. 즉, format 에서 CFE_AUTOBACKCOLOR 이나 CFE_AUTOCOLOR 가 설정되어 있는지 아닌지를 확인해 보는 것이다. rec.SetSel(start_pos + i, start_pos+ line_length); *//rec.GetSelectionCharFormat(cf); //cf.crTextColor = RGB(255,255,0); *cf.dwMask |= CFM_BACKCOLOR;*cf.dwEffects &= ~CFE_AUTOBACKCOLOR; *cf.crBackColor = (type == 1 ? RGB(255,0,0) : RGB(0,0,255..
파일 끌어 놓기 구현 (drag & drop)DragAcceptFiles(); 파일을 프로그램 창으로 끌어 놓은 것을 인식하여 처리하는 방법을 알아 보자. 아주 간단하다. 우선, 끌린 파일을 인식할 창(실제로 보이는)을 주관하는 class 의 적당한 곳에서 DragAcceptFiles(); 함수를 호출해 주자. 한 번만 호출해 주면 된다. 그 후, WM_DROPFILES message handler 에 다음과 같이 코딩해 주면 된다. void CDiagnosisFeatureDiscoveryView::OnDropFiles(HDROP hDropInfo){TCHAR buf[MAX_PATH] = _T(""); UINT ret = DragQueryFile(hDropInfo, 0xffffffff, buf, MAX_PATH); if(ret != 1) return; DragQueryFile(hD..
글자의 크기를 알아 오기 - GetTextExtent CDC 의 instance 나 CDC 를 상속받은 클래스에서 글자를 출력할 때 글자의 크기를 픽셀 단위로 반환해 주는 함수는 GetTextExtent 이다. 사용법은 매우 간단하다. CSize CDC::GetTextExtent(LPCTSTR lpszString, int nCount) const;CSize CDC::GetTextExtent(const CString& str) const; 중 하나를 사용하면 된다. 그러면 [str]을 출력하기 위해 필요한 글자의 크기를 pixel 단위로 반환받을 수 있다. 간단한 사용 예를 살펴 보면 다음과 같다. int x = margin_left + static_cast(0.5 + i*(bar_width/(tick_num - 1.0))); int y = line_y; p..
unicode 와 ansi, std::string 과 CString 상호 변경하기 unicode 와 ansi 를 섞어 쓰면서 std::string 과 std::wstring, CString 을 상호 변환하는 방법을 살펴 보자. unicode 를 쓰면서 MFC에서 STL 을 쓰기 위해선 이들을 서로 변경해야 할 경우가 많아 이 곳에 정리해 둔다. 환경 : Visual Studio 2010 on Windows 7 Professional SP1, English, 64-bit. 우선 기본적으로 MFC에서 unicode 과 ansi 를 상호변환하기 위해서는 CF2CT 형식을 따르며, 이 때 F 와 T 는 A와 T 중 하나의 값이 될 수 있다. T는 _T macro 에서 알 수 있듯이 multibyte 로의 변환을 의미하는 것이고, A 는 ANSI 를 의미한다. 따라서 ansi 에서 unicod..