본문 바로가기

MFC

MFC 분할 윈도우(4) - 다중 분할 윈도우 만들기 이번엔 다중 분할 윈도우 예제입니다. 앞서 만들었던 정적 분할 윈도우 예제 소스를 약간 수정만 하면 쉽게 다중 분할 윈도우를 만들 수 있습니다. ◎ CSplitterWnd 클래스의 인스턴스 생성 다중 분할 윈도우는 생성된 분할 윈도우의 위에 또 다른 분할 윈도우를 올려 놓는 것입니다. 그래서 필요한 분할 윈도우의 갯수만큼 인스턴스를 생성해야 합니다. 아래와 같이 두 개의 인스턴스를 만듭니다. CSplitterWnd m_wndSplitter1; CSplitterWnd m_wndSplitter2; 만드는 위치는 물론 CMainFrame 클래스입니다. ◎ OnCreateClient의 재정의 다음으로 OnCreateClient함수를 재정의 합니다. m_wndSplitter1을 이용해서 윈도우를 좌, 우로 나누어.. 더보기
MFC 분할 윈도우(2) - 동적 분할 윈도우 만들기 SDI기반에서 동적 분할 윈도우를 만드는 방법에 대한 간단한 예제입니다. 동적 분할 윈도우를 만드는 과정은 아주 간단합니다. MFC 프로그램에서 윈도우의 형태와 메뉴바 등과 관련된 부분을 담당하는 부분은 CMainFrame입니다. 분할 윈도우도 CMainFrame에서 만들어줍니다. 아래와 같이 두 과정을 거치면 쉽게 만들 수 있습니다. ◎ CSplitterWnd 클래스의 인스턴스 선언 처음해야 될 일은 분할 윈도우가 가지는 여러가지 기능을 담당하는 CSplitterWnd 클래스의 인스턴스를 선언합니다. CMainFrame의 멤버 변수로 아래와 같이 선언합니다. CSplitterWnd m_wndSplitter; ◎ OnCreateClient 함수의 재정의 프로그램 상에서 분할 윈도우의 위치는 프레임 윈도우.. 더보기
MFC 분할 윈도우(1) 분할 윈도우(Splitter Window)는 하나의 프레임 윈도우를 두 개 이상의 윈도우로 나누어 주는 기능을 하는 윈도우 입니다. 가장 대표적인 예로 아래 그림의 윈도우 탐색기를 들 수 있으며 같은 데이터를 보여주는데 보여주는 위치나 보여주는 형태가 다른 경우에 많이 사용합니다. 사용자는 분할 윈도우를 이용하여 원하는 만큼의 뷰 영역을 설정 할 수 있고, 각각의 뷰 영역에는 뷰 윈도우 뿐만 아니라 여러가지 일반 윈도우도 올라 갈 수 있습니다. 분할 윈도우에는 다음과 같이 두 가지 종류가 있습니다. ◎ 동적 분할 윈도우 - 프로그램 실행 중 윈도우를 하나로 합치거나 나눌 수 있으며 스크롤바 끝 부분에 분할바가 있습니다. 분할바를 윈도우의 한 쪽 끝까지 움직이면 나누어져있던 윈도우가 합쳐지고 끝 쪽에 있는.. 더보기
마우스 이벤트 관련 함수 정리 마우스 이벤트와 관련된 함수로 아래와 같은 것들이 있습니다. ◎ GetCursorPos 현재 마우스 커서의 위치를 얻어주는 함수이며 원형은 아래와 같습니다. GetCursorPos(LPPOINT lpPoint) CPoint 형으로 변수를 하나 선언하고 그 주소를 인자로 넣어주면 마우스 커서의 x, y 좌표를 변수에 담 아줍니다. ◎ SetCursorPos 마우스 커서를 X, Y의 위치로 이동시키는 함수이며 원형은 아래와 같습니다. SetCursorPos(int X, int Y) 인자로 넣는 x, y 좌표의 위치로 마우스 커서를 이동시켜줍니다. ◎ mouse_event 마우스와 관련된 여러가지 이벤트를 발생시키는 함수입니다. 원형은 아래와 같습니다. mouse_event( DWORD dwFlags, DWO.. 더보기
PreCreateWindow 함수의 재정의... PreCreateWindow는 MFC가 제공하는 가상함수들 중 하나로 사용자가 쉽게 재정의하여 사용이 가능합니다. 이름처럼 윈도우가 생성되기 직전에 호출되며, 생성될 윈도우에 대한 정보가 파라미터로 넘어오게 되고, 이 파라미터가 가지는 값을 이용해서 윈도우가 생성됩니다. 따라서 개발자가 윈도우의 스타일이나 속성을 변경하고 싶을때는 PreCreateWindow가 넘겨받는 파라미터를 변경시켜주면 생성되는 윈도우의 속성도 따라서 변하게 되는것입니다. 함수의 원형은 아래와 같습니다. MDI 형태의 프로젝트 일 경우, CMainFrame과 CChildFrame에서 모두 찾을 수 있습니다. BOOL PreCreateWindow(CREATESTRUCT& cs); 파라미터로 넘어오는 CREATESTRUCT는 아래와 같.. 더보기
사용자 정의 메시지의 사용법 Dialog간의 통신이나 이벤트 발생시에 많이 사용하게 되는 사용자 정의 메세지 사용법. 1. 메세지를 정의한다. - 헤더파일에 다음과 같은 형식으로 정의 #define WM_TEST_MESSAGE WM_USER+10; 2. 메세지를 통해서 호출할 함수의 원형선언 및 구현. - 메세지를 받는 쪽 Dialog의 헤더에 함수원형을 선언한다. 헤더파일의 아래쪽 // Generated message map functions이라고 주석처리된 부분 밑에 아래와 같은 형식으로 선언 afx_msg LRESULT UserMSG(WPARAM wParam, LPARAM lParam); - cpp파일에 함수구현. 3. MESSAGE MAP에 등록. - cpp파일의 메세지 맵에 등록하여 정의된 메세지와 메세지를 통해 호출할 함.. 더보기
컨트롤의 Enable, Disable 관련 함수 및 예제 MFC Dialog based에서 경우에 따라 다이얼로그 상의 특정 컨트롤을 활성화, 비활성화 할 때는 해당 컨트롤의 ID와 아래의 GetDlgItem과 EnableWindow함수를 사용하여 간단히 해결이 가능합니다. GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT3)->EnableWindow(FALSE); 활성화(enable)해야되는 경우에는 EnableWindow함수의 인자에 TRUE, 비활성화(disable)해야되는 경우에는 인자에 FALSE !!! 더보기
OpenCV를 이용한 ChessBoard Corner의 인식 간단한 프로그램(VS 6.0) 카메라 영상에서 chessboard의 코너를 인식하는 간단한 예제 프로그램입니다. 프로그램을 실행시키고 인식할 chessboard의 가로와 세로를 입력한 후 Find Corners 버튼을 누르면 설정된 크기의 chessboard 코너를 인식하여 카메라 영상 내에 디스플레이합니다. 심심해서...visual studio 6.0으로 작업했음...ㅋ 언젠가 필요할 것임! 더보기
ID를 이용해 해당 컨트롤의 핸들 가져오기 GetDlgItem()을 이용하면 edit, button 등등의 컨트롤이 가지고 있는 ID를 이용해서 해당 컨트롤의 핸들을 가져와 사용할 수 있습니다. 함수원형은 다음과 같습니다. HWND GetDlgItem(HWND hDlg, int nIDDlgItem); hDlg는 컨트롤을 가지고 있는 다이얼로그의 핸들이고 nIDDlgItem은 컨트롤의 ID... 반환값이 해당 컨트롤의 핸들... 사용 예) HWND h = ::GetDlgItem(m_hWnd, IDC_BUTTON1); 더보기
임의의 클래스에서 메인 다이얼로그의 포인터를 얻어오는 방법 다이얼로그 기반의 프로젝트로 작업을 하다보면 사용자가 임의로 여러가지 클래스들을 만들어 사용하는 경우가 있다. 제너릭으로 만들든 CView, CFormView등의 MFC에 정의되있는 클래스의 상속을 받아서 만들든 다양한 형태의 클래스가 만들어 질 것이다. 보통 사용자가 만든 클래스들은 메인 다이얼로그 클래스에 헤더파일을 인클루드하고 인스턴스로 만들어져 사용이 될텐데 경우에 따라 사용자가 만든 클래스에서 메인 다이얼로그의 변수나 함수들을 사용해야 할 경우가 생기게 된다. 이런 경우 메인 다이얼로그의 포인터를 얻는 방법에는 다음의 두 가지가 있다. 메인 다이얼로그 클래스 : CMainDlg 임의로 생성된 클래스 : CChild 라고 했을 때, 1. CMainDlg.h를 인클루드하고 다음과 같이 멤버변수로 등.. 더보기