2014년 12월 30일 화요일

ON_CONTROL_RANGE

ON_CONTROL_RANGE
여러개의 컨트롤을 하나의 함수로 맵핑 시켜 준다.
ON_CONTROL_RANGE(wNotifyCode, id1, id2, memberFxn );
http://msdn.microsoft.com/en-us/library/e3sz709f(VS.80).aspx

2014년 11월 30일 일요일

C++/C 문자열 출력 형식 'Format Specifier'

MFC에서 CString 형식을 %s로 문자열을 출력하려고 할때 간혹 프로그램이 죽는 경우가 있다. 이럴때는 LPCTSTR, LPCSTR 이딴걸로 구글링 해보자.
기타 출력형식은 아래 블로그를 참고 할까나
http://mwultong.blogspot.com/2006/09/cperl-printf-s-d-format-specifier.html

2014년 8월 26일 화요일

윈도우 크게에 따라 컨트롤 크기를 동적으로 변화 시키기

1. 최초 윈도우와 컨트롤들의 넓이와 높이의 비율계산
2. 윈도우의 크기에 계산된 비율을 적용하여 컨트롤 크기 변화

ex)
void dlg::CalSizeRate(void)
{
   CRect rect;
   GetClientRect(rect); //윈도우의 크기
 
   m_widthRatio = width / rect.right;
   m_heightRatio = height / rect.bottom
}

void dlg::OnSIze(UINT nType, int cx, int cy)
{
   _ctrl.GetWindowRect(&rect);
   ScreenToClient(&rect);
   rect.right = rect.left+(cx*m_widthRatio);
   rect.bottom = rect.top+(cy*m_heightRatio);
   _ctrl.MoveWindow(&rect, FALSE);
}

dll을 통하여 다이얼로그 생성[Create()]시 invalid dialog template name

dll프로젝트를 생성 할때 Use MFC in a Static Library로 생성해야 한다.

2014년 7월 29일 화요일

[MFC] 버튼에 이미지(비트맵) 입히기 CBitmapButton

MFC에서 버튼에 그림을 입힐 수 있다.
보통 사용하는 CButton을 대신해 CBitmapButton으로 변수를 선언하여 주면 버튼에 이미지를 입히는것이 가능하며, 버튼의 상태(눌렀을때, 포커스가 갔을때 등)에 따라 이미지를 달리 줄 수 있다.
버튼에 이미지를 입힐때는 LoadBitmaps()를 사용하면 된다.
LoadBitmaps는 4가지 Argument를 사용한다.

  cbitmapButton.LoadBitmaps(일반, 눌렀을때, 포커스가 갔을때, 사용안함일때)

MSDN(http://msdn.microsoft.com/ko-kr/library/6y6acs49.aspx)

[C++] 반올림

C++ (C)의 Math 라이브러리에는 반올림 함수가 없다.
그래서 보통? floor(x) 함수를 사용한다.
floor은 x보다 크지 않은 정수값을 반환한다.
반올림을 하고 싶으면 floor(x+0.5)를 하면 되겠다.

Debugging information cannot be found or does not match.... 이 발생할때

pdb나 exe파일이 매칭이 안될때 발생한다.
이럴때는 프로젝트를 clean하거나 rebuild하거나 vs를 껏다키면 되드라

2014년 7월 24일 목요일

[MFC] 화면다시그리기(갱신?): Invalidate()

강제로 화면을 다시 그리는 함수다.

 Invalidate(TRUE)   //화면전체
 Invalidate(FALSE) //변경된 부분만

컨트롤의 이동이나 크기의 변경이 있을때는 그뒤에 추가해주자

MSDN

[MFC] 컨트롤 크기, 위치 변경

MFC에서 컨트롤을 생성하고 컨트롤의 위치를 변경하고 싶을경우 MoveWindow() 함수를 사용한다.(http://msdn.microsoft.com/ko-kr/library/5bc5w1zz.aspx)
msdn에 위 함수를 사용할때 필요한 매개변수들이 설명되 있다.
나는 CRect()을 사용해서 위치와 크기를 변경하는것을 선호한다. 왠지 이게 편하다.

MovieWindow(CRect(Cpoint(p_x, p_y),CSize(width, height)));

이렇게 하면 컨트롤의 왼쪽 가장위 모서리를(Cpoint)로 위치를 결정하고 폭과 높이(CSize)를 통해 크기를 결정한다.

MFC에서 다이얼로그에 컨트롤를 생성할때 쉽게 Toolbox에서 Drag&Drop해서 직접 크기와 위치를 정해줄 수 있지만 Code에서 MovieWindow()같은 함수를 사용하여 크기와 위치를 정의하는 것이 더 좋을것같다.

그리고 컨트롤의 위치와 크기를 변경한 후에는 Invalidate();를 마지막에 해주자

2014년 7월 18일 금요일

[MFC] Plug-In 만들기1

MFC에 Add-In(Plug-In)기능을 만들어 보자.
MFC로 개발하면서 이클립스 같은 Plug-In기능을 구현해 보려고 한다.

http://www.codeproject.com/Articles/2489/Plug-In-framework-using-DLLs
에 올라온 예제 코드를 참조하여 구현해 볼것이다. 설명도 제법 잘 써놨다. 10년도 더된 코드지만 아무것도 모르는 나에게는 매우 유용한 소스코드다.
위에 따르면 프로그램은 다음과 같은 과정을 거친다.
  1. The main app is initialized (i.e. started)
  2. The DLLs/Plug-Ins are searched in the directory (may be pre-determined)
  3. Once "valid" DLLs are found, all or selected DLLs are loaded
  4. "Init" function is invoked on all loaded DLLs
  5. The instance and the DLL name/path are cached for future use (method invocation)
  6. User uses the functionality of the DLLs (using GUI interfaces provided by the DLLs)
  7. Once done, the main application invokes "Destroy" function of the DLLs one by one to free resources
  8. The main application exits
마지막에 하는 말이 간단하다고 한다..ㅡㅡ 난 왜이리 낯설고 어렵운지 MFC의 경험이 많지 않아서 (C++ 포함) 그런지 매우어렵다. 프로그램이 대충 어찌 돌아야 하는지 알았으니 예제 따라 구현해봐야지~~

2014년 7월 17일 목요일

[MFC] SDI 에서 (MENU) 없에기


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWndEx::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
//  the CREATESTRUCT cs
cs.style &= ~FWS_ADDTOTITLE;
cs.hMenu = NULL; //요놈을 추가한다.
return TRUE;
}

'cs.hMenu = NULL;'을 추가하고 디버깅시 assertion failed이 날때

ON_WM_CREATE()

static UINT indicators[] =
{
ID_SEPARATOR,           // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};

if (!m_wndstatusbar.create(this))
{
trace0("failed to create status bar\n");
return -1;      // fail to create
}
m_wndstatusbar.setindicators(indicators, sizeof(indicators)/sizeof(uint));

위의 코드들을 주석또는 삭제