대화 상자 기반 프로그램 에서 대화 상자 에 WM 캡 처KEYDOWN 소식 의 실현 방법

6971 단어 wmkeydown
대화 상자 프로그램 에서,우 리 는 항상 대화 상자 의 하위 컨트롤 을 이용 하여 명령 응답 을 해서 일부 사건 을 처리한다.버튼 메시지 에 대화 상자(하위 컨트롤 의 부모 창)클래스 를 응답 시 키 려 면 ClassWizard 를 통 해 WMKEYDOWN 메시지 가 응답 합 니 다.프로그램 이 실 행 된 후에 키보드 의 버튼 을 눌 렀 지만 대화 상 자 는 아무런 반응 이 없습니다.이것 은 대화 상자 프로그램 에서 특정한 메시지,예 를 들 어 버튼 메시지 가 Windows 내부 의 대화 상자 과정 에 의 해 처리 되 었 기 때 문 입 니 다.(즉,기본 클래스 에서 처리 되 었 습 니 다.관심 있 는 독 자 는 MFC 의 소스 코드 를 볼 수 있 습 니 다)또는 하위 컨트롤 에 보 내 져 처리 되 었 기 때문에 우 리 는 대화 상자 류 에서 버튼 의 메 시 지 를 잡 을 수 없습니다.
이 처리 과정 을 알 게 된 이상 버튼 메 시 지 를 베이스 로 처리 하 는 함 수 를 찾 아서 하위 클래스 에서 다시 불 러 오 면 대화 상자 프로그램 에서 버튼 메 시 지 를 처리 할 수 있 습 니 다.MFC 에 서 는 BOOL ProcessMessage Filter(int code,LPMSG lpMsg)라 는 가상 함 수 를 이용 하여 메뉴 와 대화 상자 의 특정 윈도 메 시 지 를 걸 러 내 거나 응답 합 니 다.다음은 대화 상 자 를 기반 으로 한 프로그램 이 WM 에 대해 프로그램 을 통 해 보 여 드 리 겠 습 니 다.케 이 던 소식 포착.
첫 번 째 단계:새 프로젝트 를 만 들 고 MFC AppWizard(exe)를 선택 하 십시오.프로젝트 이름 은 WinSun 입 니 다.ok 을 누 르 고 다음 단계 에 들 어가 Dialog based 를 선택 하고 Finish 를 누 르 십시오.
두 번 째 단계:CWinSunApp 클래스 에서 오른쪽 단 추 를 누 르 고 Add Member Varialbe 를 선택 하여 HWND,변수 명 mhwndDlg 의 Public 변수 입 니 다.
코드 는 다음 과 같 습 니 다.

WinSun.h

class CWinSunApp : public CWinApp

{

public:

       HWND m_hwndDlg;

       CWinSunApp();

 

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(CWinSunApp)

       public:

       virtual BOOL InitInstance();

       //}}AFX_VIRTUAL

 

// Implementation

 

       //{{AFX_MSG(CWinSunApp)

              // NOTE - the ClassWizard will add and remove member functions here.

              //    DO NOT EDIT what you see in these blocks of generated code !

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()

};

세 번 째 단계:WinSun.cpp(CWinSunApp 류)파일 의 Init Instance()함수 에 다음 과 같은 코드 를 추가 합 니 다.

WinSun.cpp

BOOL CWinSunApp::InitInstance()

{

       AfxEnableControlContainer();

 

       // Standard initialization

       // If you are not using these features and wish to reduce the size

       //  of your final executable, you should remove from the following

       //  the specific initialization routines you do not need.

 

#ifdef _AFXDLL

       Enable3dControls();                     // Call this when using MFC in a shared DLL

#else

       Enable3dControlsStatic();      // Call this when linking to MFC statically

#endif

 

       CWinSunDlg dlg;

       m_pMainWnd = &dlg;

       int nResponse = dlg.DoModal();

       if (nResponse == IDOK)

       {

              // TODO: Place code here to handle when the dialog is

              //  dismissed with OK

       }

       else if (nResponse == IDCANCEL)

       {

              // TODO: Place code here to handle when the dialog is

              //  dismissed with Cancel

       }

 

       // Since the dialog has been closed, return FALSE so that we exit the

       //  application, rather than start the application's message pump.

       m_hwndDlg=NULL;

       return FALSE;

}

네 번 째 단계:CWinSunApp 류 에서 오른쪽 단 추 를 누 르 고 Add Virtual Function 을 선택 하 십시오.왼쪽 칸 에서 ProcessMessage Filter 를 선택 하고 오른쪽 단추 에서 Add and Edit 을 선택 하 십시오.그리고 다음 코드 를 추가 합 니 다:

WinSun.cpp

BOOL CWinSunApp::ProcessMessageFilter(int code, LPMSG lpMsg)

{

       // TODO: Add your specialized code here and/or call the base class

       if(m_hwndDlg!=NULL)

       {

              // , , 。sunxin

              if((lpMsg->hwnd==m_hwndDlg) || ::IsChild(m_hwndDlg,lpMsg->hwnd))

              {

                     // WM_KEYDOWN, 。sunxin

                     if(lpMsg->message==WM_KEYDOWN)

                     {

                            AfxMessageBox(" WM_KEYDOWN !");

                     }

              }

       }

       return CWinApp::ProcessMessageFilter(code, lpMsg);

}

다섯 번 째 단계:WinSunDlg.cpp(CWinSunDlg 류)의 OnInitial Dialog()함수 에 다음 코드 를 추가 합 니 다:

WinSunDlg.cpp

BOOL CWinSunDlg::OnInitDialog()

{

       CDialog::OnInitDialog();

 

       // Add "About..." menu item to system menu.

 

       // IDM_ABOUTBOX must be in the system command range.

       ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

       ASSERT(IDM_ABOUTBOX < 0xF000);

 

       CMenu* pSysMenu = GetSystemMenu(FALSE);

       if (pSysMenu != NULL)

       {

              CString strAboutMenu;

              strAboutMenu.LoadString(IDS_ABOUTBOX);

              if (!strAboutMenu.IsEmpty())

              {

                     pSysMenu->AppendMenu(MF_SEPARATOR);

                     pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

              }

       }

 

       // Set the icon for this dialog.  The framework does this automatically

       //  when the application's main window is not a dialog

       SetIcon(m_hIcon, TRUE);                  // Set big icon

       SetIcon(m_hIcon, FALSE);          // Set small icon

     

       // TODO: Add extra initialization here

// CWinSunApp 。sunxin

       ((CWinSunApp*)AfxGetApp())->m_hwndDlg=m_hWnd;

       return TRUE;  // return TRUE  unless you set the focus to a control

}

여섯 번 째 단계:대화 상자 창 을 소각 한 후 CWinSunApp 류 의 변수 mhwndDlg 를 NULL 로 설정 합 니 다.이 를 위해 CWinSunDlg 클래스 에서 오른쪽 단 추 를 누 르 고 Add Windows Message Handler 를 선택 하 십시오.왼쪽 칸 에서 WM 을 선택 하 십시오.DESTROY,오른쪽 단추 에서 Add and Edit 를 선택 하고 다음 코드 를 추가 합 니 다.

WinSunDlg.cpp

void CWinSunDlg::OnDestroy()

{

       CDialog::OnDestroy();

     

       // TODO: Add your message handler code here

       ((CWinSunApp*)AfxGetApp())->m_hwndDlg=NULL;

}

이로써 우리 의 일 은 끝 났 습 니 다.이제 우 리 는 Ctrl+F5 를 누 르 면 우리 가 원 하 는 결 과 를 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기