GetWindowRect与GetClientRect得到的大小与实际的不同

qq_32269045 2018-02-16 11:46:44
环境:Win10 下 VS ultimate 2013
项目:win32非空
代码如下:
1.创建窗口,初始大小600*800
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
0, 0, 800, 600, NULL, NULL, hInstance, NULL);

2.测试代码
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
{
RECT rect[2];
GetClientRect(hWnd, &rect[0]);
GetWindowRect(hWnd, &rect[1]);


char str[2] //两个函数
[2] //对应函数所对应的坐标
[20];//坐标信息
for (int i = 0; i < 2; i++)
{
//控制字符串,得到左上角坐标
sprintf_s(str[i][0], "(%d,%d)", rect[i].left,rect[i].top);
//得到右下角坐标
sprintf_s(str[i][1], "(%d,%d)", rect[i].right, rect[i].bottom);
}

char text[2][20] = { "GetClientRect", "GetWindowRect" };

for (int i = 0; i < 2; i++)
{

TextOutA(hdc, 100 * i + 50, 0, LPCSTR(text[i]), strlen(text[i]));
for (int j = 0; j < 2; j++)
TextOutA(hdc, 100 * i + 50, 30 + j * 30, LPCSTR(&str[i][j]), strlen(str[i][j]));
}
}

EndPaint(hWnd, &ps);
break;

3.运行结果




求大佬分析分析,另祝大家狗年大吉。
...全文
848 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2018-02-16
  • 打赏
  • 举报
回复
如果你要比较它们,应该调用ClientToScreen或ScreenToClient转换为个致的进行比较
paschen 版主 2018-02-16
  • 打赏
  • 举报
回复
没有理解你希望的结果是什么 GetWindowRect是获取当前窗口/控件(包括非客户区如边框和标题栏)在屏幕坐标系中的位置和大小 GetClientRect是获取当前窗口/控件的客户区大小,不是屏幕坐标系(即rect.left=0,rect.top=0,需要屏幕坐标系要用ClientToScreen)。对于有边框的窗口/控件,GetClientRect结果小于GetWindowRect结果
qq_32269045 2018-02-16
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
没有理解你希望的结果是什么 GetWindowRect是获取当前窗口/控件(包括非客户区如边框和标题栏)在屏幕坐标系中的位置和大小 GetClientRect是获取当前窗口/控件的客户区大小,不是屏幕坐标系(即rect.left=0,rect.top=0,需要屏幕坐标系要用ClientToScreen)。对于有边框的窗口/控件,GetClientRect结果小于GetWindowRect结果
之前研究双缓冲的时候,我是用GetClientRect来获取窗口大小,进而控制内存中的图像大小(rect.right,rect.bottom)(和客户端窗口一样大的图形空间),结果画出来在全屏下“正常”,非全屏下显示和预期不一样。想法应该是对的吧。结果刚才重新码了一下,又对了、、、或许之前是哪里没弄对吧

65,196

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