今天编写了自己的EGE Insight - initgraph原型, 对EGE建立视窗的过程进行简化, 砍掉细枝末节, 实作出了自己的实验版本. 在准备研究EGE的渲染工作模型前又过了一遍initgraph源码, 发现了下面这个片段:
dw = GetSystemMetrics(SM_CXFRAME) * 2;
dh = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYCAPTION) * 2;
这是InitInstance中的一段代码, 该函数调用CreateWindowEx创建视窗并调用ShowWindow显示视窗 (似乎还判断了是否将新视窗作为子控制项加入, 如果是则追加WS_CHILDWINDOW视窗样式). 为了创建带有指定尺寸的客户区域的视窗, EGE甚至将边框与标题列的尺寸计算在内. dw是横向的补偿尺寸, 它包括了两倍的横向边框的尺寸; 但dh的计算方法显然有问题: 最粗糙的考虑下, 我们应当补偿一个标题列外加两倍纵向边框的尺寸, 因此合理的代码应该为
dh = GetSystemMetrics(SM_CYFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);
使用这样计算来的视窗尺寸创建了视窗后, 我使用尺子去测量了客户区域的实际尺寸, 得到的结果比预想中的稍大.
经过多次尝试, 我找到了一组这样的补偿值:
横向: window_width = client_width + 6
纵向: window_height = client_height + 28
而Windows 7下开启Aero运行GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYCAPTION)得到的结果为8, 22. 我无法得出如何从GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYCAPTION)得到正确的补偿值. 希望EGE作者能在此对这段代码予以说明.
dw = GetSystemMetrics(SM_CXFRAME) * 2;
dh = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYCAPTION) * 2;
这是InitInstance中的一段代码, 该函数调用CreateWindowEx创建视窗并调用ShowWindow显示视窗 (似乎还判断了是否将新视窗作为子控制项加入, 如果是则追加WS_CHILDWINDOW视窗样式). 为了创建带有指定尺寸的客户区域的视窗, EGE甚至将边框与标题列的尺寸计算在内. dw是横向的补偿尺寸, 它包括了两倍的横向边框的尺寸; 但dh的计算方法显然有问题: 最粗糙的考虑下, 我们应当补偿一个标题列外加两倍纵向边框的尺寸, 因此合理的代码应该为
dh = GetSystemMetrics(SM_CYFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);
使用这样计算来的视窗尺寸创建了视窗后, 我使用尺子去测量了客户区域的实际尺寸, 得到的结果比预想中的稍大.
经过多次尝试, 我找到了一组这样的补偿值:
横向: window_width = client_width + 6
纵向: window_height = client_height + 28
而Windows 7下开启Aero运行GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYCAPTION)得到的结果为8, 22. 我无法得出如何从GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYCAPTION)得到正确的补偿值. 希望EGE作者能在此对这段代码予以说明.



