'2007/11'에 해당되는 글 7건

  1. 2007.11.24 [MFC]슬라이더 컨트롤 사용법 by system
  2. 2007.11.23 [MFC] CFileDialog 사용법 by system 1
  3. 2007.11.22 에디트 박스에서 자동줄바꿈 기능추가하기 by system
  4. 2007.11.21 [MFC 탐색] CList 에서 GetNext 의 함정 by system
  5. 2007.11.21 [MFC 탐색] CList by system
  6. 2007.11.20 WindowRect, ClientRect 사용 예 by system 2
  7. 2007.11.17 PICTURE Control에 이미지 뿌리기 by system
슬라이더 컨트롤(Slider Control)
 
   1. 대화상자에 슬라이더을 붙이자.
 
   2. 슬라이더 컨트롤의 컨트롤 변수 추가
      CSliderCtrl         m_ctrSlider;
 
   3. 슬라이더 컨트롤 설정
      // 사용영역 값 설정한다.
      m_ctrSlider.SetRange(0, 100);

      // 최소 값 설정.
      m_ctrSlider.SetRangeMin(0);

      // 최대 값을 설정.
      m_ctrSlider.SetRangeMax(100);
 
      // 위치 설정.
      m_ctrSlider.SetPos(50);
 
      // 눈금 간격을 설정한다.
      // 속성Tick MarksAuto TicksTrue로 되어 있어야 한다.
      m_ctrSlider.SetTicFreq(10);

      // 키보드 커서키로 슬라이더를 움직일때의 증가 크기를 설정
      m_ctrSlider.SetLineSize(1);

      // 키보드의 PgUp, PgDn키를 누르거나 마우스로 슬라이더의 몸동을 클릭시 움직일 크기
      m_ctrSlider.SetPageSize(10);
 
      // 슬라이더의 특정 영역 선택.
      // 속성Enable Selection RangeTrue로 되어 있어야 한다.
      m_ctrSlider.SetSelection(30, 70);
      // 선택영역 지운기.
      m_ctrSlider.ClearSel();
 
   4. 슬라이더가 이동 되었을때.
      - 슬라이더 컨트롤의 이벤트 NM_RELEASEDCAPTURE를 사용한다.
      - 마우스로 슬라이더의 이동이 끝난 후 발생한다.
         int nPos = m_ctrSlider.GetPos();   // 현재 슬라이더의 위치를 알아낸다.
 
   5. 슬라이더가 움직일때 마다 값을 알고자 한다면.
      - 대화상자의 메시지 WM_HSCROOL를 사용한다. 세로 슬라이더라면 WM_VSCROOL을 사용한다.
 
         void CDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
         {
            // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 
            if(pScrollBar)
            {
               // 어떤 슬라이더인지 검사
               if(pScrollBar == (CScrollBar*)&m_ctrSlider)
               {
                  // 슬라이더의 위치를 검사한다.
                  int nPos = m_ctrSlider.GetPos();
               }
            }
            else
            {
               // CScrollView를 상속받은 뷰의 경우 프래임의 스크롤롤 동작시 pScrollBarNULL된다.
            }
 
            CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
         }
 
-------------------------------------------------------------
Posted by system
l

CFileDialog 정의

 

CFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL,

           DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWITEPROMPT, OPCTSTR lpszFilter = NULL,

           CWnd *pParentWnd = NULL)

bOpenFileDialog

TRUE:열기, FALSE: 다른 이름으로저장

lpszDefExt

