ClientToScreen(&rect[0]); 这一句有问题。这一句是隐含的
this->ClientToScreen,你用控件的坐标系,来当作对话框的坐标转换成屏幕坐标,当然会出错了。
改成
GetDlgItem(IDC_PLAY1)->ClientToScreen,然后再
this->ScreenToClient就能得到IDC_PLAY1控件相对于对话框左上角的坐标了。
GetWindowRect() 得到的是在屏幕坐标系下的RECT(即以屏幕左上角为原点)
GetClientRect() 得到的是在客户区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏计算,仅仅是个大小,返回值的左上角永远为0,0)
ScreenToClient() 就是把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。
如果需要获得窗体在屏幕上的位置,使用GetWindowRect
如果需要获得窗体的大小,使用GetClientRect
用记事本打开工程目录下的rc文件
搜索你的控件ID,里面有记录
以编辑框为例,搜索IDC_EDIT1找到如下文字
EDITTEXT IDC_EDIT1,64,24,55,15,ES_AUTOHSCROLL
里面64,24是指控件左上角相对窗口左上角的座标,
55,15,是指控件的宽高
修改这里的数字,改成你想要的值,然后重新打开工程就行了
至于究竟要修改成多少,可以目测,也可以下载个电脑尺(JRuler)量一量
那个bmp这样看的话也是一个窗口
GetWindowRect 获取bmp窗口的矩形,其中左上就是你那个红点
ScreenToClient 把左上的坐标送进去,hwnd用你上面那个test dis demo窗口的句柄,获取相对坐标
另:在上点击一点是啥,响应WM_LBUTTONDOWN函数吗,在TestDisDemo里响应WM_LBUTTONDOWN的话拿到的坐标直接就是相对你上面那个红点相对左上红点的坐标了
[cpp] view plaincopy
void CMainFrame::OnChangeSize()
{
// TODO: Add your command handler code here
CRect cr;
GetClientRect(&cr);//获取对话框客户区域大小
ClientToScreen(&cr);//转换为荧幕坐标
int x= GetSystemMetrics(SM_CXSCREEN);//获取荧幕坐标的宽度,单位为像素
int y= GetSystemMetrics(SM_CYSCREEN);//获取荧幕坐标的高度,单位为像素
//MoveWindow((x-crWidth() 2)/2 ,crtop,crWidth() 2,crHeight() 2);//设置窗口显示的位置以及大小
MoveWindow(crleft ,crtop,crWidth(),crHeight()/2);//设置窗口显示的位置以及大小
}
[cpp] view plain copy
void CMainFrame::OnChangeSize()
{
// TODO: Add your command handler code here
CRect cr;
GetClientRect(&cr);//获取对话框客户区域大小
ClientToScreen(&cr);//转换为荧幕坐标
int x= GetSystemMetrics(SM_CXSCREEN);//获取荧幕坐标的宽度,单位为像素
int y= GetSystemMetrics(SM_CYSCREEN);//获取荧幕坐标的高度,单位为像素
//MoveWindow((x-crWidth() 2)/2 ,crtop,crWidth() 2,crHeight() 2);//设置窗口显示的位置以及大小
MoveWindow(crleft ,crtop,crWidth(),crHeight()/2);//设置窗口显示的位置以及大小
首先,你要确认是哪一个窗口捕获了你鼠标的信息。如果你没有特意的设置鼠标捕获,默认的一般为鼠标下所在Z order的最上层窗口所捕获。
其次,转换坐标时要清楚你获得的鼠标位置是那个窗口的,然后你要转换到那个窗口。如果不能理解成员函数的含义的话可以使用全局函数::ScreenToClient(); ::ClientToScreen();
以上就是关于对话框坐标问题全部的内容,包括:对话框坐标问题、VC++6.0 如何获取窗口客户区域在屏幕中的位置、MFC工程中怎么得到相对窗口的坐标等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)