LIST BOX 생성
리스트 박스 리소스 에디터에서 생성하시구, 적당한 곳에 위치 시키세요.
그리구 옵션(Properties)에 보면 Owner Draw 항목이 있을껍니다.
그 부분을 Variable 로 선택하시면 됩니다.
그리구, No, Fixed, Variable 이렇게 3 항목에 부연설명을 좀 하자면...
No는 시스템이 알아서 그리는거구요.
Fixed는 항목 들이 각각 크기가 같은 오너 드로우 이구요.
Variable은 항목 별로 각각 크기가 다른 오너 드로우 입니다.
# 윈도우 메시지 오버라이딩
- 먼저 WM_MEASUREITEM 메시지를 오버라이딩 합니다.그리기 전에, 항목의 크기를 계산하여 넘겨줄때 쓰이지 메시지 입니다.
이부분에 줄내림을 생각해서 항목의 크기를 구하셔서 대입해주시면 됩니다.
참고로, 한번 불려서 그안에서 항목 갯수만큼 루프를 돌리는 것이 아니구요.
항목 갯수만큼 불립니다. 따라서... 그때 그때 오는 항목에 대해서만 처리를 해주면 됩니다.
그럼 예제 코드... (똑같이 하시면 안되구요. 원하시는대로 동작하게끔 다시 작성하세요)
void Cmultiline_listboxDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if(m_listbox.GetDlgCtrlID() == nIDCtl)
{
// 리스트 박스의 크기 구하기 RECT rcListBox;
m_listbox.GetClientRect(&rcListBox);
CRect rc;
rc.SetRect(rcListBox.left+10, rcListBox.top, rcListBox.right-10, rcListBox.bottom);
// 화면에 찍었을때 글자의 RECT 구하기 (DrawText의 DT_CALCRECT 플래그) CPaintDC dc(this);
dc.DrawText(reinterpret_cast<LPCTSTR>(lpMeasureItemStruct->itemData), -1, &rc, DT_CALCRECT | DT_WORDBREAK);
// 구한 값을 리턴하기 위해 구조체 포인터 멤버에 대입 lpMeasureItemStruct->itemHeight = rc.Height();
lpMeasureItemStruct->itemWidth = rc.Width();
}
//CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);}
- 그리는 메시지 WM_DRAWITEM 오버라이딩아시겠지만... 넘어오는 구조체의 데이터로 화면에 그려주는 부분입니다.
그리고, 여기도 OnMeasureItem 처럼 항목 갯수 만큼 불리므로, 그때 그때 오는 것만 처리해주시면 됩니다.
특별히 어려운것은 없으니 예제 코드만 보여 드릴게요...
void Cmultiline_listboxDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(m_listbox.GetDlgCtrlID() == nIDCtl)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
//SELECTED 아이템인가에 따라 색상 결정 COLORREF colText, colBack;
colText = (lpDrawItemStruct->itemState & ODS_SELECTED) ? GetSysColor(COLOR_HIGHLIGHTTEXT) : GetSysColor(COLOR_WINDOWTEXT);
colBack = (lpDrawItemStruct->itemState & ODS_SELECTED) ? GetSysColor(COLOR_HIGHLIGHT) : GetSysColor(COLOR_WINDOW);
pDC->SetTextColor(colText);
pDC->SetBkColor(colBack);
// 배경 그리기 CRect rc(lpDrawItemStruct->rcItem);
pDC->FillRect(&rc, &CBrush(colBack));
// 글자 찍기 rc.MoveToX(5);
pDC->DrawText(reinterpret_cast<LPCTSTR>(lpDrawItemStruct->itemData), -1, &rc, DT_WORDBREAK);
}
//CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);}