프로그래밍/MFC2011. 5. 9. 09:28



1. 헤더파일에 afx_msg void OnCustomDrawList( NMHDR* pNMHDR, LRESULT* pResult ) 추가

2. cpp 파일에 ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST1, OnCustomDrawList)

3. void CDlg::OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult ) 구현

void CDlg::OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult )     // 리스트 데이터 글자색 변경
{
 //This code based on Michael Dunn's excellent article on
 //list control custom draw at http://www.codeproject.com/listctrl/lvcustomdraw.asp
 
 NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
 
    // Take the default processing unless we set this to something else below.
    *pResult = CDRF_DODEFAULT;
 
    // First thing - check the draw stage. If it's the control's prepaint
    // stage, then tell Windows we want messages for every item.
 if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
 {
        *pResult = CDRF_NOTIFYITEMDRAW;
 }
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
 {
        // This is the notification message for an item.  We'll request
        // notifications before each subitem's prepaint stage.
  
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
 }
    else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
 {
  
  COLORREF clrNewTextColor, clrNewBkColor;
       
  int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec ); //row
  
  CString strTemp = m_list1.GetItemText(nItem,pLVCD->iSubItem);
  float rt_06, rate;
  
  
  switch(pLVCD->iSubItem)
  {
  case 0:
   break;
  case 1:
   break;
  case 2:
   rt_06 = atof(strTemp);
   if(rt_06 > 0)
    clrNewTextColor = RGB(255, 0, 0);
   else if(rt_06 <0)
    clrNewTextColor = RGB(0, 0, 255);
   else
    clrNewTextColor = RGB(0, 0, 0);
   pLVCD->clrText = clrNewTextColor;
   break;
  case 3:
   rate = atof(strTemp);
   if(rate > 0)
    clrNewTextColor = RGB(255, 0, 0);
   else if(rate <0)
    clrNewTextColor = RGB(0, 0, 255);
   else
    clrNewTextColor = RGB(0, 0, 0);
   
   pLVCD->clrText = clrNewTextColor;
   break;
  case 4:
   clrNewTextColor = RGB(0, 0, 0);
   pLVCD->clrText = clrNewTextColor;
   break;

  }
        *pResult = CDRF_DODEFAULT;       
 }
}

Posted by 마블(이환문)
프로그래밍/MFC2011. 4. 14. 15:20

추가된 API 이기 때문에 msimg32.lib를 라이브러리 link 탭에 연결해야 된다

'프로그래밍 > MFC' 카테고리의 다른 글

CList 글자색 변경하기  (0) 2011.05.09
GetPrivateProfileString  (0) 2011.04.11
콤보박스 다운리스트 높이 지정하기  (0) 2011.04.07
MFC 콤보박스 함수 설명  (0) 2011.04.07
MFC - debug 창에 디버깅값 출력하기  (0) 2011.03.25
Posted by 마블(이환문)
프로그래밍/MFC2011. 4. 11. 19:18

함  수  명 : GetPrivateProfileString()

 

설       명: *.ini또는 ini의 형태 파일에서 지정한 section의 string 값을 읽어온다.

종       류 :ini,inf,dll

선  언  부 :  GetPrivateProfileString( LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName )

파라미터 :  lpAppName= 색션이름

                 lpKeyName= 읽으려는 값의 이름

                 lpDefault = 지정된 값을 찾을수 없을때 반환되는 디폴트값

                 lpReturnedString = 지정한 키의 자료를 읽은 문자 스트링

                 nSize =  lpReturnedString 의 크기  또는 버퍼사이즈

                 lpFileName =ini 파일의 경로와 파일명

리턴값 :  성공하면 버퍼로 들어오는 문자의 개수, 버퍼가 작으면 -1


Posted by 마블(이환문)
프로그래밍/MFC2011. 4. 7. 14:57

MFC 리소스 편집기에서 콤보박스의 리스트크기 조절하기

① 콤보박스를 넣으면 밑처럼 나오고,

ㅁ. . . . . . . . ㅁ. . . . . . . . . .ㅁ

---------------------┌ㅡ┐ .

                                | ▼ | <-화살표(아래)버튼을 한번 클릭하면,

---------------------└ㅡ┘ .

ㅁ. . . . . . . . ㅁ. . . . . . . . . .ㅁ

 

②점선으로된 테두리가 다르게 나타고,

 

ㅁ. . . . . . . . ㅁ. . . . . . . . . .ㅁ

---------------------┌ㅡ┐ .

                                | ▼ |  .

