반응형

 

특정 UI 컨트롤 ID포커스(focus)를 설정할 수 있습니다.


 

# 개발 환경

운영체제 : Windows 10 Pro 64bit

개발도구 : Visual Studio 2013 Professional


 

# 결과

  • GetDlgItem(id)->SetFocus( ) 함수 사용
  • Focus 1 또는 Focus 2 버튼에 네모 점선 표시


  • GotoDlgCtrl( ) 함수 사용
  • Focus 1 또는 Focus 2 버튼 테두리에 검은색 얇은 테두리 표시


 

# 예제 소스

- #define setFocus(x) { GotoDlgCtrl(GetDlgItem(x)); GetDlgItem(x)->SetFocus(); }

#define setFocus(x) { GotoDlgCtrl(GetDlgItem(x)); GetDlgItem(x)->SetFocus(); }

void CMFCApplication2013Dlg::OnBnClickedButton1()
{
    setFocus(IDC_BUTTON2);
}

void CMFCApplication2013Dlg::OnBnClickedButton2()
{
    setFocus(IDC_BUTTON1);
}
  • GotoDlgCtrl( ), SetFocus( ) 함수를 이용하여 UI 컨트롤의 포커스를 설정함.
  • #define 로 UI 컨트롤 포커스 매크로 선언 (setFocus(x))
  • setFocus 매크로를 이용하여 포커스 설정할 UI 컨트롤 ID를 인자 값 전달함.
    ex) setFocus(IDC_BUTTON2) / setFocus(IDC_BUTTON1)

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


 

반응형
반응형

 

MFC 윈도우나 다이얼로그를 모니터 화면에 원하는 위치로 지정하여 나타낼 수 있습니다.


 

# 개발 환경

운영체제 : Windows 10 Pro 64bit

개발도구 : Visual Studio 2013 Professional


 

# 결과

  • 2560x1440 모니터에서 MFC 윈도우를 중앙 위치에 나타남


 

# 예제 소스

- OnInitDialog(void)

BOOL CMFCApplication2013Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    SetIcon(m_hIcon, TRUE);	
    SetIcon(m_hIcon, FALSE);

    CRect rect;
    GetClientRect(&rect);

    CPoint pos;
    pos.x = GetSystemMetrics(SM_CXSCREEN)/2.0f - rect.Width()/2.0f;
    pos.y = GetSystemMetrics(SM_CYSCREEN)/2.0f - rect.Height()/2.0f;
    SetWindowPos(NULL, pos.x, pos.y, 0, 0, SWP_NOSIZE);

    return TRUE;
}
  • GetClientRect( ) 은 모니터 화면에서 MFC 윈도우의 좌표 정보를 알 수 있음.
  • GetSystemMetrics(SM_CXSCREEN)모니터 해상도 x축(pixel) 크기 반환
  • GetSystemMetrics(SM_CYSCREEN)모니터 해상도 y축(pixel) 크기 반환
  • 모니터 해상도 x, y축 중앙 좌표MFC 윈도우의 중앙 좌표를 위치하도록 함. (pos.x / pos.y)
  • SetWindowPos( )MFC 윈도우 크기 및 위치 변경

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


 

반응형
반응형

 

MFC 프로그램에서 마우스 클릭 또는 키보드로 선택한 UI컨트롤에 대한 타입을 확인할 수 있습니다.


 

# 개발 환경

운영체제 : Windows 10 Pro 64bit

개발도구 : Visual Studio 2013 Professional


 

# 필요 함수


 

# 결과

  • 키보드로 스페이스(space) 또는 엔터(return)으로 조작
  • Tab 키로 UI컨트롤 포커스(focus)를 이동하면서 checkBox 또는 Button 에 키보드 키를 누릅니다.

 

# 예제 소스

- PreTranslateMessage(MSG* pMsg)

BOOL CMFCApplication2013Dlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN) // 키를 누를 경우
    {
        if((pMsg->wParam==VK_SPACE) || (pMsg->wParam==VK_RETURN)) // 스페이스바 또는 엔터 누를 경우
        {
            UINT uiType = GetWindowLong(pMsg->hwnd, GWL_STYLE) & 0x0000000F; // 컨트롤 타입 값 반환
            if     (uiType == BS_CHECKBOX || uiType == BS_AUTOCHECKBOX)    printf("clicked checkBox\n");
            else if(uiType == BS_PUSHBUTTON || uiType == BS_DEFPUSHBUTTON) printf("clicked button\n");
        }
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}
  • pMsg->message키의 상태를 알 수 있음. (WM_KEYDOWN = 키 누름) → (LINK : 윈도우메시지 보기)
  • pMsg->wParam입력한 키 정보를 알 수 있음 (VK_SPACE = 스페이스바 / VK_RETURN = 엔터) → (LINK : 가상 키 보기)
  • GetWindowLong(pMsg->hwnd, GWL_STYLE) 로 통해 UI컨트롤 타입을 알 수 있음.
  • if문 BS_(UI컨트롤 종류)로 반환된 UI컨트롤에 따른 코드를 수행할 수 있음. → (LINK : BS 종류 보기)

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


