.

140428_MFC_여러가지 Memo

by 담배맛구마

1)afx_msg :: Event Handler Function

afx는 개발팀 이름

2) 전역변수는 앞에 Afx가 붙는다

:: AfxMessageBox(...);

3) API에서는 Message가 WndProc이 처리하는데

   MFC는 Message Handler 함수가 처리한다.

   

4) WM_PAINT     On_PAINT

   이 둘을 묶는 Macro 추가한다.

   BEGIN_MESSAGE_MAP(CMy140319_DragDropView, CView)

// 표준 인쇄 명령입니다.

ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

ON_WM_CREATE()

ON_WM_DESTROY()

ON_WM_LBUTTONDOWN()

ON_WM_MOUSEMOVE()

ON_WM_LBUTTONUP()

END_MESSAGE_MAP()

5) Timer : OS에게 주기적 WM_TIMER Message 발생 요청

i) Timer 설정

UINT SetTimer(UINT nIDEvent, UINT nElapse, TIMERPROC lpTimerFunc=OnTimer())

Timer Number Mili Second Function To Call 

ex) SetTimer(1, 1000, NULL); SetTimer(2, 1000, NULL);

ii) List to do

OnTimer(){...}

iii) Timer 해제

BOOL KillTimer( int nIDEvent)

ex) KillTimer(1), KillTimer(2)

tip) Timer의 설정과 해제는 적절한 위치에 있어야 한다.

ex) 시작하자 마자 -> OnCreate

종료할때     -> OnDestroy {Timer는 마지막에 꼭 해제시켜줘야 한다}


6) Drag & Drop

i) OnLButtonDown(UINT nFlags, CPoint point){

point값이 Drag당하는 피사체 범위 안에 있으면 Drag 모드로 Flag값 설정

}

ii) OnMouseMove(UINT nFlags, CPoint point){

Drag 모드이면 -> Drag당하는 피사체의 좌표 이동

}

iii)OnLButtonUp(UINT nFlags, CPoint point){

Drag모드라면 -> Drag당한 피사체의 좌표 고정

}

tip) 범위 상관없이 그냥 Drag 모드인지 아닌지 판단할때는 nFlags값을 검사하면 됨

물론 피사체를 Dragging으로 움직일 때도 nFlags값해도 되지만 일반적인 방법은 아님

MK_CONTROL :: Ctrl키 눌림

MK_SHIFT   :: Shift키 눌림

MK_LBUTTON :: 왼쪽 버튼 눌림

MK_RBUTTON :: 오른쪽 버튼 눌림

ex) if(nFlags & MK_LBUTTON){

Dragging

}

else{

Just Moving

}


7)KeyBorad Message

case1) Character Key

1st) WM_KEYDOWN

2nd) WM_CHAR

3rd) WM_KEYUP

case2) Without Character Key

1st) WM_KEYDOWN

2nd) WM_KEYUP

afx_msg void On*(UNIT nChar, UINT nRepCnt, UNIT nFlags){...}

i) nChar :: 눌러진 키의 가상 키 코드(WM_CHAR 발생시에는 문자 키 코드 => OnChar()의 경우란 의미)

VK_LEFT  VK_RIGHT  VK_UP  VK_DOWN  etc..

ii) nRepCnt :: 반복된 키의 입력 횟 수

iii)nFlags :: 키보드에 대한 상태정보


8)MFC Class

CObject  CCmdTarget  CWnd        CDialog  CDialogEx

                                CView

                                     CFrameWnd

                         CDocument

                         CWinThread  CWinApp

9)SDI(Single Document Interface)

CView → C__View

CDocument → C__Doc

CWinApp → C__App

CFrameWnd → C__MainFrame


10)Dialog Based

CWinApp → C__App

CDialogEx(Ex추가됨) → C__Dlg(두개 생성되는데 한개는 도움말용)

OnCreate()

OnInitDialog() :: 대화상자 초기화

OnPaint()  :: Client Area(CView인스턴스)가 없기 때문에

OnClose()

OnDestroy()

DoDataExchange() :: 컨트롤과 변수를 연결하는 기능하는 함수 :: DDX라고불림

*Edit Text

CEdit class → DDX_Control :: DDX에서 제공하는 Class 변수 사용


CString class → DDX_Value :: DDX에서 제공하지 않는 CString 같은 Class 변수 사용

UpdateData(True):: 변수 → 컨트롤

UpdateData(False):: 컨트롤 → 변수



11) DDX_Value 방식으로 변수선언하는 Control

Edit Control

Radio Button

CheckBox Button

* UpdateData(TRUE or FAlSE); :: 변수에 넣고 빼기


* Control을 제어 하는 방법

__DataType__ * PointerName = (__DataType__ *)GetDlgItem(ControlName);//변수명은 pCEdit 이런식

ex)

CButton * pCButton = (CButton*)GetDlgItem(IDC_BUTTON_Button1);

CEdit * pCEdit = (CEdit*)GetDlgItem(IDC_EDIT_SOURCE);

CListBox * pCListBox = (CListBox*)GetDlgItem(IDC_LIST_ListBox);


12) DDX_Control 방식으로 변수선언하는 Control

CListBOx

CComboBOx

etc

...

* Control을 제어 하는 방법

DDX_Value 방식과는 달리 그냥 바로 멤버 메소드에 접근 가능하다. 물론 DDX_Value에서 사용하는 방법으로도 사용이 가능하다.



13)

Modal Dialog :: 다른 작업 불가능(보안적으로 ↓; 계속 대기하다가 끊길 수 있기에)

Modeless Dialog :: 다른 작업 가능


14) Modal Dialog 사용

i) Dialog design (IDD_DIALOG_MODAL)

ii) Dialog Class 선언(CModelessDlg)

iii)Main Dialog Class의 cpp에 include <ModelessDlg.h>

iv) Main Dialog Class에 변수 선언

CModalDlg m_ModalDlg;

m_Dlg.DoModal();

15) Modeless Dialog 사용

i) Dialog design (IDD_DIALOG_MODELESS)

ii) Dialog Class 선언(CModelessDlg)

iii)Main Dialog Class의 cpp에 include <ModalDlg.h>

iv) 변수 추가

m_ModlessDlg.Create( 띄어줄 Dialog ID, 부모의 ID)

ex) m_ModlessDlg.Create( IDD_출DIALOG_MODELESS, this);

m_ModlessDlg.ShowWindows(SW_SHOW);


반응형

블로그의 정보

정윤상이다.

담배맛구마

활동하기