---------------------└ㅡ┘

                                         .

                                         .

                                         .

ㅁ. . . . . . . . @. . . . . . . . . .ㅁ

                   ↑ 이곳을 드레그해서 펼쳐진 크기를 조절할 수 있다.   

Posted by 마블(이환문)
프로그래밍/MFC2011. 4. 7. 14:29

▷ CComboBox::AddString - 스트링을 더함.
▷ CComboBox::CComboBox - ComboBox 오브젝트를 생성(구성).
▷ CComboBox::Clear -현재 선택을 지움.
▷ CComboBox::CompareItem - 새로운 리스트 항목의 상태적 위치를 결정.
▷ CComboBox::Copy - 현재 선택을 Copy.
▷ CComboBox::Create - CComboBox를 생성.
▷ CComboBox::Cut - 제거된 텍스트를 복사.
▷ CComboBox::DeleteItem - 항목이 Combo 박스에서 제거.
▷ CComboBox::DeleteString - 스트링을 제거.
▷ CComboBox::Dir - 리스트를 더함.
▷ CComboBox::DrawItem - 양상이 변할 때 불려짐.
▷ CComboBox::FindString - 첫 번째 스트링을 찾음.
▷ CComboBox::FindStringExact - 첫 번째 리스트 박스 스트링을 찾음.
▷ CComboBox::GetCount - 항목의 수를 회복.
▷ CComboBox::GetCurSel - 현재 선택된 항목의 색인을 찾음
▷ CComboBox::GetDroppedControlRect - 스크린 좌표를 되찾음.
▷ CComboBox::GetDroppedState - 리스트 박스가 보일지를 결정.
▷ CComboBox::GetEditSel - 시작과 끝나는 문자의 위치를 얻음.
▷ CComboBox::GetExtendedUI - 디폴트, 확장 사용자 인터페이스의 결정.
▷ CComboBox::GetItemData - 항목과 관련된 비트값을 회복.
▷ CComboBox::GetItemDataPtr - 포인터로서 관련된 비트 값을 회복.
▷ CComboBox::GetItemHeight - 리스트 항목의 높이를 회복.
▷ CComboBox::GetLBText - 리스트 박스로 부터 스트링을 얻음.
▷ CComboBox::GetLBTextLen - 스트링의 길이를 지정.
▷ CComboBox::InsertString - 스트링의 삽입.
▷ CComboBox::LimitText - 텍스트의 길이를 제한.
▷ CComboBox::MeasureItem - Combo 박스 치수를 결정하기 위해 불려짐.
▷ CComboBox::Paste - 현재 커서 위치에서 편집 제어로 삽입.
▷ CComboBox::ResetContent - 모든 항목의 제거.
▷ CComboBox::SelectString - 스트링을 선택, 복사.
▷ CComboBox::SetCurSel - 스트링을 선택.
▷ CComboBox::SetEditSel - 편집 제어에서 문자들을 선택.
▷ CComboBox::SetExtendedUI - 디폴트, 확장 사용자 인터페이스의 선택.
▷ CComboBox::SetItemData - 항목과 관련된 값을 정함.
▷ CComboBox::SetItemDataPtr - 포인터에 대한 관련된 값을 정함.
▷ CComboBox::SetItemHeight - 높이를 지정.
▷ CComboBox::ShowDropDown - 리스트 박스를 보여주거나 숨김.
Posted by 마블(이환문)
프로그래밍/MFC2011. 3. 25. 08:41

 TCHAR szTemp[256];
 
 _stprintf(szTemp, _T("%d\n"), LOBYTE(LOWORD(wParam)));
 OutputDebugString(szTemp);

이와 같이 사용하면 사용자가 원하는값을 디버그 창에 출력할 수 있다.

Posted by 마블(이환문)
프로그래밍/C++2011. 3. 22. 09:56

operator 변환타입()
{
           본체
}

키워드 operator 다음에 변환하고자 하는 타입의 이름을 밝히고 본체에는 변환 방법을 작성한다. 변환함수는 인수를취하지 않으며 리턴 타입도 지정하지 않는다. 왜냐하면 연산 대상은 자기 자신으로 고정되어 있고 변환 결과는 지정한 타입임을 이미 알고 있기 때문이다. 객체 자신을 다른 타입으로 변환하는 동작을 하므로 작업거리와 결과가 이미 정해져있는 것이다.

즉, 이미 operator 다음에 변환할 타입이 지정되어 있기 때문에 일반함수처럼 앞에 리턴 타입이 필요 없다

