본문 바로가기

3.구현/VC++

콜백 함수 (Callback function)

콜백 함수란?

일반적인 함수는 응용프로그램에서 운영체제 함수를 호출하는 형태이다. 즉, 일반적인 API 함수들을 호출해서 원하는 기능을 사용하게 된다.
그러나 콜백 함수는 응용프로그램이 아닌 운영체제 함수에서 프로그래머가 정의한 함수를 호출하는 형태이다. 바꿔말하면 일반적인 함수 호출 순서의 반대 방향이다.
물론 아무렇게나 정의하는 것은 아니다. 이름은 등록시 임의로 정의할 수 있지만 인자 수나 자료형은 정해져 있다.
예를 들어서 윈도우 클래스 등록하는 경우

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
WNDCLASS wc;
wc.style = CS_HREDRAM | CS_VERDRAW;
wc.lpfnWndProc = WndProc;
...
wc.lpszClassName = szClassName;
RegisterClass(&wc);

위의 WndProc함수가 위의 정의된 함수로 다시 호출된다. 이는 이벤트 발생이 호출된다.
그리고 해당 함수에서 처리되지 못하는 경우에 기본적으로 처리하는 곳으로 넘겨주거나 처리해야한다.

return DefWindowProc (hWnd, uMsg, wParam, lParam);
// 이렇게 WndProc()에 기본적으로 처리하는 부분을 정의

콜백 마스크는?

콜백 마스크를 지정하면 특정 메시지가 발생한다. 이때 메시지 처리를 해주면 해당 값을 처리하는 루틴을 만들 수 있다.
레이블 텍스트, 이미지 목록 인텍스, 항목 상태에 대한 비트 플래그 집합을 저장하고 있다. 개별 항목을 콜백 항목으로 정의할 수 있으며, 콜백 항목은 응용 프로그램이 항목의 일부 정보를 이미 저장하고 있는 경우 유용합니다. 즉, 값이 정해진 것이 아닌 변경되는 경우에 유용한다.

LV_ITEM 구조체의 pszTextiImage 멤버에 대해 적절한 값을 지정하여 항목을 콜백 항목으로 정의합니다(CListCtrl::GetItem 참조).

응용 프로그램이 항목 또는 하위 항목의 텍스트를 유지하는 경우 pszText 멤버에 대해

LPSTR_TEXTCALLBACK

값을 지정합니다.
응용 프로그램이 항목에 대한 아이콘 정보를 추적하는 경우에는 iImage 멤버에 대해 I_IMAGECALLBACK 값을 지정합니다.
콜백 항목을 정의하는 것 외에도 컨트롤의 콜백 마스크를 수정할 수도 있습니다. 이 마스크는 컨트롤이라기 보다는 응용 프로그램이 현재 데이터를 저장할 항목 상태를 지정하는 비트 플래그 집합입니다.
콜백 마스크는 특정 항목에만 적용되는 콜백 항목 지정과는 달리 컨트롤의 모든 항목에 적용됩니다.
콜백 마스크의 기본값은 0이며, 이 값은 해당 컨트롤이 모든 항목 상태를 추적함을 의미합니다. 이러한 기본 동작을 바꾸려면 마스크를 다음 값의 조합으로 초기화합니다.

  • LVIS_CUT 항목이 잘라내기와 붙여넣기 작업용으로 표시됩니다.
  • LVIS_DROPHILITED 항목이 끌어서 놓기 대상으로 강조됩니다.
  • LVIS_FOCUSED 항목에 포커스가 있습니다.
  • LVIS_SELECTED 항목이 선택됩니다.
  • LVIS_OVERLAYMASK 응용 프로그램이 각 항목에 대해 현재 오버레이 이미지의 이미지 목록 인덱스를 저장합니다.
  • LVIS_STATEIMAGEMASK 응용 프로그램이 각 항목에 대해 현재 상태 이미지의 이미지 목록 인덱스를 저장합니다.

이 마스크의 검색 및 설정에 대한 자세한 내용은 CListCtrl::GetCallbackMask 및 CListCtrl::SetCallbackMask를 참조하십시오.

Example

// The pointer to my list view control.
extern CListCtrl* pmyListCtrl;

// Set the callback mask so that only the selected and focused states
// are stored for each item.
pmyListCtrl->SetCallbackMask(LVIS_SELECTED|LVIS_FOCUSED);
ASSERT(pmyListCtrl->GetCallbackMask() == (LVIS_SELECTED|LVIS_FOCUSED));
반응형