主题:[讨论]难道微软的屏幕和客户区间坐标转换函数有错误??
各位朋友好!!
我是初学SDK,看到有的窗口可以改变大小,但是小到一定的高和宽程序就不允许再改,比如说QQ的窗口。
于是我用以下代码也试着做一个,不知道正确实现方法是不是这种,
但还不是我最疑惑的问题,而是关于屏幕和客户区间坐标转换函数计算误差,
代码如下,并不长:
假定创建窗口时给定的位置:x=260,y=200,宽度=550,高度=380,
要求程序只能使它变大而不能在小于此值:
case WM_SIZING:
if( ((PRECT)lParam)->right - ((PRECT)lParam)->left < 550 ||
((PRECT)lParam)->bottom - ((PRECT)lParam)->top < 380 )
{
pt.x = 0;
pt.y = 0;
ClientToScreen(hwnd,&pt);
rect.left = pt.x;
rect.top = pt.y;
pt.x = 550;
pt.y = 380;
ClientToScreen(hwnd,&pt);
rect.right = pt.x;
rect.bottom = pt.y;
hdc = GetDC(hwnd);
wsprintf(Buf,"L%i,T%i",rect.left,rect.top);
TextOut(hdc,0,0,Buf,lstrlen(Buf));
wsprintf(Buf,"R%i,B%i",rect.right,rect.bottom);
TextOut(hdc,0,16,Buf,lstrlen(Buf));
ReleaseDC(hwnd,hdc);
((PRECT)lParam)->left = rect.left-4; //转换后的值水平有误差4个像素
((PRECT)lParam)->top = rect.top-31; //转换后的值垂直有误差31个像素
((PRECT)lParam)->right = rect.right-4;
((PRECT)lParam)->bottom = rect.bottom-31;
}
return TRUE;
如果第一次显示窗口,默认的位置将是创建时给定的260和200,此时在边框上单击而
不拖动鼠标将会显示当前窗口的4个值。
此时屏幕坐标应该为 左260 上200 右810 下580
而显示在窗口左上角TextOut的经过转换成屏幕坐标的窗口区域4个值时,水平方向即
左和右正确值多4个像素:264, 814,垂直方向即顶部和底部多31个像素:231,611,
没办法才将水平的值后边-4,垂直的后边-32,此后程序运行正常,效果理想了。
请问这个错误是我这新手学艺不精,又什么地方疏忽了造成的还是此版本的函数就存在着问题? 请各位高手朋友帮忙分析一下,不胜感激!!
还有,我的这种方法是不是想实现此功能的标准惯用的方法?如果不是请好心人给出正确的代码,谢谢你们了!!
我是初学SDK,看到有的窗口可以改变大小,但是小到一定的高和宽程序就不允许再改,比如说QQ的窗口。
于是我用以下代码也试着做一个,不知道正确实现方法是不是这种,
但还不是我最疑惑的问题,而是关于屏幕和客户区间坐标转换函数计算误差,
代码如下,并不长:
假定创建窗口时给定的位置:x=260,y=200,宽度=550,高度=380,
要求程序只能使它变大而不能在小于此值:
case WM_SIZING:
if( ((PRECT)lParam)->right - ((PRECT)lParam)->left < 550 ||
((PRECT)lParam)->bottom - ((PRECT)lParam)->top < 380 )
{
pt.x = 0;
pt.y = 0;
ClientToScreen(hwnd,&pt);
rect.left = pt.x;
rect.top = pt.y;
pt.x = 550;
pt.y = 380;
ClientToScreen(hwnd,&pt);
rect.right = pt.x;
rect.bottom = pt.y;
hdc = GetDC(hwnd);
wsprintf(Buf,"L%i,T%i",rect.left,rect.top);
TextOut(hdc,0,0,Buf,lstrlen(Buf));
wsprintf(Buf,"R%i,B%i",rect.right,rect.bottom);
TextOut(hdc,0,16,Buf,lstrlen(Buf));
ReleaseDC(hwnd,hdc);
((PRECT)lParam)->left = rect.left-4; //转换后的值水平有误差4个像素
((PRECT)lParam)->top = rect.top-31; //转换后的值垂直有误差31个像素
((PRECT)lParam)->right = rect.right-4;
((PRECT)lParam)->bottom = rect.bottom-31;
}
return TRUE;
如果第一次显示窗口,默认的位置将是创建时给定的260和200,此时在边框上单击而
不拖动鼠标将会显示当前窗口的4个值。
此时屏幕坐标应该为 左260 上200 右810 下580
而显示在窗口左上角TextOut的经过转换成屏幕坐标的窗口区域4个值时,水平方向即
左和右正确值多4个像素:264, 814,垂直方向即顶部和底部多31个像素:231,611,
没办法才将水平的值后边-4,垂直的后边-32,此后程序运行正常,效果理想了。
请问这个错误是我这新手学艺不精,又什么地方疏忽了造成的还是此版本的函数就存在着问题? 请各位高手朋友帮忙分析一下,不胜感激!!
还有,我的这种方法是不是想实现此功能的标准惯用的方法?如果不是请好心人给出正确的代码,谢谢你们了!!