'프로그래밍 > C++' 카테고리의 다른 글

유닉스 - math 함수 포함된 소스 컴파일 하기  (0) 2011.03.18
소수점 반올림  (0) 2011.03.18
C++ 디버깅시 TRACE 사용하기  (0) 2009.12.10
STL - List 사용하기  (0) 2009.07.16
파일 입출력 및 링크드 리스트  (1) 2009.05.01
Posted by 마블(이환문)
프로그래밍/C++2011. 3. 18. 17:46

유닉스에서 math.h 헤더 파일을 포함시키고 컴파일 하게 되면

에러가 발생한다. 이를 해결하기 위해서는 컴파일 명령시 -lm을 붙여준다.

예)
gcc -o test test.c -lm
gcc test.c -lm

이와 같이 컴파일을 하면 된다.

'프로그래밍 > C++' 카테고리의 다른 글

operator LPCTSTR()  (0) 2011.03.22
소수점 반올림  (0) 2011.03.18
C++ 디버깅시 TRACE 사용하기  (0) 2009.12.10
STL - List 사용하기  (0) 2009.07.16
파일 입출력 및 링크드 리스트  (1) 2009.05.01
Posted by 마블(이환문)
프로그래밍/C++2011. 3. 18. 17:02

실수 x 반올림한 = floor(x+0.5)

 

척 보면 이해가 갈 것이다. 0.5를 더한 후 바로 왼쪽의 정수를 찾으면 이 값이 바로 반올림값이 된다. 어째서 이게 반올림이 되는가 선뜻 이해가 가지 않는다면 x에 1.4와 1.5를 대입해 보도록 하자.

 

floor(1.4+0.5) = 1.0

floor(1.5+0.5) = 2.0

 

1.4에 0.5를 더하면 1.9가 되는데 이 값을 내림하면 1.0이 된다. 1.5에 0.5를 더하면 2.0이 되므로 내림이 발생하지 않으며 2.0의 값을 그대로 유지할 것이다. 그러므로 floor(x+0.5)라는 공식은 0.5이상의 값은 다음 오른쪽 정수로 올림하고 0.5미만의 값은 직전의 왼쪽 정수로 내림함으로써 반올림 계산을 멋지게 하고 있는 것이다.

그렇다면 floor(x+0.5) 대신 ceil(x-0.5) 공식을 사용하는 것은 어떤 효과가 있을까? 두 공식은 비슷하지만 0.5의 경계에 걸렸을 때의 처리가 조금 다르다. floor(x+0.5)는 0.5 이상의 값을 반올림하는데 비해 ceil(x-0.5)는 0.5초과 값을 반올림한다. x가 1.5일 때 floor는 2.0으로 반올림하지만 ceil은 1.0으로 내림해 버릴 것이다. 물론 x가 1.500001이라면 ceil도 2.0으로 반올림을 한다. 두 공식의 차이를 그림으로 그려 보면 반올림되는 범위가 조금 다르다.

일반적으로 반올림이라 하면 0.5 이상을 올림하는 것이므로 floor 함수를 사용하는 것이 논리적으로 합당하다. 이 반올림 공식이 음수의 경우에도 제대로 동작하는지 확인해 보기 위해 x에 -1.4, -1.5, -1.6을 대입해 보자.

 

floor(-1.4+0.5) = -1.0

floor(-1.5+0.5) = -1.0

floor(-1.6+0.5) = -2.0

 

-1.4나 -1.6의 경우는 쉽게 이해가 되지만 -1.5를 반올림했을 때 -2.0이 아닌 -1.0이 된다는 점이 순간적으로 조금 헷갈릴 것이다. 그러나 수직선을 그려 놓고 생각해 보면 제대로 반올림되었다는 것을 확인할 수 있다. int(x+0.5)도 floor(x+0.5)와는 다르다. 캐스트 연산자는 무조건 소수점 이하를 기계적으로 잘라 버리기 때문에 x가 음수일 경우 터무니없는 결과가 나온다.

C는 자주 사용하는 기능에 대해 표준 함수들을 제공하지만 응용이 가능한 기능에 대해서는 별도의 함수를 제공하지 않는다. floor라는 간단한 함수로 반올림을 하는 것처럼 표준 함수를 조금만 응용하면 얼마든지 좀 더 복잡한 연산을 만들어 쓸 수 있기 때문이다. 표준 함수들을 많이 아는 것도 중요하지만 이미 알고 있는 함수들을 응용하는 능력도 중요하다. 이번에는 floor 함수를 한단계 더 응용하여 소수점 둘 째자리에서 반올림되도록 해 보자. 이 공식은 다음과 같다.

 floor(x*10+0.5)/10

