📄 winctrl2.cpp
字号:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#ifdef AFX_CMNCTL_SEG
#pragma code_seg(AFX_CMNCTL_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
#ifndef _AFX_NO_OLE_SUPPORT
extern "C"
{
HIMAGELIST WINAPI ImageList_Read(LPSTREAM pstm);
BOOL WINAPI ImageList_Write(HIMAGELIST himl, LPSTREAM pstm);
}
#endif
/////////////////////////////////////////////////////////////////////////////
// CDragListBox
CDragListBox::~CDragListBox()
{
DestroyWindow();
}
void CDragListBox::PreSubclassWindow()
{
ASSERT(::IsWindow(m_hWnd));
ASSERT((GetStyle() & (LBS_MULTIPLESEL|LBS_SORT)) == 0);
MakeDragList(m_hWnd);
}
BOOL CDragListBox::BeginDrag(CPoint pt)
{
m_nLast = -1;
DrawInsert(ItemFromPt(pt));
return TRUE;
}
void CDragListBox::CancelDrag(CPoint)
{
DrawInsert(-1);
}
UINT CDragListBox::Dragging(CPoint pt)
{
int nIndex = ItemFromPt(pt, FALSE); // don't allow scrolling just yet
DrawInsert(nIndex);
ItemFromPt(pt);
return (nIndex == LB_ERR) ? DL_STOPCURSOR : DL_MOVECURSOR;
}
void CDragListBox::Dropped(int nSrcIndex, CPoint pt)
{
ASSERT(!(GetStyle() & (LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE)) ||
(GetStyle() & LBS_HASSTRINGS));
DrawInsert(-1);
int nDestIndex = ItemFromPt(pt);
if (nSrcIndex == -1 || nDestIndex == -1)
return;
if (nDestIndex == nSrcIndex || nDestIndex == nSrcIndex+1)
return; //didn't move
CString str;
DWORD dwData;
GetText(nSrcIndex, str);
dwData = GetItemData(nSrcIndex);
DeleteString(nSrcIndex);
if (nSrcIndex < nDestIndex)
nDestIndex--;
nDestIndex = InsertString(nDestIndex, str);
SetItemData(nDestIndex, dwData);
SetCurSel(nDestIndex);
}
void CDragListBox::DrawInsert(int nIndex)
{
if (m_nLast != nIndex)
{
DrawSingle(m_nLast);
DrawSingle(nIndex);
m_nLast = nIndex;
}
}
void CDragListBox::DrawSingle(int nIndex)
{
if (nIndex == -1)
return;
CBrush* pBrush = CDC::GetHalftoneBrush();
CRect rect;
GetClientRect(&rect);
CRgn rgn;
rgn.CreateRectRgnIndirect(&rect);
CDC* pDC = GetDC();
// prevent drawing outside of listbox
// this can happen at the top of the listbox since the listbox's DC is the
// parent's DC
pDC->SelectClipRgn(&rgn);
GetItemRect(nIndex, &rect);
rect.bottom = rect.top+2;
rect.top -= 2;
CBrush* pBrushOld = pDC->SelectObject(pBrush);
//draw main line
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT);
pDC->SelectObject(pBrushOld);
ReleaseDC(pDC);
}
BOOL CDragListBox::OnChildNotify(UINT nMessage, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if (nMessage != m_nMsgDragList)
return CListBox::OnChildNotify(nMessage, wParam, lParam, pResult);
ASSERT(pResult != NULL);
LPDRAGLISTINFO pInfo = (LPDRAGLISTINFO)lParam;
ASSERT(pInfo != NULL);
switch (pInfo->uNotification)
{
case DL_BEGINDRAG:
*pResult = BeginDrag(pInfo->ptCursor);
break;
case DL_CANCELDRAG:
CancelDrag(pInfo->ptCursor);
break;
case DL_DRAGGING:
*pResult = Dragging(pInfo->ptCursor);
break;
case DL_DROPPED:
Dropped(GetCurSel(), pInfo->ptCursor);
break;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CToolBarCtrl
BEGIN_MESSAGE_MAP(CToolBarCtrl, CWnd)
//{{AFX_MSG_MAP(CToolBarCtrl)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CToolBarCtrl::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(TOOLBARCLASSNAME, NULL, dwStyle, rect, pParentWnd, nID);
}
CToolBarCtrl::~CToolBarCtrl()
{
DestroyWindow();
}
int CToolBarCtrl::AddBitmap(int nNumButtons, CBitmap* pBitmap)
{
ASSERT(::IsWindow(m_hWnd));
TBADDBITMAP tbab;
tbab.hInst = NULL;
tbab.nID = (UINT)pBitmap->GetSafeHandle();
return (int) ::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons,
(LPARAM)&tbab);
}
int CToolBarCtrl::AddBitmap(int nNumButtons, UINT nBitmapID)
{
ASSERT(::IsWindow(m_hWnd));
TBADDBITMAP tbab;
tbab.hInst = AfxFindResourceHandle((LPCTSTR)nBitmapID, RT_BITMAP);
ASSERT(tbab.hInst != NULL);
tbab.nID = nBitmapID;
return (int) ::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons,
(LPARAM)&tbab);
}
void CToolBarCtrl::SaveState(HKEY hKeyRoot, LPCTSTR lpszSubKey,
LPCTSTR lpszValueName)
{
ASSERT(::IsWindow(m_hWnd));
TBSAVEPARAMS tbs;
tbs.hkr = hKeyRoot;
tbs.pszSubKey = lpszSubKey;
tbs.pszValueName = lpszValueName;
::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)TRUE, (LPARAM)&tbs);
}
void CToolBarCtrl::RestoreState(HKEY hKeyRoot, LPCTSTR lpszSubKey,
LPCTSTR lpszValueName)
{
ASSERT(::IsWindow(m_hWnd));
TBSAVEPARAMS tbs;
tbs.hkr = hKeyRoot;
tbs.pszSubKey = lpszSubKey;
tbs.pszValueName = lpszValueName;
::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)FALSE, (LPARAM)&tbs);
}
int CToolBarCtrl::AddString(UINT nStringID)
{
ASSERT(::IsWindow(m_hWnd));
HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE((nStringID>>4)+1),
RT_STRING);
ASSERT(hInst != NULL);
return (int)::SendMessage(m_hWnd, TB_ADDSTRING, (WPARAM)hInst, nStringID);
}
int CToolBarCtrl::OnCreate(LPCREATESTRUCT lpcs)
{
if (CWnd::OnCreate(lpcs) == -1)
return -1;
SetButtonStructSize(sizeof(TBBUTTON));
return 0;
}
HRESULT CToolBarCtrl::GetDropTarget(IDropTarget** ppDropTarget) const
{
ASSERT(::IsWindow(m_hWnd));
ASSERT(ppDropTarget);
return (HRESULT) ::SendMessage(m_hWnd, TB_GETOBJECT, (WPARAM)&IID_IDropTarget, (LPARAM)ppDropTarget);
}
/////////////////////////////////////////////////////////////////////////////
// CStatusBarCtrl
BOOL CStatusBarCtrl::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(STATUSCLASSNAME, NULL, dwStyle, rect, pParentWnd, nID);
}
CStatusBarCtrl::~CStatusBarCtrl()
{
DestroyWindow();
}
int CStatusBarCtrl::GetText(LPCTSTR lpszText, int nPane, int* pType) const
{
ASSERT(::IsWindow(m_hWnd));
ASSERT(nPane < 256);
DWORD dw = ::SendMessage(m_hWnd, SB_GETTEXT, (WPARAM)nPane,
(LPARAM)lpszText);
if (pType != NULL)
*pType = HIWORD(dw);
return LOWORD(dw);
}
CString CStatusBarCtrl::GetText(int nPane, int* pType) const
{
ASSERT(::IsWindow(m_hWnd));
ASSERT(nPane < 256);
int nLength = LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH,
(WPARAM)nPane, 0L));
CString str;
DWORD dw = ::SendMessage(m_hWnd, SB_GETTEXT, (WPARAM)nPane,
(LPARAM)str.GetBufferSetLength(nLength+1));
str.ReleaseBuffer();
if (pType != NULL)
*pType = HIWORD(dw);
return str;
}
int CStatusBarCtrl::GetTextLength(int nPane, int* pType) const
{
ASSERT(::IsWindow(m_hWnd));
ASSERT(nPane < 256);
DWORD dw = ::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L);
if (pType != NULL)
*pType = HIWORD(dw);
return LOWORD(dw);
}
CString CStatusBarCtrl::GetTipText(int nPane) const
{
ASSERT(::IsWindow(m_hWnd));
ASSERT(nPane < 256);
TCHAR buf[256];
::SendMessage(m_hWnd, SB_GETTIPTEXT, MAKEWPARAM(nPane, 256), (LPARAM)buf);
return CString(buf);
}
BOOL CStatusBarCtrl::GetBorders(int& nHorz, int& nVert, int& nSpacing) const
{
ASSERT(::IsWindow(m_hWnd));
int borders[3];
BOOL bResult = (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0,
(LPARAM)&borders);
if (bResult)
{
nHorz = borders[0];
nVert = borders[1];
nSpacing = borders[2];
}
return bResult;
}
void CStatusBarCtrl::DrawItem(LPDRAWITEMSTRUCT)
{
ASSERT(FALSE); // must override for self draw status bars
}
BOOL CStatusBarCtrl::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;
}
/////////////////////////////////////////////////////////////////////////////
// CListCtrl
BEGIN_MESSAGE_MAP(CListCtrl, CWnd)
//{{AFX_MSG_MAP(CListCtrl)
ON_WM_NCDESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CListCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID)
{
// initialize common controls
VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTL_LISTVIEW_REG));
CWnd* pWnd = this;
return pWnd->Create(WC_LISTVIEW, NULL, dwStyle, rect, pParentWnd, nID);
}
CListCtrl::~CListCtrl()
{
DestroyWindow();
}
BOOL CListCtrl::GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const
{
ASSERT(::IsWindow(m_hWnd));
lpRect->left = nCode;
return (BOOL) ::SendMessage(m_hWnd, LVM_GETITEMRECT, (WPARAM)nItem,
(LPARAM)lpRect);
}
BOOL CListCtrl::SetItemCountEx(int iCount, DWORD dwFlags /* = LVSICF_NOINVALIDATEALL */)
{
ASSERT(::IsWindow(m_hWnd));
// can't have dwFlags on a control that isn't virutal
ASSERT(dwFlags == 0 || (GetStyle() & LVS_OWNERDATA));
return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMCOUNT, (WPARAM) iCount,
(LPARAM) dwFlags);
}
CSize CListCtrl::SetIconSpacing(int cx, int cy)
{
ASSERT(::IsWindow(m_hWnd));
DWORD dwRet = (DWORD) ::SendMessage(m_hWnd, LVM_SETICONSPACING,
0, (LPARAM) MAKELONG(cx, cy));
return CSize(dwRet);
}
CSize CListCtrl::SetIconSpacing(CSize size)
{
ASSERT(::IsWindow(m_hWnd));
DWORD dwRet = (DWORD) ::SendMessage(m_hWnd, LVM_SETICONSPACING,
0, (LPARAM) MAKELONG(size.cx, size.cy));
return CSize(dwRet);
}
BOOL CListCtrl::GetSubItemRect(int iItem, int iSubItem, int nArea, CRect& ref)
{
ASSERT(::IsWindow(m_hWnd));
ASSERT(nArea == LVIR_BOUNDS || nArea == LVIR_ICON || nArea == LVIR_LABEL);
RECT rect;
rect.top = iSubItem;
rect.left = nArea;
BOOL bRet = (BOOL) ::SendMessage(m_hWnd, LVM_GETSUBITEMRECT,
iItem, (LPARAM) &rect);
if (bRet)
ref = rect;
return bRet;
}
int CListCtrl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat,
int nWidth, int nSubItem)
{
LVCOLUMN column;
column.mask = LVCF_TEXT|LVCF_FMT;
column.pszText = (LPTSTR)lpszColumnHeading;
column.fmt = nFormat;
if (nWidth != -1)
{
column.mask |= LVCF_WIDTH;
column.cx = nWidth;
}
if (nSubItem != -1)
{
column.mask |= LVCF_SUBITEM;
column.iSubItem = nSubItem;
}
return CListCtrl::InsertColumn(nCol, &column);
}
int CListCtrl::InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -