我正在设计一个GUI框架。 为了最大限度地减少窗口到窗口的操作系统消息传递,我正在实现一个LAYOUT类 这只是一个以某种方式管理WINDOWS和其他LAYOUTS的逻辑矩形。
这是结构
class UIElement; //base class for all the stuff
class SimpleWindow:publioc UIElement; //WINAPI window that has HWND
class Layout:public UIElement{
public:
std::vector<UIElement> elements_list;
virtual void ManageElements()=0;
}
class ColumnLayout:public Layout{
void ManageElements()override;
...
在下面的jpeg中,您可以看到一般概念的可视化。 LAYOUT类具有所有子元素的“逻辑”所有权。但就windows api而言,布局中所有窗口的实际(hwnd)父级是PARENT WINDOW。
这个布局系统可以很好地调整大小并将一个布局适合另一个布局和父窗口,但是我坚持实现滚动条功能。我的想法是我应该创建一个派生类说
class LayoutScrollable:public Layout
并在其右侧创建一个自定义滚动条窗口控件(很容易做到),并将其余的布局复杂内容放在左侧,将滚动条状态的更改引导到子窗口位置和CLIP AWAY所有内容在布局之外;
我的第一次尝试是在WM_NCPAINT回调中执行此剪辑。但是虽然剪切区域变得隐藏,但它仍然会获取所有鼠标消息并阻止鼠标通过底层窗口。
也许我应该回应WM_NCCALCSIZE,我现在就试试吧。但也许有人知道其他不错的方式吗?