반응형
반응형

 

MFC 프로그램 창에서 PreTranslateMessage 함수를 이용하여 키보드 키 조합으로 Ctrl + A 또는 C를 누를때 printf 출력합니다.

작성된 코드를 참고하시고 활용하시기 바랍니다.


 

# 개발 환경

운영체제 : Windows 10 Pro 64bit

개발도구 : Visual Studio 2019 Community


 

# 필요 함수


 

# 결과

  • PreTranslateMessage 함수에 키보드 Ctrl+A, C를 누를 시 printf 출력


 

# 예제 소스

- PreTranslateMessage(MSG* pMsg)

BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message == WM_KEYDOWN){
        if(GetKeyState(VK_CONTROL) & 0x8000){
            if     (pMsg->wParam == 65) printf("Ctrl + A\n");
            else if(pMsg->wParam == 67) printf("Ctrl + C\n");
        }   
    }

    return CDialogEx::PreTranslateMessage(pMsg);
}
  • pMsg 매개변수로 입력한 키 정보를 받을 수 있습니다.
  • pMsg->meesage 로 통해 윈도우메시지를 받음(WM_KEYDOWN = 키 누를 때) (윈도우메시지 보기)
  • pMsg->wParam 로 통해 가상키(Virtual Key)를 받음 (VK_code) (가상코드 보기)
  • GetKeyState 로 통해 키의 토글 상태 값과 0x8000 AND연산
    - 0x8000 : 이전에 누른 적이 없고 호출 시점에서 눌린 상태

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


반응형
반응형

 

MFC 프로그램 창에서 마우스 또는 키보드 입력에 대한 이벤트를 처리할 수 있는 함수(PreTranslateMessage)
"클래스 마법사" 로 통해 만들어 낼 수 있습니다.


 

# 개발 환경

운영체제 : Windows 10 Pro 64bit

개발도구 : Visual Studio 2013 Professional


 

# 결과

  • PreTranslateMessage 함수에 printf 를 작성하여 마우스 및 키보드 입력 테스트 확인
  • 마우스 또는 키보드 입력(클릭, 키, 움직임)한 경우 printf 출력


 

# 이벤트 함수 생성

1. 클래스 뷰(Class View) 오픈


2. 클래스 선택

  • 본 프로젝트는 새로 만든 프로젝트로 이름은 다를 수 있습니다.
  • (아래 왼쪽 그림) CMFCApplication1Dlg 는 처음 프로젝트를 만들 시 main 다이얼로그에 대한 클래스입니다.
  • (아래 오른쪽 그림) CMFCApplication1Dlg 은 솔루션탐색기에서 Source Files 폴더에 ~~Dlg.cpp 라는 파일 더블클릭하시면 ~~Dlg::함수이름 으로 된 것을 확인할 수 있습니다.


3. 클래스 마법사(Class Wizard)

  • 클래스 뷰에서 CMFCApplication1Dlg 에 오른쪽 마우스 클릭 후 "클래스 마법사(Class Wizard)" 클릭


4. 이벤트 함수 생성
  1) 클래스 마법사 창 오픈
  2) 가상 함수(Virtual Functions) 메뉴 탭 선택
  3) "PreTranslateMessage" 입력
  4) PreTranslateMessage 함수 선택
  5) 함수 추가 버튼 클릭
  6) 추가된 함수 확인
  7) 확인


5. PreTranslateMessage 함수 소스 확인

 

 


 

# 전체 예제 소스

  • BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg) 참고.
#include "stdafx.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#ifdef _UNICODE
#pragma comment(linker, "/entry:wWinMainCRTStartup /subsystem:console")
#else
#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")
#endif

CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CMFCApplication1Dlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()


BOOL CMFCApplication1Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	SetIcon(m_hIcon, TRUE);	
	SetIcon(m_hIcon, FALSE);



	return TRUE;
}

void CMFCApplication1Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class

    printf("pressed the mouse or key\n");

    return CDialogEx::PreTranslateMessage(pMsg);
}

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


반응형
반응형

 

5단계로 이루어진 Visual Studio MFC 프로젝트 만들기


 

# 개발 환경

운영체제 : Windows 10 Pro 64bit

개발도구 : Visual Studio 2013 Professional


버전은 최대한 낮게 진행했습니다. 2013 이상 버전에 하셔도 문제없습니다.

 

1. 프로젝트 생성하기

 

2. C++ MFC Application 선택하기

 

3. MFC Application 프로젝트 설정하기
- 아래 그림과 같이 똑같이 설정해주시면 됩니다.

1

 

4. 프로젝트 완성 후 MFC 실행하기

 

5. MFC 프로그램 결과 확인

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


반응형

+ Recent posts