분명 X-Argument로 날짜형식을 넣게는 되어 있는데, AxisRange를 이용해서 SetViewMin/MaxValue로 범위를 지정하면.... 제대로 안됩니다. double이나 CString 형으로는 잘 됩니다. 굳이 날짜형식으로 쓸려면 Series가 바뀔때마다 GetMin/MaxValue로 값을 얻어와서 그 값으로 계산을 해서 다시 SetViewMin/MaxValue로 값을 넣어야 합니다. 자동으로 수정이 안됩니다. ;;;
자세한 설명은 생략하겠습니다. 혹시나 Chart를 많이 안써보신 분들이 있을 수 있으니 대략적인 용어 및 뜻만 표기하겠습니다.
Title
Chart에 표시되는 명칭입니다.
Series
Chart에서 값을 나타내는 선을 나타냅니다.
각 Point 들이 모여서 그 추이를 선으로 연결한 것입니다.
각 Point는 X, Y 값의 2차원 값을 나타냅니다.
X 쪽을 Argument 라고 하며,
Y 쪽을 Value 라고 합니다.
Marker
Series 에 보면 각각의 Point를 눈에 띄게 좀 큰 점으로 표현한 것을 Marker라고 합니다.
Axis
X, Y 축 입니다.
Legend
각 Series 들이 어떤 값을 나타내는지 Chart 한쪽에 색깔 별로 소개해 놓은 범주를 의미합니다.
ConstantLine
Chart 상의 특정 지점에 기준 선을 그어 놓는 경우가 있습니다.
통계 관련 Chart의 경우 Y-Axis 상에 +- 1 sigma에 점선을 가로로 그어 놓는다던지 ...
X-Axis 상의 특정 시간안에 값들에 대해서 표시하기 위해서 세로로 그어 놓는 등...
위 그림은 Posting 목적으로 해상도를 줄여 놓았습니다.
원래 크기대로 보실려면 아래 Link를 눌러주세요.
CWnd를 상속받아서 사용자가 작성한 MFC Control의 메세지 처리하는 방법을 소개해드리겠습니다.
통상적으로 Dialog, View, FormView (앞으로 편의상 Dialog라 칭함)에 Control을 올려서 사용하는데, 그 구현자체를 Control안에서 하는 경우도 있지만, 해당 Control을 사용하고 있는 Dialog에서 구현을 해야하는 경우도 있습니다. 2개 이상의 Control을 같이 활용하려면 그렇게 해야 하죠.
Textbox에 숫자를 적어두고 Button을 눌렀을 경우 해당 숫자를 화면에 AfxMessageBox로 출력하는 경우
해당 처리는 Button에서 하는게 아니라 Textbox와 Button을 가지고 있는 Dialog에서 하는게 편합니다.
3가지 방법이 있습니다.
Message로 처리
Command로 처리
Notify로 처리
각각에 대해서 소개해 드리겠습니다.
준비사항
먼저 간단하게 Dialog 기반으로 MFC Application Project를 생성해주세요.
LRESULT CUserCtrlMsgDlg::OnUserWnd(WPARAM wParam, LPARAM lPraram)
{
int nID = (int)wParam; // 해당 ID를 비교해서 Control 구분 가능AfxMessageBox(_T("ON MESSAGE"));
returnTRUE;
}
이제 실행 후 왼쪽 상단의 검은색 선 안을 누르면 해당 메세지가 출력되는 것을 확인 할 수 있습니다.
2. Notify 방식
Dialog에 해당 User Control이 여러개 있고, 전달한 메세지 종류가 2가지 이상인 경우 유용합니다.
Dialog에 Notify로 알려주고 User Control은 계속 남은 처리를 진행합니다.
UserWnd.cpp
OnLButtonDown 함수 내부에 아래와 같이 NMHDR 선언과 SendMessage를 추가
voidCUserWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
HWND hWnd = GetSafeHwnd();
if (hWnd == NULL) return;
if (!::IsWindow(hWnd)) return;
int nID = GetDlgCtrlID();
if (m_hwndDlg != nullptr)
{
NMHDR nmhdr;
nmhdr.code = WM_USER_WND;
nmhdr.idFrom = nID;
nmhdr.hwndFrom = hWnd;
::SendMessage(m_hwndDlg, WM_NOTIFY, nID, (LPARAM)&nmhdr);
}
CWnd::OnLButtonDown(nFlags, point);
}