1、GetClientRect()得到的是:{top=0 bottom=110 left=0
right=364得到的是控件内部的可绘制区,加上边框的大小就是整个控件的大小
GetWindowRect()得到的是:{top=63 bottom=177 left=182
right=550}//这个是控件相对于对话框的位置和大小
2、资源里用字体单位来表示大小,窗口函数中用像素来表示。其关系可以用
MapDialogRect
来转换。或者用GetDialogBaseUnits获得对话框单位大小。
3、ClientToScreen 和 ScreenToClient
函数功能:
ClientToScreen函数将指定点的用户坐标转换成屏幕坐标
ScreenToClient把屏幕上指定点的屏幕坐标转换成用户坐标。
例如:想要得到文本框在对话框中左上角的坐标(即文本框左上角到对话框左上角的距离)
CRect rectEdit,rectDlg;
CWnd *pWnd=GetDlgItem(IDC_EDIT1);//获得文本框指针
pWnd->GetClientRect(rectEdit); //获得文本框矩形,左上角坐标(0,0)
pWnd->ClientToScreen(rectEdit); //转换到屏幕坐标,左上角坐标为文本框在屏幕的坐标
GetClientRect(rectDlg);//获得对话框矩形,左上角坐标(0,0)
ClientToScreen(rectDlg);//转换到屏幕坐标,左上角坐标为对话框在屏幕的坐标
int x=rectEdit.left-rectDlg.left;//他们的差即为文本框在对话框中的X坐标
int y=rectEdit.top-rectDlg.top;//他们的差即为文本框在对话框中的Y坐标
再如:
ClientToScreen( )是把窗口坐标转换为屏幕坐标
ScreenToClient( )是把屏幕坐标转换为窗口坐标
屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的
VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。
一个窗体分为两部分:系统区和客户区
象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地盘喽!!!
Width, Height 是指整体的,ClientWidth, ClientHeight是指客户区的,两者相减就是
系统区的啦!!!
ClientToScreen是把坐标从当前窗体转化成全屏幕的!!!
ScreenToClient是把屏幕坐标转化成相对当前窗体的坐标!!!!
bool m_bIsLButtonDawn =false;
void CDrawDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd *pwnd=GetDlgItem(IDC_EDIT1);
CDC *pdc=pwnd->GetDC();
CRect rect;
this->ClientToScreen(&point);
pwnd->ScreenToClient(&point);
pwnd->GetClientRect(&rect);
// HCURSOR hcur=::LoadCursorFromFile("pen.cur");
// SetClassLong(GetSafeHwnd(),GCL_HCURSOR,(LONG)hcur);
// CPen pen(PS_INSIDEFRAME,-1,RGB(255,255,255));
// CPen* olePen=pdc->SelectObject(&pen);
if(rect.PtInRect(point) && m_bIsLButtonDawn )
{
pdc->DPtoLP(&m_fp);
pdc->MoveTo(m_fp);
pdc->DPtoLP(&point);
pdc->LineTo(point);
}
m_fp=point;
// pdc->SelectObject(olePen);
ReleaseDC(pdc);
CDialog::OnMouseMove(nFlags, point);
}
void CDrawDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bIsLButtonDawn =false;
// TODO: Add your message handler code here and/or call default
/**//*
CWnd *pwnd=GetDlgItem(IDC_EDIT1);
CDC *pdc=pwnd->GetDC();
CRect rect;
this->ClientToScreen(&point);
pwnd->ScreenToClient(&point);
pwnd->GetClientRect(&rect);
if(rect.PtInRect(point))
{
pdc->DPtoLP(&m_fp);
pdc->MoveTo(m_fp);
pdc->DPtoLP(&point);
pdc->LineTo(point);
}
ReleaseDC(pdc);*/
CDialog::OnLButtonUp(nFlags, point);
}
void CDrawDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd *pwnd=GetDlgItem(IDC_EDIT1);
CDC *pDC=pwnd->GetDC();
CRect rect;
this->ClientToScreen(&point);
pwnd->ScreenToClient(&point);
pwnd->GetClientRect(&rect);
if(rect.PtInRect(point))
{
m_fp.x=point.x;
m_fp.y=point.y;
}
ReleaseDC(pDC);
m_bIsLButtonDawn =true;
CDialog::OnLButtonDown(nFlags, point);
}