/*------------------------------------------------------------------- CFootyView::AdjustVisiblePos 見える位置をキャレット位置から調整する処理 <戻り値>位置が変更されたときtrue -------------------------------------------------------------------*/ bool CFootyView::AdjustVisiblePos(){ /*宣言*/ CFootyLine::EthicInfo stEthicInfo; const LinePt pLine = m_pDocuments->GetCaretPosition()->GetLinePointer(); const size_t nPosition = m_pDocuments->GetCaretPosition()->GetPosition(); /*倫理桁情報を取得する*/ stEthicInfo = pLine->CalcEthicLine (nPosition,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); /*移動する必要がある*/ if ((size_t)m_nFirstVisibleColumn + m_nVisibleColumns < stEthicInfo.m_nEthicColumn || stEthicInfo.m_nEthicColumn < (size_t)m_nFirstVisibleColumn){ if (stEthicInfo.m_nEthicColumn > m_nVisibleColumns / 2) m_nFirstVisibleColumn = (int)(stEthicInfo.m_nEthicColumn - m_nVisibleColumns / 2); else m_nFirstVisibleColumn = 0; return true; } return false; }
/** * CFootyView::CaretMove * @brief キャレットの位置とIMEポジションの位置を設定する */ void CFootyView::CaretMove(){ /*宣言*/ const LinePt pLine = m_pDocuments->GetCaretPosition()->GetLinePointer(); const size_t nPosition = m_pDocuments->GetCaretPosition()->GetPosition(); CEthicLine cFirstVisible = *m_pDocuments->GetFirstVisible(m_nViewID); CFootyLine::EthicInfo stEthicInfo; int nCaretX,nCaretY; /*キャレット位置を計算する*/ int nOffset = (int)pLine->GetOffset(); stEthicInfo = pLine->CalcEthicLine (nPosition,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); nCaretX = GetTextPosX((int)stEthicInfo.m_nEthicColumn); nCaretY = m_nRulerHeight + (int)(nOffset - cFirstVisible.GetLinePointer()->GetOffset() - cFirstVisible.GetEthicNum() + stEthicInfo.m_nEthicLine) * (m_pFonts->GetHeight() + m_nHeightMargin); /*キャレットの太さを決定する*/ if (!m_pDocuments->IsInsertMode()){ if (nPosition == pLine->GetLineLength()) m_nCaretWidth = 2; else{ stEthicInfo = pLine->CalcEthicLine (nPosition + 1,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); m_nCaretWidth = GetTextPosX((int)stEthicInfo.m_nEthicColumn) - nCaretX; } } else m_nCaretWidth = 2; /*キャレットを再構築*/ if (m_bIsFocused){ m_cCaret.ReCreate(m_nCaretWidth,m_pFonts->GetHeight()); m_cCaret.Move(nCaretX,nCaretY); } int nHeightScroll = GetSystemMetrics(SM_CYHSCROLL); int nWidthScroll = GetSystemMetrics(SM_CXVSCROLL); if (nCaretX < m_nLineCountWidth || m_nWidth - nWidthScroll < nCaretX || nCaretY < m_nRulerHeight || m_nHeight - nHeightScroll < nCaretY){ nCaretX = 0; nCaretY = 0; m_cCaret.Hide(); } else{ if (m_bIsFocused)m_cCaret.Show(); } // IMEを設定する if (m_bIsFocused) { LOGFONT lFont; COMPOSITIONFORM cf; HIMC hImc=ImmGetContext(m_hWnd); if (hImc) { // フォントを設定する GetObject(m_pFonts->GetKanjiFont(),sizeof(LOGFONT),&lFont); ImmSetCompositionFont(hImc,&lFont); // IME表示領域を設定する cf.dwStyle = CFS_POINT; cf.ptCurrentPos.x = (long)nCaretX; cf.ptCurrentPos.y = (long)nCaretY; cf.rcArea.left = cf.ptCurrentPos.x; cf.rcArea.top = cf.ptCurrentPos.y; cf.rcArea.right = m_nWidth; cf.rcArea.bottom = m_nHeight; ImmSetCompositionWindow(hImc, &cf); // ハンドルの解放 ImmReleaseContext(m_hWnd,hImc); } } }