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));

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