본문 바로가기

다이얼로그

컨트롤의 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를 인클루드하고 다음과 같이 멤버변수로 등.. 더보기
다이얼로그의 배경색 바꾸기 다이얼로그 기반으로 프로그램을 하다보면 회색의 우중충한 다이얼로그 색 때문에 내 기분까지 우울해진다... 사실 그렇지는 않지만 언젠가 필요할 다이얼로그의 배경색을 바꾸는 법은 다음과 같이 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.. 더보기
타이틀바가 없는 다이얼로그의 이동 타이틀바가 없는 다이얼로그 또는 타이틀바가 아니라 다른 부분을 클릭해도 다이얼로그의 이동이 가능하게 해야 할 경우 다음과 같이 OnLButtonDown() 내에서 PostMessage를 이용하여 다음과 같은 메시지를 발생시키면 이동이 가능하다. PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); WM_NCLBUTTONDOWN은 wParam으로 주어진 곳의 클라이언트을 클릭했다고 하더라도 클라이언트 영역이 아닌 곳을 클릭한 것과 같은 효과를 주며 wParam이 HTCAPTION이므로 클라이언트 영역을 클릭했어도 타이틀바를 클릭한 것과 같은 효과를 주는 것이다. wParam으로 가능한 여러가지 값들은 다음과 같다. HTTOP : 크.. 더보기
다이얼로그 기반 프로그램에서 실행과 동시에 다이얼로그 감추기 다이얼로그를 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함수의 원형은 위와 같습니다. 앞 쪽의 인자가 클래스 네임이 되고, 뒤 쪽의 인자가 윈도우의 캡션입니다. 하지만 위에서 말씀드렸다시피 다이얼로그의 캡션이 없기.. 더보기