用c++11封装win32界面库 (三)

2014-11-24 03:23:30 · 作者: · 浏览: 2
感觉不够通用,还要记一大堆api。


把 layout 问题抽象,其实可以看做一个约束问题。比如一个窗口,宽度是W,它包含左右两部分,左边宽度是右边两倍,可以描述成:


[html]
w1 == 2 * 2w; // 左边宽度是右边两倍
w1 + w2 == W; // 总宽度是W

w1 == 2 * 2w; // 左边宽度是右边两倍
w1 + w2 == W; // 总宽度是W
或者固定宽度100:


[html]
w1 == 100;

w1 == 100;
或者播放器保持 16:9 比例,最小宽度200:


[html]
w / h = 16 / 9;
w >= 200;

w / h = 16 / 9;
w >= 200;
这样一来,布局问题就变成了数学问题,通过解n元一次方程组就能算出每个控件的位置和大小。以后布局就不用记什么 layout api了,直接给几个公式就ok,如果觉得公式不直观也可以稍微封装几个 api。

我找了一个线性问题的c++库 SymbolicC++ ,简单测试了下,解三元一次方程:
x + y + z == 26;

x - y == 1;

2x - y + z == 18;


[cpp]
#pragma warning(disable: 4800 4801 4101 4390)
#include
using namespace std;
#include "Symbolic/symbolicc++.h"

int main() {

Symbolic x("x"), y("y"), z("z");
Equations rules = (
x + y + z == 26,
x - y == 1,
2*x - y + z == 18
);

list s = (x, y, z);

list result = solve(rules, s);

for(auto& r : result) {
cout << r << endl; // 输出 x==10 y==9 z==7
}
}

#pragma warning(disable: 4800 4801 4101 4390)
#include
using namespace std;
#include "Symbolic/symbolicc++.h"

int main() {

Symbolic x("x"), y("y"), z("z");
Equations rules = (
x + y + z == 26,
x - y == 1,
2*x - y + z == 18
);

list s = (x, y, z);

list result = solve(rules, s);

for(auto& r : result) {
cout << r << endl; // 输出 x==10 y==9 z==7
}
}
语法非常简洁,但结果debug下耗时402ms, release下67ms, 实在太慢了 @_@, 可能和里面的字符串有关,也许有开关可以避免处理字符串,也不知道有没有快点的库,如果有好的建议请告知:)


我想实在不行自己封装一个解方程库也是可以的,用矩阵啊什么的!@#$%^&&*()