LibUIDK Documentation
ContentsIndexHome
PreviousUpNext
LibUIDK::WM_DRAWITEMEX Macro
C++
#define WM_DRAWITEMEX WM_APPLICATION+17

WM_DRAWITEMEX是一个自绘消息, 由自绘Button, Header, List, TreeList或Thumbnail控件在它们可视部分发生改变时, 发往它们的父窗口. 

 

父窗口通过它自己的WindowProc函数收到此消息.

LibUIDK.h

Parameters 
Description 
WPARAM 
指定 发送WM_DRAWITEMEX 消息的控件的ID. 
LPARAM 
一个 DRAWITEMSTRUCT结构体的指针, 包含了被绘制Item的信息和类型. 

如果父窗口处理了此消息, 需要返回TRUE.

WM_DRAWITEMEX消息是LibUIDK定义的消息, 在绘制Button, Header, List, TreeList或Thumbnail控件前发向父窗口, 以使用户得到绘制这些控件的机会. 如果您处理了此消息, 应该返回TRUE, 告诉控件不要再绘制它们自己.

struct DRAWITEMSTRUCT in MSDN.

// m_pList是CMyWnd定义的一个子窗口, 类型是CSkinListCtrl.
LRESULT CMyWnd::OnDrawListItem(WPARAM wParam, LPARAM lParam)
{
DRAWITEMSTRUCT *pDis = (DRAWITEMSTRUCT *)lParam;

if (pDis->hwndItem != m_pList->GetSafeHwnd())
return FALSE; // 如果消息来源不是m_pList, 返回0,
// 通知m_pList, 父窗口没有处理WM_DRAWITEMEX消息,
// 使用m_pList的默认绘制.

CDC *pDC = CDC::FromHandle(pDis->hDC);
// draw selected item.
UINT nState = m_pList->GetItemState(pDis->itemID, LVIS_SELECTED);
if (LVIS_SELECTED & nState)
{
pDC->FillSolidRect(&(pDis->rcItem), RGB(128, 128, 255));
}

CSkinHeaderCtrl *pHeader = (CSkinHeaderCtrl *)m_pList->GetHeaderCtrl();
int nCount = pHeader->GetItemCount();

for (int i=0; i<nCount; ++i)
{
CString strText = m_pList->GetItemText(pDis->itemID, i);

CRect rcHeaderItem;
pHeader->GetItemRect(i, rcHeaderItem);
pHeader->ClientToScreen(rcHeaderItem);
m_pList->ScreenToClient(rcHeaderItem);
CRect rcSubItem(pDis->rcItem);
rcSubItem.left = rcHeaderItem.left + 4;// space
rcSubItem.right = rcHeaderItem.right;

if (i == 2)
{
CFont *pFontOld = pDC->SelectObject(&m_font2);
::DrawText(pDis->hDC, strText, strText.GetLength(),
rcSubItem, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS);
pDC->SelectObject(pFontOld);
}
else
{
CFont *pFontOld = pDC->SelectObject(&m_font1);
::DrawText(pDis->hDC, strText, strText.GetLength(), rcSubItem,
DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS);
pDC->SelectObject(pFontOld);
}
}

return TRUE; // 父窗口处理了WM_DRAWITEMEX消息后, 需要返回TRUE.
}