如何调整窗口以适应客户区大小
2009-01-05 07:33
225 查看
以下黑色字体部分为转帖。
假设我们用CreateWindow(..., 0, 0, w, h, ...); 创建一个窗口, 我们将获得一个w x h大小的窗口, 通常我们需要的是客户区大小为w x h,
如何做呢?
一个方法是调用API函数SetWindowPos, 通常我们需要提供3个参数:窗口句柄hwnd,窗口宽度w,窗口高度h。下面是一个示例:
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
现在的问题是我们只知道客户区的大小w x h, 如何获取窗口大小呢?
这里的关键是
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
其中wFrame, hCaption, hMenu, hFrame取值则需要根据窗口样式而定了。
如果窗口提供了Caption, 则hCaption=GetSystemMetrics(SM_CYCAPTION); 否则为0
如果窗口提供了菜单, 则hMenu=GetSystemMetrics(SM_CYMENU); 否则为0
如果窗口提供了Border, 则wFrame=GetSystemMetrics(SM_CXFRAME),hFrame=GetSystemMetrics(SM_CYFRAME); 否则为0
综合起来,如果窗口具有标题栏,具有菜单,具有border,我们可以这样创建一个指定客户区w x h大小的窗口:
CreateWindow(..., 0, 0, w, h, ...);
w = w + GetSystemMetrics(SM_CXFRAME) * 2;
h = h + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYFRAME) * 2;
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
MFC的方法则更加简单
在Create()或者CreateEx()创建窗口以后, 用下面的代码调整窗口的大小。
CRect rect(0, 0, w, h);
CalcWindowRect(&rect);
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW);
waterathena:
但是在我的工程里面
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
这两个公式觉得有问题。
我选择的NON BORDER,然后利用公式的话怎么都相差2个像素值。
日后若知道原因在补上。
假设我们用CreateWindow(..., 0, 0, w, h, ...); 创建一个窗口, 我们将获得一个w x h大小的窗口, 通常我们需要的是客户区大小为w x h,
如何做呢?
一个方法是调用API函数SetWindowPos, 通常我们需要提供3个参数:窗口句柄hwnd,窗口宽度w,窗口高度h。下面是一个示例:
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
现在的问题是我们只知道客户区的大小w x h, 如何获取窗口大小呢?
这里的关键是
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
其中wFrame, hCaption, hMenu, hFrame取值则需要根据窗口样式而定了。
如果窗口提供了Caption, 则hCaption=GetSystemMetrics(SM_CYCAPTION); 否则为0
如果窗口提供了菜单, 则hMenu=GetSystemMetrics(SM_CYMENU); 否则为0
如果窗口提供了Border, 则wFrame=GetSystemMetrics(SM_CXFRAME),hFrame=GetSystemMetrics(SM_CYFRAME); 否则为0
综合起来,如果窗口具有标题栏,具有菜单,具有border,我们可以这样创建一个指定客户区w x h大小的窗口:
CreateWindow(..., 0, 0, w, h, ...);
w = w + GetSystemMetrics(SM_CXFRAME) * 2;
h = h + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYFRAME) * 2;
SetWindowPos(hwnd, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER);
MFC的方法则更加简单
在Create()或者CreateEx()创建窗口以后, 用下面的代码调整窗口的大小。
CRect rect(0, 0, w, h);
CalcWindowRect(&rect);
SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW);
waterathena:
但是在我的工程里面
wWindow = wClient + wFrame * 2
hWindow = hClient + hCaption + hMenu + hFrame * 2
这两个公式觉得有问题。
我选择的NON BORDER,然后利用公式的话怎么都相差2个像素值。
日后若知道原因在补上。
相关文章推荐
- 【转贴】如何调整窗口以适应客户区大小
- WinXP系统如何调整桌面图标大小以适应眼睛
- c#如何禁止Form窗口调整大小,如何禁止combobox输入
- 如何使flash自适应浏览器窗口的大小
- wpf如何自动调整窗口大小以适合其内容
- 如何调整窗口的大小?
- ubuntu remmina 调整窗口大小以适应远程分辨率
- qt的stylesheet中如何设置属性使背景图自动调整来适应控件的大小
- c#如何禁止Form窗口调整大小
- wpf如何自动调整窗口大小以适合其内容
- 如何调整Android Studio的新建项目窗口的大小
- c#如何禁止Form窗口调整大小?如何禁止combobox输入?
- android 4.0硬件加速下渲染过程中如何调整页面大小适应屏幕
- CMD窗口如何调整大小 / 颜色
- 如何根据DPI来动态调整窗口或控件大小?
- 如何禁止Form窗口调整大小,如何禁止combobox输入
- 如何使图片尺寸自动适应窗口,随窗口大小变化而变化
- 图片如何自适应浏览器窗口大小
- 如何让字体随窗口缩放自动调整大小
- 如何调整Android的窗口大小