📄 winctrl2.cpp
字号:
int nImage, LPARAM lParam)
{
ASSERT(::IsWindow(m_hWnd));
LVITEM item;
item.mask = nMask;
item.iItem = nItem;
item.iSubItem = 0;
item.pszText = (LPTSTR)lpszItem;
item.state = nState;
item.stateMask = nStateMask;
item.iImage = nImage;
item.lParam = lParam;
return CListCtrl::InsertItem(&item);
}
int CListCtrl::HitTest(CPoint pt, UINT* pFlags) const
{
ASSERT(::IsWindow(m_hWnd));
LVHITTESTINFO hti;
hti.pt = pt;
int nRes = (int) ::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)&hti);
if (pFlags != NULL)
*pFlags = hti.flags;
return nRes;
}
BOOL CListCtrl::SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem,
int nImage, UINT nState, UINT nStateMask, LPARAM lParam)
{
ASSERT(::IsWindow(m_hWnd));
ASSERT((GetStyle() & LVS_OWNERDATA)==0);
LVITEM lvi;
lvi.mask = nMask;
lvi.iItem = nItem;
lvi.iSubItem = nSubItem;
lvi.stateMask = nStateMask;
lvi.state = nState;
lvi.pszText = (LPTSTR) lpszItem;
lvi.iImage = nImage;
lvi.lParam = lParam;
return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)&lvi);
}
BOOL CListCtrl::SetItemState(int nItem, UINT nState, UINT nStateMask)
{
ASSERT(::IsWindow(m_hWnd));
LVITEM lvi;
lvi.stateMask = nStateMask;
lvi.state = nState;
return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi);
}
BOOL CListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
{
ASSERT(::IsWindow(m_hWnd));
ASSERT((GetStyle() & LVS_OWNERDATA)==0);
LVITEM lvi;
lvi.iSubItem = nSubItem;
lvi.pszText = (LPTSTR) lpszText;
return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
}
CString CListCtrl::GetItemText(int nItem, int nSubItem) const
{
ASSERT(::IsWindow(m_hWnd));
LVITEM lvi;
memset(&lvi, 0, sizeof(LVITEM));
lvi.iSubItem = nSubItem;
CString str;
int nLen = 128;
int nRes;
do
{
nLen *= 2;
lvi.cchTextMax = nLen;
lvi.pszText = str.GetBufferSetLength(nLen);
nRes = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
(LPARAM)&lvi);
} while (nRes == nLen-1);
str.ReleaseBuffer();
return str;
}
int CListCtrl::GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const
{
ASSERT(::IsWindow(m_hWnd));
LVITEM lvi;
memset(&lvi, 0, sizeof(LVITEM));
lvi.iSubItem = nSubItem;
lvi.cchTextMax = nLen;
lvi.pszText = lpszText;
return (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
(LPARAM)&lvi);
}
DWORD CListCtrl::GetItemData(int nItem) const
{
ASSERT(::IsWindow(m_hWnd));
LVITEM lvi;
memset(&lvi, 0, sizeof(LVITEM));
lvi.iItem = nItem;
lvi.mask = LVIF_PARAM;
VERIFY(::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi));
return (DWORD)lvi.lParam;
}
void CListCtrl::DrawItem(LPDRAWITEMSTRUCT)
{
ASSERT(FALSE);
}
BOOL CListCtrl::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam,
LRESULT* pResult)
{
if (message != WM_DRAWITEM)
return CWnd::OnChildNotify(message, wParam, lParam, pResult);
ASSERT(pResult == NULL); // no return value expected
UNUSED(pResult); // unused in release builds
DrawItem((LPDRAWITEMSTRUCT)lParam);
return TRUE;
}
void CListCtrl::RemoveImageList(int nImageList)
{
HIMAGELIST h = (HIMAGELIST)SendMessage(LVM_GETIMAGELIST,
(WPARAM)nImageList);
if (CImageList::FromHandlePermanent(h) != NULL)
SendMessage(LVM_SETIMAGELIST, (WPARAM)nImageList, NULL);
}
void CListCtrl::OnNcDestroy()
{
RemoveImageList(LVSIL_NORMAL);
RemoveImageList(LVSIL_SMALL);
RemoveImageList(LVSIL_STATE);
CWnd::OnNcDestroy();
}
CImageList* CListCtrl::CreateDragImage(int nItem, LPPOINT lpPoint)
{
ASSERT(::IsWindow(m_hWnd));
HIMAGELIST hImageList = (HIMAGELIST)::SendMessage(m_hWnd,
LVM_CREATEDRAGIMAGE, nItem, (LPARAM)lpPoint);
if (hImageList == NULL)
return NULL;
CImageList* pImageList = new CImageList;
VERIFY(pImageList->Attach(hImageList));
return pImageList;
}
/////////////////////////////////////////////////////////////////////////////
// CTreeCtrl
BEGIN_MESSAGE_MAP(CTreeCtrl, CWnd)
//{{AFX_MSG_MAP(CTreeCtrl)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CTreeCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID)
{
// initialize common controls
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_TREEVIEW_REG));
CWnd* pWnd = this;
return pWnd->Create(WC_TREEVIEW, NULL, dwStyle, rect, pParentWnd, nID);
}
CTreeCtrl::~CTreeCtrl()
{
DestroyWindow();
}
BOOL CTreeCtrl::GetItemRect(HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly) const
{
ASSERT(::IsWindow(m_hWnd));
*(HTREEITEM*)lpRect = hItem;
return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMRECT, (WPARAM)bTextOnly,
(LPARAM)lpRect);
}
CString CTreeCtrl::GetItemText(HTREEITEM hItem) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_TEXT;
CString str;
int nLen = 128;
int nRes;
do
{
nLen *= 2;
item.pszText = str.GetBufferSetLength(nLen);
item.cchTextMax = nLen;
::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
nRes = lstrlen(item.pszText);
} while (nRes == nLen-1);
str.ReleaseBuffer();
return str;
}
BOOL CTreeCtrl::GetItemImage(HTREEITEM hItem, int& nImage, int& nSelectedImage) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE;
BOOL bRes = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
if (bRes)
{
nImage = item.iImage;
nSelectedImage = item.iSelectedImage;
}
return bRes;
}
UINT CTreeCtrl::GetItemState(HTREEITEM hItem, UINT nStateMask) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_STATE;
item.stateMask = nStateMask;
item.state = 0;
VERIFY(::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item));
return item.state;
}
DWORD CTreeCtrl::GetItemData(HTREEITEM hItem) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_PARAM;
VERIFY(::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item));
return (DWORD)item.lParam;
}
BOOL CTreeCtrl::ItemHasChildren(HTREEITEM hItem) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_CHILDREN;
::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
return item.cChildren;
}
BOOL CTreeCtrl::SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage,
int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam)
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = nMask;
item.pszText = (LPTSTR) lpszItem;
item.iImage = nImage;
item.iSelectedImage = nSelectedImage;
item.state = nState;
item.stateMask = nStateMask;
item.lParam = lParam;
return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item);
}
HTREEITEM CTreeCtrl::InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage,
int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam,
HTREEITEM hParent, HTREEITEM hInsertAfter)
{
ASSERT(::IsWindow(m_hWnd));
TVINSERTSTRUCT tvis;
tvis.hParent = hParent;
tvis.hInsertAfter = hInsertAfter;
tvis.item.mask = nMask;
tvis.item.pszText = (LPTSTR) lpszItem;
tvis.item.iImage = nImage;
tvis.item.iSelectedImage = nSelectedImage;
tvis.item.state = nState;
tvis.item.stateMask = nStateMask;
tvis.item.lParam = lParam;
return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis);
}
HTREEITEM CTreeCtrl::HitTest(CPoint pt, UINT* pFlags) const
{
ASSERT(::IsWindow(m_hWnd));
TVHITTESTINFO hti;
hti.pt = pt;
HTREEITEM h = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0,
(LPARAM)&hti);
if (pFlags != NULL)
*pFlags = hti.flags;
return h;
}
void CTreeCtrl::RemoveImageList(int nImageList)
{
HIMAGELIST h = (HIMAGELIST)SendMessage(TVM_GETIMAGELIST,
(WPARAM)nImageList);
if (CImageList::FromHandlePermanent(h) != NULL)
SendMessage(TVM_SETIMAGELIST, (WPARAM)nImageList, NULL);
}
void CTreeCtrl::OnDestroy()
{
RemoveImageList(LVSIL_NORMAL);
RemoveImageList(LVSIL_STATE);
CWnd::OnDestroy();
}
CImageList* CTreeCtrl::CreateDragImage(HTREEITEM hItem)
{
ASSERT(::IsWindow(m_hWnd));
HIMAGELIST hImageList = (HIMAGELIST)::SendMessage(m_hWnd,
TVM_CREATEDRAGIMAGE, 0, (LPARAM)hItem);
if (hImageList == NULL)
return NULL;
CImageList* pImageList = new CImageList;
VERIFY(pImageList->Attach(hImageList));
return pImageList;
}
BOOL CTreeCtrl::GetCheck(HTREEITEM hItem) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.mask = TVIF_HANDLE | TVIF_STATE;
item.hItem = hItem;
item.stateMask = TVIS_STATEIMAGEMASK;
VERIFY(::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item));
// Return zero if it's not checked, or nonzero otherwise.
return ((BOOL)(item.state >> 12) -1);
}
BOOL CTreeCtrl::SetCheck(HTREEITEM hItem, BOOL fCheck)
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.mask = TVIF_HANDLE | TVIF_STATE;
item.hItem = hItem;
item.stateMask = TVIS_STATEIMAGEMASK;
/*
Since state images are one-based, 1 in this macro turns the check off, and
2 turns it on.
*/
item.state = INDEXTOSTATEIMAGEMASK((fCheck ? 2 : 1));
return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item);
}
/////////////////////////////////////////////////////////////////////////////
// CSpinButtonCtrl
BOOL CSpinButtonCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID)
{
// initialize common controls
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_UPDOWN_REG));
CWnd* pWnd = this;
return pWnd->Create(UPDOWN_CLASS, NULL, dwStyle, rect, pParentWnd, nID);
}
CSpinButtonCtrl::~CSpinButtonCtrl()
{
DestroyWindow();
}
void CSpinButtonCtrl::GetRange(int &lower, int& upper) const
{
ASSERT(::IsWindow(m_hWnd));
DWORD dw = ::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0l);
lower = (int)(short)HIWORD(dw);
upper = (int)(short)LOWORD(dw);
}
/////////////////////////////////////////////////////////////////////////////
// CSliderCtrl
BOOL CSliderCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID)
{
// initialize common controls
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_BAR_REG));
CWnd* pWnd = this;
return pWnd->Create(TRACKBAR_CLASS, NULL, dwStyle, rect, pParentWnd, nID);
}
CSliderCtrl::~CSliderCtrl()
{
DestroyWindow();
}
void CSliderCtrl::GetRange(int& nMin, int& nMax) const
{
ASSERT(::IsWindow(m_hWnd));
nMin = GetRangeMin();
nMax = GetRangeMax();
}
void CSliderCtrl::SetRange(int nMin, int nMax, BOOL bRedraw)
{
SetRangeMin(nMin, bRedraw);
SetRangeMax(nMax, bRedraw);
}
void CSliderCtrl::GetSelection(int& nMin, int& nMax) const
{
ASSERT(::IsWindow(m_hWnd));
nMin = ::SendMessage(m_hWnd, TBM_GETSELSTART, 0, 0L);
nMax = ::SendMessage(m_hWnd, TBM_GETSELEND, 0, 0L);
}
void CSliderCtrl::SetSelection(int nMin, int nMax)
{
ASSERT(::IsWindow(m_hWnd));
::SendMessage(m_hWnd, TBM_SETSELSTART, 0, (LPARAM)nMin);
::SendMessage(m_hWnd, TBM_SETSELEND, 0, (LPARAM)nMax);
}
/////////////////////////////////////////////////////////////////////////////
// CProgressCtrl
BOOL CProgressCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID)
{
// initialize common controls
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -