WM_MOUSEMOVE & CRichEditCtrl
Robert Somrek -- Robert.Somrek@noaa.gov Monday, December 09, 1996 Environment: Win95, VC++ 4.1 I have added a status bar pane for Column/Row to a CRichEditView. There are several examples of tracking the caret and updating a col/row when using a CEditView. Unfortunately they don't work correctly with the CRichEditView/CRichEditCtrl combination. Here's the problem: When the mouse is dragged to select text, it appears that the mousemove event is not passed to the view so the caret cannot be tracked and col/row cannot be updated. When the drag selection is completed, the caret location is not necessarly at the drag endpoint. (This does not happen with CEditView and the col/row pane can be updated dynamically as the mouse is dragged.) I have set the CRichEditCtrl's event mask to include ENM_MOUSEEVENTS and can catch all mousemove events (standard, MK_CONTROL, etc) through the view's ON_NOTIFY_REFLECT except those events that include MK_LBUTTON (such as a drag selection). Is this a design characteristic of the RichEditCtrl or have I missed something? in MessageMap..... ON_NOTIFY_REFLECT(EN_MSGFILTER, OnRichEditCtrlMsgFilter) code..... void CMyREView::OnRichEditCtrlMsgFilter(NMHDR* pNMHDR, LRESULT* pResult) { MSGFILTER* pMF = (MSGFILTER*)pNMHDR; if (pMF->msg == WM_MOUSEMOVE && (pMF->wParam & MK_LBUTTON)) { TRACE("wParam: %d\n", pMsgFilter->wParam); \\ line about never executed!! } *pRsult = 0; } Bob Somrek National Weather Service robert.somrek@noaa.gov
Lee Thompson -- lee@mail1.nai.net Thursday, December 12, 1996 One of my older apps does this for a CRichEditView. The status bar pane creation and updating for col/row is copied from the code added by the component gallery for date and time on the status bar. The pane is updated via ON_UPDATE_COMMAND_UI. When this happens I query the view for the string to display using something like: CString CNoteView::GetLine() { CString result; int line_num = (int)(GetRichEditCtrl().LineFromChar(-1))+1;//adjust so not zero based int begin_of_line = GetRichEditCtrl().LineIndex(line_num-1); CHARRANGE char_range; GetRichEditCtrl().GetSel(char_range); long char_num = (char_range.cpMin - begin_of_line)+1; //adjust so not zero based sprintf(result.GetBuffer(50),_T("Ln %i, Col %i "),line_num,(int)char_num); result.ReleaseBuffer(); return result; } Hope this helps, Lee Thompson
| Вернуться в корень Архива |