【问题标题】:Is there a way to set minimum size without WM_GETMINMAXINFO?有没有办法在没有 WM_GETMINMAXINFO 的情况下设置最小尺寸?
【发布时间】:2015-07-13 22:40:10
【问题描述】:

我决定使用这样的基类来创建和使用窗口:

class Window
{
private:
    static LRESULT WINAPI WindowProc(HWND _hWnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam);

protected:
    virtual LRESULT onMessageNameGoesHere(/*parameters*/)
    {
        // Default handling
    };

public:
    // Other functions
};

所以所有的窗口都继承自这个类。这是WindowProc

LRESULT WINAPI Window::WindowProc(HWND _hWnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam)
{
    Window *window = (Window*)GetWindowLongPtr(_hWnd, GWLP_USERDATA);

    switch (_uMsg)
    {
    case WM_SOMEMESSAGE:
        return window->onMessageNameGoesHere();

    case WM_NCCREATE:
        SetWindowLongPtr(_hWnd, GWLP_USERDATA, LONG(LPCREATESTRUCT(_lParam)->lpCreateParams));
        return true;

    case WM_GETMINMAXINFO:
        return window->onGetMinMaxInfo((LPMINMAXINFO)_lParam);

    default:
        return DefWindowProc(_hWnd, _uMsg, _wParam, _lParam);
    }
}

WM_NCCREATE 存储了一个指向与GWLP_USERDATA 中的窗口关联的类的指针。问题是在WM_NCCREATE 之前收到WM_GETMINMAXINFO,使其崩溃。 (是的,我知道我需要一些代码来避免这种情况)

那么有没有办法在没有WM_GETMINMAXINFO 的情况下设置最小和最大窗口大小,或者可以在WM_NCCREATE 之前发送该消息?

请随时询问更多细节或更多解释。

【问题讨论】:

标签: windows class window


【解决方案1】:

我相信答案是“不”。这是 Windows OOP 模型与 C++ 阻抗不匹配的众多地方之一。

我能想到的唯一解决方案是使用 RAII 在线程本地存储中保存/恢复上下文指针(确保保存已经存在的内容以避免重入问题)并在消息处理程序后立即检索它叫做。在 Windows XP 上,您可以尝试 __declspec(thread) 或通过 TlsAlloc/TlsSetValue 显式执行此操作;在 Windows Vista 或更高版本上,您可能想使用 FlsAlloc/FlsSetValue 虽然我不确定纤维是否会在这里搞砸......

【讨论】:

  • 是的,对不起。我第一次阅读时没有得到它,但后来我得到了,然后我删除了我的评论。
  • 好吧,我的问题似乎已经解决了。我发现WM_GETMINMAXINFO 被多次发送到窗口。所以第一次发送时,我可以检查该值是否为NULL,然后忽略它。但是,如果我需要处理只发送一次的消息,我将需要使用这种方法。但请解释一下:使用您的方法和使用 static 变量有什么区别?如果您回答最后一个问题,我会接受您的回答。
  • @LHLaurini:啊。我相信没有比WM_NCCREATE 更早发送的其他消息,所以如果您第一次不处理WM_GETMINMAXINFO 就可以了,那么您将永远不需要使用此方法。但是使用普通静态变量和线程局部变量(也是静态的)之间的区别在于静态变量不是线程安全的,所以如果两个线程尝试同时创建窗口(这是不寻常的,但你永远不知道) 那么它们就会相互干扰,你的程序就会崩溃。
  • 谢谢。没有考虑到这一点。好吧,这对我的程序来说不是问题,但仍然是一个很好的做法。
猜你喜欢
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多