본문 바로가기

Dialog

사용자 정의 메시지의 사용법 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 !!! 더보기
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를 인클루드하고 다음과 같이 멤버변수로 등.. 더보기
Dialog에 카메라 영상 띄우는 간단한 기본소스 OpenCV를 이용해 Dialog에 카메라 영상을 띄우는 간단한 소스이다. 말 그대로 영상을 띄우기만 하는 소스이다. ㅋ 카메라 연결과 관련된 부분은 Connect_camera 함수이고 CallBack함수 내에서 IplImage구조체를 이용하여 영상 데이터를 가지고 하고 싶은 걸 맘대로 하면된다. 카메라 선택창이 뜨지 않고 PC에 기본으로 설정된 카메라와 바로 연결된다. 뭐 하나 할때마다 카메라 연결 세팅하는게 귀찮아~ㅋ 더보기
다이얼로그의 배경색 바꾸기 다이얼로그 기반으로 프로그램을 하다보면 회색의 우중충한 다이얼로그 색 때문에 내 기분까지 우울해진다... 사실 그렇지는 않지만 언젠가 필요할 다이얼로그의 배경색을 바꾸는 법은 다음과 같이 OnEraseBkgnd() 함수의 재정의를 통해서 가능하다. BOOL XXXXXXX::OnEraseBkgnd(CDC* pDC) { CRect winRC; GetClientRect(winRC); CBrush bkBrush(RGB(0, 0, 100)); CBrush* pOldBrush = pDC->SelectObject(&bkBrush); pDC->Rectangle(winRC); pDC->SelectObject(pOldBrush); return TRUE; } OnEraseBkgnd()가 Class Wizard의 Messag.. 더보기
다이얼로그 기반 프로그램에서 실행과 동시에 다이얼로그 감추기 다이얼로그를 domodal로 띄울 때 실행과 동시에 다이얼로그를 트레이로 내리거나 감추어야 할 경우 일반적으로 사용하는 방법으로 윈도우를 보이지 않게 하려면 ShowWindow(FALSE); 와 같이 하면 되지만 다이얼로그 기반의 프로그램에서는 DoModal 함수가 내부적으로 WM_SHOWWINDOW 메시지를 사용하여 윈도우를 띄워버리기 때문에 OnInitalDialog나 OnCreate 처리기에서 인위적으로 ShowWindow(SW_HIDE); 라고 코딩을 해놓아도 해당 작업이 무시되어 버린다. 이러한 문제가 발생하는 이유는 DoModal 함수가 내부적으로 메시지 루프를 형성하기 직전에 SendMessage를 이용하여 대화상자를 출력시키는 방법을 사용하기 때문이다. SendMessage를 보낸 쪽은 받.. 더보기
Dialog의 class name 강제로 바꿔서 사용하기 MFC를 이용해 여러 개의 다이얼로그를 가지는 프로그램을 만들 때 한쪽 다이얼로그에서 다른 어떤 다이얼로그로 메세지를 날려줘야할 상황이 생기면 유용한 팁입니다. 특히나 메세지를 받는 쪽 다이얼로그가 캡션이 없는 다이얼로그고 클래스 네임을 이용해서 핸들을 얻어야 할 때 말이죠. SendMessage를 이용해서 특정 다이얼로그로 이벤트를 날릴려면 먼저 FindWindow함수를 이용해서 받는 쪽 다이얼로그의 핸들을 얻어와야겠죠. FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName ); FindWindow함수의 원형은 위와 같습니다. 앞 쪽의 인자가 클래스 네임이 되고, 뒤 쪽의 인자가 윈도우의 캡션입니다. 하지만 위에서 말씀드렸다시피 다이얼로그의 캡션이 없기.. 더보기