x를 10배한 후 반올림하고 다시 10으로 나누면 소수점 둘 째자리에서 반올림된다. x가 3.14라고 했을 때 31.4로 만든 후 0.5를 더해 31.9로 만들고 이 값에 대해 floor 함수를 호출하면 31이 된다. 결과값을 다시 10으로 나누면 3.1이 될 것이다. 원래 x값에 10을 곱해 소수점을 잠시 왼쪽으로 한칸 옮긴 후 반올림 처리하고 다시 오른쪽으로 한칸 옮기는 것이다.

같은 원리로 소수점 셋 째자리에서 반올림하려면 floor(x*100+0.5)/100 공식을 사용하면 되고 소수점 넷 째자리에서 반올림하려면 floor(x*1000+0.5)/1000 공식을 쓴다. 곱하고 나누는 수만 조정하면 반올림되는 자리수를 원하는대로 지정할 수 있고 더하는 0.5를 조정하면 반올림 경계도 입맞대로 설정할 수 있다. 이 공식을 좀 더 일반화하면 소수점 n번째 자리에서 반올림되는 함수를 만들 수 있는데 아주 간단하므로 매크로 함수로 정의해 보았다.

#define banollim(x,dig) (floor((x)*pow(10,dig)+0.5)/pow(10,dig))



츌처 : www.winapi.co.kr

'프로그래밍 > C++' 카테고리의 다른 글

operator LPCTSTR()  (0) 2011.03.22
유닉스 - math 함수 포함된 소스 컴파일 하기  (0) 2011.03.18
C++ 디버깅시 TRACE 사용하기  (0) 2009.12.10
STL - List 사용하기  (0) 2009.07.16
파일 입출력 및 링크드 리스트  (1) 2009.05.01
Posted by 마블(이환문)
프로그래밍/OpenCV2010. 10. 7. 17:43

CvMemStorage
동적으로 확장 가능한 메모리스토리지

 

몸체

typedef struct CvMemStorage
{

     struct CvMemBlock* bottom;      /* 최초로 확보된 블록 */
     struct CvMemBlock* top;       /* 새로운 블록을 확보하는 장소 */
     struct CvMemStorage* parent;       /* 현재의 메모리브록크 - 스택의 선두 */
     int block_size;      /* 블록의 크기 */
     int free_space;       /* top 블록내의 자유 영역(아르바이트 단위) */
} CvMemStorage;

 


메모리스토리지는 저레벨의 구조체로, 동적으로 확장 가능한 데이터 구조를 가져, 순서나 윤곽, 그래프, 세분화 등에 사용된다. 이것은 같은 사이즈의 메모리브록크의 리스트로서 편성되고 있다.


bottom 필드는 블록의 리스트의 선두, top(은)는 현재 사용되고 있는 블록을 의미하지만, 리스트의 마지막 블록은 반드시 필요하지 않다. top 이외의 bottom(으)로부터 top 까지의 블록은 모두 점유 되고 있다. top(을)를 제외한다 top(으)로부터 끝까지의 모든 블록은 비어 영역에서, top 블록 자체는 부분적으로 점유되고 있다. free_space(은)는, top 의 뒤로 남아 있는 아르바이트 단위로 나타난 자유 영역을 의미한다.

함수 cvMemStorageAlloc 그리고 명시적으로, 혹은 cvSeqPush(이)나 cvGraphAddEdge 등의 고레벨 함수에 의해서 간접적으로 확보된 새로운 메모리 영역은, 거기에 들어가는 경우에는항상 현재의 블록의 마지막에 확보된다. 확보 후 free_space(은)는, 적절한 얼라이먼트를 보관 유지하기 위해서, 확보한 밧파사이즈에 패딩을 더한 만큼 두개 줄여진다. 확보된 버퍼가 top 의 이용 가능한 영역에 들어가지 않는 경우, 리스트의 다음의 스토리지 블록이 top(으)로서 이용되어 free_space(은)는 확보전의 전브록크사이즈에 리셋트 된다.
만약 비어 블록이 없는 경우, 새로운 블록이 확보되어 (또는 부모로부터 빌리고,cvCreateChildMemStorage(을)를 참조), 리스트의 마지막에 추가된다.이와 같이 이 스토리지는 스택으로서 행동해, bottom 하지만 스택의 바닥, top(와)과 free_space 의 페어가 스택의 선두를 나타낸다. 

Posted by 마블(이환문)