void WINAPI duListCtrl::ResetLine() { m_nYOffset = 0; m_nFirstLine = 0; m_nFLTotalHeight = 0; m_nHotLine = 0; if (Plugin_IsValid(m_pHot)) { m_pHot->SetState(DU_STATE_NORMAL); Plugin_Redraw(m_pHot, TRUE); } UpdateScroll(); AdjustVisibleLine(0); }
/** * @brief マウスが押されたときの処理 * @param x マウス座標x * @param y マウス座標y */ void CFootyView::OnMouseDown(int x,int y) { /*宣言*/ CEditPosition cNowPosition; CEditPosition cSelStart,cSelEnd; CKeyBoardState cKeyStates(m_bShiftLocked); bool bSelected = m_pDocuments->IsSelecting(); /*フォーカスを合わせる*/ ::SetFocus(m_hWnd); if (y > m_nRulerHeight) { // 行番号表示領域 if (x < m_nLineCountWidth) { CalcLineCount(y,&cSelStart,&cSelEnd); m_pDocuments->SetSelectStart(&cSelStart); m_pDocuments->SetSelectEndNormal(&cSelEnd); m_pDocuments->SetSelLineStart(); *m_pDocuments->GetCaretPosition() = cSelEnd; m_pDocuments->SendMoveCaretCallBack(); // ドラッグ情報を入れる m_nDragMode = DRAGMODE_LINE; SetCapture(m_hWnd); // マウスキャプチャ開始 // 再描画処理 Refresh(); } // 通常のエディタ領域 else { // キャレット位置を移動する CalcInfoFromMouse(x,y,&cNowPosition); if (cKeyStates.IsShiftPushed()) // Shiftキーが押されているときは選択する { if (m_pDocuments->IsSelecting()) m_pDocuments->SetSelectEndNormal(&cNowPosition); else { m_pDocuments->SetSelectStart(); m_pDocuments->SetSelectEndNormal(&cNowPosition); } bSelected = true; } else m_pDocuments->SetSelectStart(&cNowPosition); *m_pDocuments->GetCaretPosition() = cNowPosition; m_pDocuments->SendMoveCaretCallBack(); // ドラッグ情報を入れる m_nDragMode = DRAGMODE_MOUSE; SetCapture(m_hWnd); // マウスキャプチャ開始 // 位置を再設定しておく bool bAdLine = AdjustVisibleLine(); bool bAdPos = AdjustVisiblePos(); /*再描画処理*/ if (bSelected || bAdLine || bAdPos)Refresh(); else CaretRefresh(); } } }
duPlugin *WINAPI duListCtrl::InsertLine(int nIndex, LPCTSTR lpszTemplate) { int nLineCount = m_vtLines.size(); if (nIndex == -1) nIndex = nLineCount; if (nIndex < 0 || nIndex > nLineCount || lpszTemplate == NULL) return NULL; duPlugin *pTemplate = GetPluginByName(lpszTemplate); if (pTemplate == NULL) return NULL; duCtrlManager *pCtrlManager = GetCtrlManager(m_hWnd); duPlugin *pNewPlugin = pCtrlManager->Clone(pTemplate, this, NULL, m_nCloneIndex); if (pNewPlugin == NULL) return NULL; m_nCloneIndex++; pNewPlugin->SetVisible(FALSE); // 初始化隐藏 m_vtLines.insert(m_vtLines.begin() + nIndex, pNewPlugin); duRect rcNewPlugin; pNewPlugin->GetRect(&rcNewPlugin); m_nViewCy += rcNewPlugin.Height(); nLineCount = m_vtLines.size(); duRect rcListCtrl; GetRect(&rcListCtrl); if (nIndex < m_nFirstLine) { int nInsertHeight = rcNewPlugin.Height(); int nNewFirstLine = m_nFirstLine + 1; int nFLTotalHeight = m_nFLTotalHeight; duPlugin *pOldFirstLine = m_vtLines[nNewFirstLine]; duRect rcOld; pOldFirstLine->GetRect(&rcOld); int i; for (i = nNewFirstLine; i >= 0; i--) { duPlugin *pTemp = m_vtLines[i]; wstring strText = pTemp->GetText(); if (pTemp) { duRect rcTemp; pTemp->GetRect(&rcTemp); nNewFirstLine--; nInsertHeight -= rcTemp.Height(); if (nInsertHeight <= rcOld.Height()) { nFLTotalHeight += nInsertHeight; break; } } } m_nFLTotalHeight = nFLTotalHeight; m_nFirstLine = nNewFirstLine; } UpdateScroll(); int nTop = m_nFLTotalHeight - m_nYOffset; AdjustVisibleLine(nTop); return pNewPlugin; }
void WINAPI duListCtrl::VertScroll(int nPos) { int nLineCount = m_vtLines.size(); if (nLineCount <= 0) return; // 判断nPos正确性 duPlugin *pFirstLine = m_vtLines[m_nFirstLine]; duRect rcFirstLine; pFirstLine->GetRect(&rcFirstLine); int i; for (i = 0;i < nLineCount; i++) { duPlugin *pTemp = m_vtLines[i]; pTemp->SetVisible(FALSE); } int nFirstLineOffset = m_nYOffset - m_nFLTotalHeight + nPos; int nTop = 0; if (rcFirstLine.Height() <= nFirstLineOffset) // 计算滚动几个控件 <= ? { int nNewFirstLine = m_nFirstLine; int nNewFLTotalHeight = m_nFLTotalHeight; int i; for (i = nNewFirstLine; i < m_vtLines.size(); i++) { duPlugin *pTemp = m_vtLines[i]; duRect rcTemp; pTemp->GetRect(&rcTemp); nFirstLineOffset -= rcTemp.Height(); if (nFirstLineOffset < 0) { nFirstLineOffset += rcTemp.Height(); break; } nNewFLTotalHeight += rcTemp.Height(); nNewFirstLine++; } m_nFirstLine = nNewFirstLine; m_nFLTotalHeight = nNewFLTotalHeight; } else if (nFirstLineOffset < 0) { int nNewFirstLine = m_nFirstLine - 1; int nNewFLTotalHeight = m_nFLTotalHeight; int i; for (i = nNewFirstLine; i >= 0; i--) { duPlugin *pTemp = m_vtLines[i]; duRect rcTemp; pTemp->GetRect(&rcTemp); nFirstLineOffset += rcTemp.Height(); nNewFLTotalHeight -= rcTemp.Height(); if (nFirstLineOffset > 0) { //nFirstLineOffset -= rcTemp.Height(); break; } nNewFirstLine--; } if (nNewFirstLine < 0) { m_nFirstLine = 0; m_nFLTotalHeight = 0; nFirstLineOffset = 0; } else { m_nFirstLine = nNewFirstLine; m_nFLTotalHeight = nNewFLTotalHeight; } } //_TRACE(_T("nFirstLineOffset : %d\n"), nFirstLineOffset); AdjustVisibleLine(-nFirstLineOffset); }