기본 확장자. ("*.cpp"라고 입력하면 파일명 뒤에 자동으로 test.cpp가 붙는다")

lpszFileName     

대화상자가 처음 출력되었을 때 "파일 이름" Edit 컨트롤에 출력될 파일명 지정

dwFlags

OFN_EXPLOPER   

윈도우 탐색기 스타일로 출력

OFN_ARROWMULTISELECT

파일을 한번에 여러개 선택 가능

OFN_CREATEPROMPT 

존재하지 않는 파일명을 입력했을 경우 새로 생성하겠냐는 메시지 박스 출력

OFN_FILEMUSTEXIST   

존재하지 않는 파일명을 입력할 수 없도록 함

OFN_HIDEREADONLY

읽기전용 파일은 출력하지 않음

OFN_LONGNAMES

긴 파일 이름 포맷 지원

OFN_OVERWRITEPROMPT 

존재하는 파일명을 입력했을 경우 덮어쓰겠냐는 메시지 박스 출력

OFN_PATHMUSTEXIST     

이미 존재하는 디렉터리명만을 입력

lpszFilter

대화상자에 출력될 파일들을 확장자에 의해서 걸러지도록 하기 위한 필터 지정

pParentWnd

대화상자의 부모 윈도우 지정



CFileDialog 클래스의 멤버 함수

CString GetPathName

선택된 파일의 절대경로

CString GetFileName

선택된 파일의 이름과 확장자

CString GetFileExt

선택된 파일의 확장자

String GetFileTitle

선택된 파일의 파일명

BOOL GetReadOnlyPref 

읽기전용 여부

POSITION GetStartPosition

다중 선택의 경우 사용

CString GetNextPathName



CFileDialog 클래스의 인스턴스를 선언하고 DoModal 함수 호출

- 한개의 파일만 선택할 경우

char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
if(IDOK == dlg.DoModal())
{
        CString strPathName = dlg.GetPathName();
}



-
여러개의 파일을 복수 선택할 경우

char szFilter[] = "All Files(*.*) | *.* ||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFiilter);

if(IDOK == dlg.DoModal())
     
for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
              m_ctrlListBox.AddString(dlg.GetNextPathName(pos));

출처 : http://cafe.naver.com/alba1000.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=106
Posted by system
l
1. 에디트 박스를 만든다.
2. 속성에서 멀티 라인을 체크한다.
3. 속성에서 자동행스크롤 기능을 해제한다.

그러면, 문자열이 에디트 박스의 폭보다 클 경우 부족한 문자열이 다음 줄에서 계속 됩니다.
Posted by system
l
CList 를 사용하여 데이터를 List 구조 안에 차근차근 넣다가보면
특정 위치에서 데이터를 찾을때 GetNext 라는 CList 의 멤버 함수를 사용하게 마련이다.
이때, 헷갈리기 쉬운 것이, GetNext 라고 하면 현재 위치의 다음 위치에 있는
데이터를 내 놓으라고 하는 것 같지만
사실은 현재 위치의 데이터를 뱉어낸 다.음.에 그 다음 위치로 넘어간다는 것이다.
따라서, GetNext 로 나온 데이터만 보고 , 아... 여기에다 업데이트 해야지 잇힝~ 하고는
SetAt 을 사용해버리면, 원하는 위치가 아닌, 그 다음 위치에 데이터 업데이트가 되기 때문에
무척이나 조심해야 한다.
이것이 바로 GetNext 의 함정인 것이다!!! (뭔... 명탐정 코난이냐...)

예제를 통해 확인해보자.

일단 CList 를 사용한 list 구조를 만든다. 헤더에...
int 형의 m_iTest 와 CString 형의 m_strTest 라는 두개의 변수를 가지고 있는 List 구조체? 이다.

class CTest
{
public:
 CTest() {}
 CTest(int m_iTest, CString &m_strTest) { CTest::m_iTest = m_iTest; CTest::m_strTest = m_strTest; }
 void operator=(CTest& test) { m_iTest = test.m_iTest; m_strTest = test.m_strTest; }
 int m_iTest;
 CString m_strTest;
};

정의한 CTest 를 사용해야지
cpp 파일에는 다음과 같은 내용이 들어간다.

CList<CTest, CTest&> m_Test;

// 데이터를 추가해보자
// int 형의 숫자들과, CString 형의 문자열이 차근차근 들어간다.
m_Test.AddHead(CTest(1, CString("a")));
m_Test.AddHead(CTest(2, CString("b")));
m_Test.AddHead(CTest(3, CString("c")));

// 맨 처음의 위치를 받아온다.
POSITION pos = m_Test.GetHeadPosition();
int i = 0;

// 데이터 중 2 가 있으면 4로 바꾸고, CString 형의 문자열도 b 를 d 로 바꾼다는 내용.
while(i<m_Test.GetCount())
{
     CTest test = m_Test.GetNext(pos);
     if(test.m_iTest == 2)
     {
          test.m_iTest = 4;
          test.m_strTest = "d";
          m_Test.SetAt(pos, test);
          break;
     }
     i++;
}

자, 여기서 GetNext 함수를 사용했다.
2가 발견되면 4로 바꾸고 문자열도 d 로 바꾼다.
하지만 CTest 의 내부를 보면 다음 처럼 바뀌어 있다.
// AddHead 를 했으므로 마지막에 한 3, c 가 맨 앞에 있게 된다.
3, c
2, b
4, d

처음의 의도는 2, b 가 들어있는 데이터를 4, d 로 바꾸는 것이었는데
2, b 는 멀쩡하고, 1, a 가 4, d 로 바뀌어 버렸다.
앞서 말한대로, GetNext 를 쓰면
현재의 위치에 있는 데이터를 반환한 뒤 다음 위치로 넘어가기 때문.이다.
따라서, m_Test.SetAt(pos, test) 를 한 시점에서 pos 는
2, b 가 아니라 1, a 의 position 인 것이다 !!!

올바르게 2, b 를 바꾸려고 한다면
다음처럼 해야 한다.

while(i<m_Test.GetCount())
{
     CTest test = m_Test.GetAt(pos);
     if(test.m_iTest == 2)
     {
          test.m_iTest = 4;
          test.m_strTest = "d";
          m_Test.SetAt(pos, test);
          break;
     }
     i++;
     test.GetNext(pos);
}

먼저 GetAt 를 이용하여 정확하게 현재 위치의 데이터를 받아 온 후
조건에 맞으면 SetAt 으로 업데이트를 시켜주고 나서
GetNext 로 다음 위치로 넘어가야 한다.

실험 성공.

출처 : http://lafirr.tistory.com/8
Posted by system
l

인클루드 <afxtempl.h>


CList<타입,타입&> list;


여기서 POSITION (pos)를 따로 선언하여 필요할 때 사용.

<-  Tail  ---------------  Head  ->

<-  Next  ---------------  Prev  ->

<-  After  ---------------  Before  ->


List 안에 있는 값을 얻을 때 개수 범위가 넘었는지를 확인 해주어야 한다. 안그러면 ASSERT 발동


Head/Tail 접근

GetHead list의 head element를 리턴한다. (empty면 할 수 없다).
GetTail list의 tail element를 리턴한다.(empty면 할 수 없다).

Operations(조정)

AddHead

하나의 element(또는 다른 list의 모든element들)을 list의 head에 추가한다(새로운 head를 만든다).

AddTail

하나의 element(또는 다른 list의 모든element들)을 list의 tail에 추가한다(새로운 tail를 만든다).

RemoveAll list의 모든 element를 제거한다.
RemoveHead list의 head로부터 element를 제거한다.
RemoveTail list의 tail로부터 element를 제거한다.

Iteration(반복)

GetHeadPosition head의 position을 리턴한다.
GetNext

(position이) 반복되어 다음 element로 도달한다.(원래 인수로 넣었던 position의 값으로 리턴하고 position을 다음 위치로 바꿔진다)

GetPrev

(position이) 반복되어 이전 element로 도달한다.(원래 인수로 넣었던 position의 값으로 리턴하고 position을 이전 위치로 바꿔진다)

GetTailPosition tail  position을 리턴한다.

Retrieval(정정)/Modification(수정)

GetAt 주어진 position에서 element(값)을 얻는다.
RemoveAt position에 의해 정해진 element 를 list로부터 제거한다.
SetAt 주어진 position에서 element(값)을 넣는다.

Insertion(삽입)

InsertAfter 주어진 position 뒤에 새로운 element를 삽입한다.
InsertBefore 주어진 position 앞에 새로운 element를 삽입한다.

Searching(찾기)

Find pointer 값에 의해 정해진 position을 얻는다.
FindIndex zero-based index 값에 의해 정해진 position을 얻는다.

Status(상태)

GetCount list의 element 개수를 리턴한다
GetSize list의 element 개수를 리턴한다
IsEmpty 비어있는 상태인지 검사한다.(no elements).

출처 : http://blog.naver.com/yjh1990?Redirect=Log&logNo=130020477353

Posted by system
l
사용자 삽입 이미지

WindowRect, ClientRect 사용예

MFC를 사용하다보면 컨트롤 영역을 구해야 할 경우가 종종 생긴다.
근데 헷깔려도 너무 헷깔린다는거~ 그래서 준비했다.
아주 쉽게 그림으로 설명한 WindowRect, ClientRect 사용 예

1. 윈도우 기준 절대 좌표
CRect rect;
GetDlgItem (nID)->GetWindowRect(&rect);

2. 다이얼로그 영역 안의 컨트롤의 상대좌표
CRect rect;
GetDlgItem (nID)->GetWindowRect (&rect);
ScreenToClient (&rect);

3. 컨트롤의 Client(0,0에서 시작하는) 좌표
CRect rect;
GetDlgItem (nID)->GetClientRect (&rect);

이제 실 수 하는일 없겠죠?
Posted by system
l
사용자 삽입 이미지

위와 같이 다이얼로그 박스위에 PICTURE 컨트롤이 있을 때 OpenCV에 있는 CvvImage 함수를 이용하여 간단하게 모든 종류의 이미지를 뿌려줄 수 있습니다.

1. Picture Control에 DC를 얻어 옵니다.
 - MDI 기반의 경우 OnDraw에서 pDC->GetSafeHdc()를 이용합니다.
 - 다이얼로그 기반인 경우 CClientDC dc(GetDlgItem(IDC_XXXXX)) 를 이용합니다.

2. 컨트롤에 핸들을 얻어 옵니다.
 - CWnd* org = (CXXXX*)GetDlgItem(IDC_XXXXX);

3. 해당 영역을 얻어 옵니다.
 - org->GetClentRect(rect)

4. CvvImage 멤버함수 Draw 또는 DrawToHDC를 사용하여 다이얼로그에 뿌려줍니다.
 - Draw함수는 이미지 크기 그대로 화면에 뿌려주므로 DrawToHDC를 이용하면 좋습니다.
Posted by system
l