半自繪listctrl,添加資料沒問題,超過顯示長度出現滾動條程式就蹦了


找不到問題所在 代碼在一樓,麻煩各位幫忙看看
uj5u.com熱心網友回復:
void CListCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpd)
{
CDC dc;
dc.Attach(lpd->hDC);
m_head.SetColor(heada, RGB(0, 0, 0));
CRect rc;
rect = lpd->rcItem;
dc.SetTextColor(textcolor);
hang = lpd->itemID;
if (lpd->itemState & ODS_SELECTED)
{
dc.FillSolidRect(rect, selcolor);
}
else
{
if (hang % 2)
{
dc.FillSolidRect(rect, bgcolor);
}
else
{
dc.FillSolidRect(rect, qjcolor);
}
}
int i = 0, nCount = m_head.GetItemCount();
while (i<nCount)
{
//TRACE("itemID=%d,nCount=%d,right=%d,left=%d/n", hang, i, rect.right, rect.left);
m_head.GetItemRect(i, rc);
rc.top = rect.top;
rc.bottom = rect.bottom;
rc.NormalizeRect();
rc.left -= GetScrollPos(SB_HORZ);
dc.DrawText(GetItemText(hang, i), rc, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
++i;
}
dc.Detach();
}
uj5u.com熱心網友回復:
void CListCtrlEx::createItemButton( int nItem, int nSubItem, HWND hMain,int numb )
{
CRect rect;
int offset = 0;
// Make sure that the item is visible
if( !EnsureVisible(nItem, TRUE))
return ;
GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
// Now scroll if we need to expose the column
CRect rcClient;
GetClientRect(rcClient);
if( offset + rect.left < 0 || offset + rect.left > rcClient.right )
{
CSize size;
size.cx = offset + rect.left;
size.cy = 0;
Scroll(size);
rect.left -= size.cx;
}
rect.left += offset;
rect.right = rect.left + GetColumnWidth(nSubItem);
if(rect.right > rcClient.right)
rect.right = rcClient.right;
//basic code end
rect.bottom = rect.top + rect.Height();
int iPageCout = GetCountPerPage();
if ( nItem >= iPageCout )
{
rect.top += rect.Height();
rect.bottom += rect.Height();
}
DWORD dwStyle = WS_CHILD | WS_VISIBLE;
CButtonEx *pButton = new CButtonEx(nItem,nSubItem,rect,hMain);
m_uID++;
CString sz;
sz.Format(_T("%d"), numb);
pButton->Create(sz,dwStyle, rect, this, m_uID);
m_mButton.insert( make_pair( nItem, pButton ) );
int iTopIndex = GetTopIndex();
if ( iTopIndex > 0 )
{
updateListCtrlButtonPos();
}
return;
}void CListCtrlEx::PreSubclassWindow()
{
// TODO: 在此添加專用代碼和/或呼叫基類
CListCtrl::PreSubclassWindow();
CHeaderCtrl *pHeader = GetHeaderCtrl();
m_head.SubclassWindow(pHeader->GetSafeHwnd());
InitializeFlatSB(this->m_hWnd);
FlatSB_EnableScrollBar(this->m_hWnd, SB_BOTH, ESB_DISABLE_BOTH);
}
uj5u.com熱心網友回復:
有沒有解決方法啊……求各位指點指點uj5u.com熱心網友回復:
請先找到哪里 出錯 ?(哪行)uj5u.com熱心網友回復:
你圖中的界面點重試就斷到程式里了然后通過呼叫堆疊就能找到出錯的地方
uj5u.com熱心網友回復:
地方是

系統檔案這里.....看不懂啊......然后錯誤提示是迭代器越界了,但是我是在視窗關閉我才釋放的
uj5u.com熱心網友回復:
我覺得是這里,在插入到最下面 需要往下插得時候出錯的..但是我不知道怎么改..麻煩看看
這是createItemButton中最后呼叫的那個函式
void CListCtrlEx::updateListCtrlButtonPos()
{
int iTopIndex = GetTopIndex();
int nItem = iTopIndex;
button_map::iterator iter;
button_map::iterator iterUp;
int iLine = 0;
#ifdef USE_TOPINDEX_BUTTON
iter = m_mButton.find( iTopIndex );
iterUp = m_mButton.begin();
while ( iter != m_mButton.end() )
{
iterUp->second->EnableWindow( iter->second->bEnable );
iter ++;
iterUp++;
}
#else
for ( ; nItem < GetItemCount(); nItem++ )
{
iter = m_mButton.find(nItem);
if( iter!= m_mButton.end() )
{
CRect rect;
iterUp = m_mButton.find(iLine);
rect = iterUp->second->m_rect;
iter->second->MoveWindow( &rect );
iter->second->ShowWindow( SW_SHOW );
if( iLine < iTopIndex )
{
iterUp->second->ShowWindow( SW_HIDE );
}
iLine++;
}
}
#endif
uj5u.com熱心網友回復:
往下定位到自己的代碼
uj5u.com熱心網友回復:
往下定位到自己的代碼
沒用啊.....往下定位還是系統封裝的...在繼續就退出了![]()
uj5u.com熱心網友回復:
找到位置了,插入到翻頁后int iLine = 0;
#ifdef USE_TOPINDEX_BUTTON
iter = m_mButton.find( iTopIndex );
if (iter == nullptr)
return;
iterUp = m_mButton.begin();
while ( iter != m_mButton.end() )
{
iterUp->second->EnableWindow( iter->second->bEnable );
iter ++;
iterUp++;
}
#else
for ( ; nItem < GetItemCount(); nItem++ )
{
iter = m_mButton.find(nItem);
if( iter!= m_mButton.end() )
{
CRect rect;
iterUp = m_mButton.find(iLine); //如果翻頁后這里查找的為end,所以報錯了,然后我改為初始值為1,就重復插入最后一行......
rect = iterUp->second->m_rect;
iter->second->MoveWindow( &rect );uj5u.com熱心網友回復:
找到位置了,插入到翻頁后int iLine = 0;
#ifdef USE_TOPINDEX_BUTTON
iter = m_mButton.find( iTopIndex );
if (iter == nullptr)
return;
iterUp = m_mButton.begin();
while ( iter != m_mButton.end() )
{
iterUp->second->EnableWindow( iter->second->bEnable );
iter ++;
iterUp++;
}
#else
for ( ; nItem < GetItemCount(); nItem++ )
{
iter = m_mButton.find(nItem);
if( iter!= m_mButton.end() )
{
CRect rect;
iterUp = m_mButton.find(iLine); //如果翻頁后這里查找的為end,所以報錯了,然后我改為初始值為1,就重復插入最后一行......
rect = iterUp->second->m_rect;
iter->second->MoveWindow( &rect );
判斷一下這里不插入不就是了uj5u.com熱心網友回復:
找到位置了,插入到翻頁后
判斷一下這里不插入不就是了
那樣我就只能插入72個,超過的就插入不進去了![]()
uj5u.com熱心網友回復:
崩潰的時候在彈出的對話框按相應按鈕進入除錯,按Alt+7鍵查看Call Stack即“呼叫堆疊”里面從上到下列出的對應從里層到外層的函式呼叫歷史。雙擊某一行可將游標定位到此次呼叫的源代碼或匯編指令處,看不懂時雙擊下一行,直到能看懂為止。
uj5u.com熱心網友回復:
按這個這個錯誤來看應該是只有這么多了啊
找到位置了,插入到翻頁后
判斷一下這里不插入不就是了
那樣我就只能插入72個,超過的就插入不進去了uj5u.com熱心網友回復:
按這個這個錯誤來看應該是只有這么多了啊
找到位置了,插入到翻頁后
判斷一下這里不插入不就是了
那樣我就只能插入72個,超過的就插入不進去了
我跟進去看了,發現我在map中插入的序列改為按鈕數量,但是find的時候搜索20或者30 就為end了,始終只能插72個不知道為什么......uj5u.com熱心網友回復:
請先找到哪里 出錯 ?(哪行)
找到出錯位置int iTopIndex = GetTopIndex();
int nItem = iTopIndex;
button_map::iterator iter;
button_map::iterator iterUp;
int iLine = 0;
#ifdef USE_TOPINDEX_BUTTON
iter = m_mButton.find( iTopIndex );//搜索為end
m_mButton為map容器,索引是按鈕數量,但是我搜索20,或者8 都是end,插入button的數量也不能超過72個......求大神幫忙解答一下uj5u.com熱心網友回復:
如果可以 上傳你的 工程轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/113949.html
標籤:界面
