📄 combolistctrl.cpp
字号:
if (bEnable)
{
m_dwDropDownCtrlStyle |= WS_VSCROLL;
}
else
{
m_dwDropDownCtrlStyle &= ~WS_VSCROLL;
}
}
void CComboListCtrl::ScrollToView(int iColumnIndex, /*int iOffSet, */CRect& robCellRect)
{
// Now scroll if we need to expose the column
CRect rcClient;
GetClientRect(&rcClient);
int iColumnWidth = GetColumnWidth(iColumnIndex);
// Get the column iOffset
int iOffSet = 0;
for (int iIndex_ = 0; iIndex_ < iColumnIndex; iIndex_++)
{
iOffSet += GetColumnWidth(iIndex_);
}
// If x1 of cell rect is < x1 of ctrl rect or
// If x1 of cell rect is > x1 of ctrl rect or **Should not ideally happen**
// If the width of the cell extends beyond x2 of ctrl rect then
// Scroll
CSize obScrollSize(0, 0);
if (((iOffSet + robCellRect.left) < rcClient.left) ||
((iOffSet + robCellRect.left) > rcClient.right))
{
obScrollSize.cx = iOffSet + robCellRect.left;
}
else if ((iOffSet + robCellRect.left + iColumnWidth) > rcClient.right)
{
obScrollSize.cx = iOffSet + robCellRect.left + iColumnWidth - rcClient.right;
}
Scroll(obScrollSize);
robCellRect.left -= obScrollSize.cx;
// Set the width to the column width
robCellRect.left += iOffSet;
robCellRect.right = robCellRect.left + iColumnWidth;
}
void CComboListCtrl::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if (IsReadOnly(pDispInfo->item.iSubItem))
{
*pResult = 1;
return;
}
*pResult = 0;
}
int CComboListCtrl::InsertColumn(int nCol,LPCTSTR lpszColumnHeading,int nFormat ,int nWidth,int nSubItem)
{
m_iColumnCounts++;
return CListCtrl::InsertColumn( nCol, lpszColumnHeading, nFormat, nWidth, nSubItem);
}
int CComboListCtrl::GetColumnCounts()
{
return m_iColumnCounts;
}
void CComboListCtrl::DeleteAllColumn()
{
for(int i=0;i<m_iColumnCounts;i++)
{
DeleteColumn(0);
}
}
//add by w_x_liu
void CComboListCtrl::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
edit.Create(WS_CHILD|WS_CLIPSIBLINGS|WS_EX_TOOLWINDOW|WS_BORDER,
CRect(0,40,10,50),this,1001);
CListCtrl::PreSubclassWindow();
}
void CComboListCtrl::ShowEdit()
{
CRect rect;
GetSubItemRect(row,col,LVIR_LABEL,rect);
CString str;
str = GetItemText(row,col);
edit.MoveWindow(rect);
edit.SetWindowText(str);
edit.ShowWindow(SW_SHOW);
edit.SetSel(0,100);
edit.SetFocus();
UpdateWindow();
}
BOOL CComboListCtrl::DisposeEdit()
{
CString sLabel;
edit.GetWindowText(sLabel);
this->SetItemText(row,col,sLabel);
ItemInfo *myItem = new ItemInfo;
myItem->row = row;
myItem->col = col;
myItem->strText = sLabel;
GetParent()->SendMessage(WM_VALIDATE_EDIT, GetDlgCtrlID(), (LPARAM)myItem);//
if (col == 1)
{
if (!sLabel.IsEmpty() && atoi(sLabel) < 1000)
{
//MessageBox("节点编号小于1000");
MessageBox("无效的节点编号,\r\n节点编号在1000-65536之间,\r\n请重新输入节点编号,\r\n否则此节点信息将不被保存", "温馨提示",\
MB_ICONASTERISK | MB_ICONINFORMATION);
return FALSE;
}
if (!sLabel.IsEmpty())
{
if (IsExistNodeNo(sLabel))
{
MessageBox("该节点编号已经存在于列表中,\r\n请重新输入节点编号,\r\n否则此节点信息将不被保存", "温馨提示", MB_ICONASTERISK | MB_ICONINFORMATION);
//ShowEdit();
return FALSE;
}
}
}
// MessageBox("abc");
edit.ShowWindow(SW_HIDE);
::SendMessage(this->GetParent()->GetSafeHwnd(),NULL,NULL,NULL);
return true;
}
BOOL CComboListCtrl::IsExistNodeNo(CString str)
{
//
int num = 0;
int nCount = this->GetItemCount();
for (int k = 0; k < nCount; k++)
{
if (this->GetItemText(k, 1) == str)
{
num++;
if (num == 2)
{
return TRUE;
break;
}
}
}
return FALSE;
}
void CComboListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int iColumnIndex = -1;
int iRowIndex = -1;
// Get the current column and row
if (!HitTestEx(point, &iRowIndex, &iColumnIndex))
{
return;
}
// CToolTipCtrl ttc;
// ttc.Create(this, TTS_ALWAYSTIP);
CListCtrl::OnMouseMove(nFlags, point);
}
//////////////////////////////////////////////////////////////////////////
int CComboListCtrl::OnToolHitTest(CPoint point, TOOLINFO * pTI) const {
//See if the point falls onto a list item
//UINT nFlags = 0;
LVHITTESTINFO lvhitTestInfo;
lvhitTestInfo.pt = point;
int nItem = ListView_SubItemHitTest(
this->m_hWnd,
&lvhitTestInfo);
int nSubItem = lvhitTestInfo.iSubItem;
UINT nFlags = lvhitTestInfo.flags;
//nFlags is 0 if the SubItemHitTest fails
//Therefore, 0 & <anything> will equal false
if (nFlags & m_wHitMask){
//If it did fall on a list item,
//and it was also hit one of the
//item specific sub-areas we wish to show tool tips for
//Get the client (area occupied by this control
RECT rcClient;
GetClientRect( &rcClient );
//Fill in the TOOLINFO structure
pTI->hwnd = m_hWnd;
pTI->uId = (UINT) (nItem * 100 + nSubItem);
pTI->lpszText = LPSTR_TEXTCALLBACK;
pTI->rect = rcClient;
return pTI->uId; //By returning a unique value per listItem,
//we ensure that when the mouse moves over another list item,
//the tooltip will change
}else{
//Otherwise, we aren't interested, so let the message propagate
return -1;
}
}
BOOL CComboListCtrl::OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult ){
//Handle both ANSI and UNICODE versions of the message
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
//Ignore messages from the built in tooltip, we are processing them internally
if( (pNMHDR->idFrom == (UINT)m_hWnd) &&
( ((pNMHDR->code == TTN_NEEDTEXTA) && (pTTTA->uFlags & TTF_IDISHWND)) ||
((pNMHDR->code == TTN_NEEDTEXTW) && (pTTTW->uFlags & TTF_IDISHWND)) ) ){
return FALSE;
}
*pResult = 0;
CString strTipText;
//Get the mouse position
const MSG* pMessage;
pMessage = GetCurrentMessage();
ASSERT ( pMessage );
CPoint pt;
pt = pMessage->pt; //Get the point from the message
ScreenToClient( &pt ); //Convert the point's coords to be relative to this control
//See if the point falls onto a list item
LVHITTESTINFO lvhitTestInfo;
lvhitTestInfo.pt = pt;
int nItem = SubItemHitTest(&lvhitTestInfo);
int nSubItem = lvhitTestInfo.iSubItem;
UINT nFlags = lvhitTestInfo.flags;
//nFlags is 0 if the SubItemHitTest fails
//Therefore, 0 & <anything> will equal false
if( nFlags & m_wHitMask ){
//If it did fall on a list item,
//and it was also hit one of the
//item specific sub-areas we wish to show tool tips for
//Lookup the list item's text in the ToolTip Map
CString strKey;
strKey.Format(_T("%d"), nItem * 100 + nSubItem);
if( m_ToolTipMap.Lookup(strKey, strTipText ) ){
//If there was a CString associated with the list item,
//copy it's text (up to 80 characters worth, limitation of the TOOLTIPTEXT structure)
//into the TOOLTIPTEXT structure's szText member
//Deal with UNICODE
#ifndef _UNICODE
if (pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, 80);
else
_mbstowcsz(pTTTW->szText, strTipText, 80);
#else
if (pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText, strTipText, 80);
else
lstrcpyn(pTTTW->szText, strTipText, 80);
#endif
return FALSE; //We found a tool tip,
//tell the framework this message has been handled
////////////////////////////////////////////////////////////////////////////////
// ****** Special note *****
//
// Still don't understand why the function must return FALSE for CListCtrl
// so as not to cause flickering, as opposed to Nate Maynard's derivation
// from CTreeCtrl.
// I have experimented with disabling Tooltips for the control
// and found out that a "ghost" tooltip appears for a fraction of a second...
//
// I am completely at a loss...
// Seems to work, though...
//
////////////////////////////////////////////////////////////////////////////////
}
}
return FALSE; //We didn't handle the message,
//let the framework continue propagating the message
}
//Sets the tooltip text for a specific item
BOOL CComboListCtrl::SetItemToolTipText( int nItem, int nSubItem, LPCTSTR lpszToolTipText ){
CString strKey;
strKey.Format(_T("%d"), nItem * 100 + nSubItem);
m_ToolTipMap.SetAt( strKey, lpszToolTipText );
return TRUE;
}
//Retrieve the tooltip text for a specific list item
CString CComboListCtrl::GetItemToolTipText( int nItem, int nSubItem){
CString itemToolTipText;
CString strKey;
strKey.Format(_T("%d"), nItem * 100 + nSubItem);
if( !m_ToolTipMap.Lookup( strKey, itemToolTipText ) ){
itemToolTipText = "";
}
return itemToolTipText;
}
WORD CComboListCtrl::SetToolTipHitMask( WORD wHitMask ){
WORD oldHitMask = m_wHitMask;
m_wHitMask = wHitMask;
return oldHitMask;
}
void CComboListCtrl::DeleteAllToolTips()
{
m_ToolTipMap.RemoveAll();
}
BOOL CComboListCtrl::DeleteAllItems( ){
//Call the base class method
BOOL retVal = CListCtrl::DeleteAllItems();
if( retVal ){
//If it succeeded, remove all tooltips
DeleteAllToolTips();
}
return retVal;
}
BOOL CComboListCtrl::DeleteItem( int nItem ){
//Call the base class method
BOOL retVal = CListCtrl::DeleteItem( nItem );
if( retVal ){
//If it succeeded, remove it's tooltip from the map
LVCOLUMN *lvColumn = (LVCOLUMN*) malloc (sizeof(LVCOLUMN));
for (int i = 0; GetColumn(i, lvColumn) != 0; i++);
{
CString strKey;
strKey.Format(_T("%d"), nItem * 100 + i);
m_ToolTipMap.RemoveKey( strKey );
}
}
return retVal;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -