C++ 如何设置按钮控制';在Win32 API中的位置正好位于窗口的中间位置

C++ 如何设置按钮控制';在Win32 API中的位置正好位于窗口的中间位置,c++,winapi,C++,Winapi,我目前是Win32 API的noob,正在学习它。我想知道如何将按钮控件的位置设置在主窗口的中间。 我只是在WndProc函数的WM_CREATE消息中创建了一个简单的按钮,如下所示:- HWND hBtn; hBtn = CreateWindow ( L"Button", L"Hello", WS_VISIBLE | WS_CHILD, 0, 0, 125, 50, hWnd, NULL, NULL, NULL );

我目前是Win32 API的noob,正在学习它。我想知道如何将按钮控件的位置设置在主窗口的中间。

我只是在
WndProc
函数的
WM_CREATE
消息中创建了一个简单的按钮,如下所示:-

HWND hBtn;

hBtn = CreateWindow
(
    L"Button", L"Hello",
    WS_VISIBLE | WS_CHILD,
    0, 0, 125, 50,
    hWnd, NULL, NULL, NULL
);
请注意,
hBtn
是全局定义的

我只是对按钮控件进行子类化,以便在鼠标悬停时获得手光标。这很简单

SetWindowSubclass (hBtn, ButtonSubclass, NULL, NULL);

最后,当窗口被调整大小时,只希望按钮正好在屏幕的中间。

< P>你需要设置按钮的左和顶部位置,因为父窗口的大小除以两个除以按钮的大小除以2。然后每次调整窗口大小时重新绘制并重新计算。

您需要将按钮的左侧和顶部位置设置为父窗口大小除以2减去按钮大小除以2。然后在每次调整窗口大小时重新绘制并重新计算。

您只需重新计算父窗口中按钮的位置即可将其居中:

case WM_CREATE:
    hBtn = CreateWindow
    (
        L"Button", L"Hello",
        WS_VISIBLE | WS_CHILD,
        0, 0, 125, 50,
        hWnd, NULL, NULL, NULL
    );
    break;
case WM_SIZE:
{
    UINT width = LOWORD(lParam);
    UINT height = HIWORD(lParam);
    RECT rc = {};
    GetClientRect(hBtn,&rc);
    int x = (int)(width - (rc.right - rc.left)) / 2;
    int y = (int)(height - (rc.bottom - rc.top)) / 2;
    MoveWindow(hBtn, x, y, rc.right - rc.left, rc.bottom - rc.top, 1);
}
break;

只需重新计算父窗口中按钮的位置即可将其居中:

case WM_CREATE:
    hBtn = CreateWindow
    (
        L"Button", L"Hello",
        WS_VISIBLE | WS_CHILD,
        0, 0, 125, 50,
        hWnd, NULL, NULL, NULL
    );
    break;
case WM_SIZE:
{
    UINT width = LOWORD(lParam);
    UINT height = HIWORD(lParam);
    RECT rc = {};
    GetClientRect(hBtn,&rc);
    int x = (int)(width - (rc.right - rc.left)) / 2;
    int y = (int)(height - (rc.bottom - rc.top)) / 2;
    MoveWindow(hBtn, x, y, rc.right - rc.left, rc.bottom - rc.top, 1);
}
break;

嗨,@Hitarth Padaliya,这能回答你的问题吗?如果你有任何问题,请随时与我联系,如果这真的对你有帮助,也请随时回答这个问题。是的,它确实对我有用。但我使用了一种简单的方法,使用了
LOWORD()
HIWORD()
。它几乎减少了从窗口大小减少空间的逻辑,并根据需要为客户机提供rect。谢谢你的回答。这对我帮助很大。嗨,@Hitarth Padaliya,这回答了你的问题吗?如果你有任何问题,请随时与我联系,如果这真的对你有帮助,也请随时回答这个问题。是的,它确实对我有用。但我使用了一种简单的方法,使用了
LOWORD()
HIWORD()
。它几乎减少了从窗口大小减少空间的逻辑,并根据需要为客户机提供rect。谢谢你的回答。这对我帮助很大。