【问题标题】:Create resizable window with fixed top coordinate创建具有固定顶部坐标的可调整大小的窗口
【发布时间】:2016-04-06 15:27:56
【问题描述】:

我想实现一个顶部坐标始终为 X 的窗口(为简单起见,假设为 0)。意思是,窗口的顶部固定在屏幕顶部的 0 上。

我已经实现了窗口,使用SetWindowPos 设置它的位置,但我正在努力维持它的顶部坐标值。

【问题讨论】:

  • 这是子窗口吗?如果你展示你已经做过的事情会更容易理解。
  • 只是一个简单的 exe,使用CreateWindowEx 创建一个窗口。窗口创建涉及到很多实用程序类,因此很难发布所有相关代码。我希望寻找一种简单的方法来操纵现有的HWND 来实现这一目标。
  • 您的意思是您不希望用户能够移动窗口? (这需要删除标题并实现自定义调整大小) - 或者您是否正在寻找SetWindowPos(hwnd, 0, 0, 0, width, height, SWP_NOMOVE),它将调整窗口大小但不会更改左上角的值。
  • 我希望用户能够调整窗口大小,但顶部必须位于同一坐标。左侧、右侧和底部可能会移动
  • this 你在找什么吗?

标签: c++ winapi window hwnd


【解决方案1】:

例如,您可以创建一个没有标题栏的窗口

CreateWindow(className, title, WS_THICKFRAME | WS_POPUP, ...)

然后覆盖WM_NCHITTEST 以更改上下移动窗口的请求。

如果窗口有标题栏,例如:

CreateWindow(className, title, WS_OVERLAPPEDWINDOW, ...)

然后为 WM_WINDOWPOSCHANGING 添加覆盖:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {

    case WM_NCHITTEST:
    {
        LRESULT lresult = DefWindowProc(hwnd, msg, wParam, lParam);
        switch (lresult)
        {
        case HTTOP:      lresult = HTCLIENT; break;
        case HTTOPLEFT:  lresult = HTLEFT;   break;
        case HTTOPRIGHT: lresult = HTRIGHT;  break;
        }
        return lresult;
    }

    case WM_WINDOWPOSCHANGING:
    {
        WINDOWPOS* wndpos = (WINDOWPOS*)lParam;
        wndpos->y = 100;//choose a fixed position
        break;
    }

    ...
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多