小编Kap*_*ade的帖子

对于复杂的窗口形状,GDI SetWindowRgn非常慢

我们的应用程序SetWindowRgn()在其OnPaint()功能中使用API 创建自定义形状的叠加窗口.该区域窗口仅具有客户区域.它还有一个所有者窗口,这是一个普通的矩形窗口.

我们观察到,如果区域的形状很复杂,例如,如果窗口区域是文本或复杂设计,则有时SetWindowRgn()调用OnPaint()需要很长时间才能返回.即使是此区域窗口下方的窗口也会缓慢呈现.这主要发生在调整视图大小时.我们发现OnNcCalcSize()从内部调用SetWindowRgn()并且默认处理OnNcCalcSize()需要很长时间才能返回.此外,在某些机器上,区域窗口下方的窗口绘画非常慢.

为什么复杂形状的区域窗口渲染会变慢?我们可以通过自定义处理类似事件OnNcCalcSize()或其他事件来加快速度吗?

注意:请不要建议使用分层窗口,因为技术限制迫使我们使用区域窗口.

windows user-interface mfc gdi window

5
推荐指数
0
解决办法
178
查看次数

是否可以使用NULL检查制作通用C++函数指针包装器?

我必须包含几个可以具有NULL值的函数指针.我正在尝试为此创建一个通用类模板,它检查函数指针是否为NULL,如果指针不为NULL则调用原始函数,如果指针为NULL则返回默认值.像这样的东西:

//Function typedefs
typedef void(*foo)();
typedef int(*bar)(int u, char *);

//Function pointers
foo gfFoo;
bar gfBar;

//Wrapper class
template<typename T,  typename... Args>
class WrapFuncObj {
    T* f;
public:
    WrapFuncObj(T* t) {
        f = t;
    }
    typename std::result_of<T(Args...)>::type operator()(Args&&... args) {
        if(f != nullptr){
            return (*f)(std::forward<Args>(args)...);
        }
        else
        {
            return 0; //RETURN something for non-void types
        }
    }
};

template<typename T,  typename... Args>
class WrapFuncObjVoid {
    T* f;
public:
    WrapFuncObjVoid(T* t) {
        f = t;
    }
    typename std::result_of<T(Args...)>::type operator()(Args&&... args) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates function wrapper generic-programming

1
推荐指数
1
解决办法
643
查看次数