ClientToScreen( )是把窗口坐标转换为屏幕坐标
pWnd->GetClientRect(&rc1);是获取窗体中客户区的大小











如果在Dialog类里面直接调ClientToScreen,那么获得的是该Dialog窗体左上角rect大小的一块 空间 相对于屏幕的rect。
- point
- 是相对CLYHchxuView(暂时理解为屏幕)的坐标
- 如果你要获的是相对CLYHchxuView左上角的坐标
- 就不需要转换
- 如果你你要获的是相对程序主窗口左上角的坐标
- 可以这样算
- void CLYHchxuView::OnLButtonDblClk(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- CRect rc;
- GetParent()->GetWindowRect(&rc);
- ClientToScreen(&point);
- docx=point.x-rc.left;
- docy=point.y-rc.top;
- Invalidate();
- CView::OnLButtonDblClk(nFlags, point);
- }
point
是相对CLYHchxuView(暂时理解为屏幕)的坐标
如果你要获的是相对CLYHchxuView左上角的坐标
就不需要转换
如果你你要获的是相对程序主窗口左上角的坐标
可以这样算
void CLYHchxuView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rc;
GetParent()->GetWindowRect(&rc);
ClientToScreen(&point);
docx=point.x-rc.left;
docy=point.y-rc.top;
Invalidate();
CView::OnLButtonDblClk(nFlags, point);
}
现在来看看Invalidate(TRUE)都干了些什么。其实,它只是间接向消息队列添加了 WM_ERASEBKGND 和WM_PAINT两个消息。但是,如果使用Invalidate(FALSE)的话,则只有WM_PAINT消息产生,这时是不会有任何闪烁的
现在看来,闪烁似乎是由WM_ERASEBKGND消息产生的,事实上,的确与它有关。那WM_ERASEBKGND有干了什么呢?WM_ERASEBKGND消息由OnEraseBkgnd()消息处理函数响应,它的作用就是重绘客户区背景。我们可以通过向工程里添加WM_ERASEBKGND这个消息,然后在重写的消息处理函数中将返回语句修改为return TRUE来屏蔽这一功能,这样做的好处是这时不会重绘背景了,坏处是这时背景也不会被擦出来。