Koordinaten umrechnen
-
Hi,
ich hab ein Problem mit dem umrechnen von logischen Koordinaten in Geräte Koordianten.
Ich habe eine Klasse abgeleitet von CListCtrl und fange dort WM_LBUTTONDBLCLK ab. Das ListCtrl wird in einem CRecordView aufgerufen.Ich konnte mir das Rechteck des Items holen allerdings in logischen Koordinaten.
Mein Problem ist jetzt das ich über das Item ein EditFeld zeichnen will mit dem ich das Feld editieren kann. Alles kein Problem nur kann ich das EditFeld nicht an die stelle zeichnen an der das Feld eigentlich stehen sollte.
Meine Konvertierungsversuche scheitern bisher auch kläglich.Hier der Code den ich im Moment habe:
//pProBetaViewSMD - Zeiger auf den View void CMyListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { CRect rect; CRect Pos; CString str; CHeaderCtrl* header = GetHeaderCtrl(); int iItemCnt = GetItemCount(); LVHITTESTINFO pInfo; pInfo.pt = point; pInfo.flags = LVHT_ONITEMLABEL; int iItem = SubItemHitTest(&pInfo); for (int i=0;i<=header->GetItemCount();i++) { int j = iItem; GetSubItemRect(j,i,LVIR_LABEL,rect); if((point.x > rect.left && point.x < rect.right)) { CClientDC hDC(pProBetaViewSMD->GetParent()); pProBetaViewSMD->OnPrepareDC(&hDC); rect.bottom = rect.bottom+2; hDC.DPtoLP(&rect); pProBetaViewSMD->m_SMDEdit.MoveWindow(rect); pProBetaViewSMD->m_SMDEdit.ShowWindow(1); pProBetaViewSMD->m_SMDEdit.SetFocus(); break; } } CListCtrl::OnLButtonDblClk(nFlags, point); }
-
Welche Richtung du brauchst, kriege ich gerade aus dem Kopf nicht hin, aber schau dir mal ScreenToClient und ClientToScreen an.
-
Ok mit den beiden Funktionen ging es.
Zuerst musste ich die Koordinaten aus dem CListCtrl in Bildschirmkoordinaten umwandlen und dann diese Koordinaten wieder in die Clientkoordinaten des Frames umwandelnvoid CMyListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { CRect rect; CRect Pos; CString str; CHeaderCtrl* header = GetHeaderCtrl(); int iItemCnt = GetItemCount(); LVHITTESTINFO pInfo; pInfo.pt = point; pInfo.flags = LVHT_ONITEMLABEL; int iItem = SubItemHitTest(&pInfo); for (int i=0;i<=header->GetItemCount();i++) { int j = iItem; GetSubItemRect(j,i,LVIR_LABEL,rect); if((point.x > rect.left && point.x < rect.right)) { CWnd* pWnd = this; CWnd* pParent = GetParent(); rect.bottom = rect.bottom+2; pWnd->ClientToScreen(&rect); pParent->ScreenToClient(&rect); pProBetaViewSMD->m_SMDEdit.MoveWindow(rect); pProBetaViewSMD->m_SMDEdit.ShowWindow(1); pProBetaViewSMD->m_SMDEdit.SetFocus(); pProBetaViewSMD->m_SMDEdit.SetWindowText(GetItemText(j,i)); break; } } CListCtrl::OnLButtonDblClk(nFlags, point); }