在我的对话框中有一个CStatic控件,我现在希望在CStatic空间上进行绘图,并且同时能够获取鼠标相对于CStatic控件上左上角的坐标并将坐标保存下来,请问应该如何去做?非常感谢。
业精于勤,荒于嬉;行成于思,毁于随。
時間倉促,先回答一半。 取得滑鼠指標在視窗內的座標很簡單,我這裡使用了WM_MOUSEMOVE訊息回應函數。先看一下我的範例視窗組成:
下面的標籤用來輸出結果。然後直接上程式碼看:
void CStaticDrawDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default TCHAR buffer[255]; //用来保存结果的字符串 memset(buffer, 0, 255); CRect staticRect; //用来保存static控件的大小 (GetDlgItem(IDC_STATIC_DRAW))->GetWindowRect(&staticRect); //获取static大小 ScreenToClient(&staticRect); //把相对屏幕的坐标转换成相对当前窗口客户区的大小 CPoint insidePoint; //用来保存鼠标指针相对static控件坐标 insidePoint.x = point.x - staticRect.left; //当前相对客户区的x坐标减去static的左侧位置即为鼠标指针相对static的坐标 insidePoint.y = point.y - staticRect.top; //同上 //下面把结果显示到另一个static控件上 wsprintf(buffer, _T("当前鼠标指针相对于窗口的x坐标为%d,y坐标为%d\n相对于用来绘图的static的x坐标为%d,y坐标为%d"), point.x, point.y, insidePoint.x, insidePoint.y); (GetDlgItem(IDC_STATIC_OUTPUT))->SetWindowText(buffer); CDialogEx::OnMouseMove(nFlags, point); }
以上就是關於滑鼠指標的問題。 至於在static上畫圖,因為是先響應OnPaint,所以不能在OnPaint裡在static上繪圖。可以用定時器繞過這個問題,在Timer的事件回應函數中完成在static上的繪圖。或從CStatic類別衍生自己的static類,覆寫
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
這個虛函數。
時間倉促,先回答一半。
取得滑鼠指標在視窗內的座標很簡單,我這裡使用了WM_MOUSEMOVE訊息回應函數。先看一下我的範例視窗組成:
下面的標籤用來輸出結果。然後直接上程式碼看:
以上就是關於滑鼠指標的問題。
至於在static上畫圖,因為是先響應OnPaint,所以不能在OnPaint裡在static上繪圖。可以用定時器繞過這個問題,在Timer的事件回應函數中完成在static上的繪圖。或從CStatic類別衍生自己的static類,覆寫
這個虛函數。