自己畫的一個簡單界面。就想像成上面有一個個的小正方形吧。
用個結構存每個元素的位置rect,顏色等等。
現在想讓他能拖動。現在是根據LButtonDown 和mousemove 的時候記錄點擊的位置,
move的時候發送redrawwindow訊息。
在OnPaint的時候用雙緩沖 ,在記憶體dc畫。因為動了還得記算
落下的時候的滑鼠位置,當前的滑鼠位置,滑鼠 的狀態,等等,計算當前應該顯示在哪個坐標
但是運行結果與預期差別很大。不知道跑哪去了。
這種情況 有更好的解決方法嗎?跟蹤滑鼠的拖動
界面中的元素沒有子類化,都是在一起畫的。
有個CRectTracker是干這個的么?
uj5u.com熱心網友回復:
空間繼承CRectTracker看看,這個類是允許被移動的,你自己實作記得滑鼠坐標記得要做螢屏坐標轉視窗坐標。。uj5u.com熱心網友回復:
1 在派生類中處理 不用 LButtonDown2 一定要 確定位置
3 不要用 redrawwindow ,這是 同步 重繪,用 Invalidate(); 可以 積累 無效區(不一直paint)!
// CMyStatic message handlers
void CMyStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static CPoint ptLast;
//
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
MapWindowPoints(GetParent(),&rc);
MoveWindow(rc.left+(point.x-ptLast.x), rc.top+(point.y-ptLast.y), rc.Width(), rc.Height());
}
else
{
ptLast=point;
CStatic::OnMouseMove(nFlags, point);
}
Invalidate();
}
uj5u.com熱心網友回復:
用OPenGL來做吧,比你這樣方便多了。uj5u.com熱心網友回復:
按照你的想法做。拖動后顯示繪制不對,應該是沒有轉換坐標,
把滑鼠的坐標轉換成相對視窗的坐標。
當然,MouseMove,LButtonDown中是有滑鼠坐標的,你可以斷點看看它是不是相對視窗的。
uj5u.com熱心網友回復:
思路很正確,就是計算出了問題,https://download.csdn.net/download/hhhh63/7710711,看看這個有沒有幫助。uj5u.com熱心網友回復:
https://www.codeproject.com/search.aspx?q=CRectTracker&sbo=kw&x=0&y=0轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/61045.html
標籤:界面
