Как изменить размер статик поля

227
16 ноября 2019, 20:30

Есть код.

hWnd = CreateWindowEx(WS_EX_TOPMOST, "PBP", str, WS_OVERLAPPED, 0, 0, 50, 50, NULL, NULL, wc.hInstance, NULL);
hLogo = CreateWindowW(L"Static", NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 0, 0, 0, 0, hWnd, NULL, NULL, NULL);

Как можно изменить высоту и ширинру статик поля? Сейчас он 0 в высоту и 0 в ширину. Но дальше по коду мне нужно изменить высоту на 50 и ширину на 50. Если я использую команду

SetWindowPos(hLogo, NULL, 0, 0, 50, 50, NULL);

или

MoveWindow(hLogo, 0, 0, 50, 50, true);

то он установит не правильный размер, так как будет учитывать размер TitleBar'а.

Какой функцией я могу правильно изменить размер "Static"?

Answer 1

Например вот так:

#include <Windows.h>
#include <memory>
LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    if (msg == WM_DESTROY) {
        ::PostQuitMessage(0);
        return 0;
    }
    return ::DefWindowProcW(hwnd, msg, wparam, lparam);
}
int main(int argc, char *argv[])
{
    WNDCLASSEX wc;
    ::std::memset(&wc, 0, sizeof WNDCLASSEX);
    wc.cbSize = sizeof WNDCLASSEX;
    wc.lpszClassName = L"MyWndClass";
    wc.lpszMenuName = nullptr;
    wc.hCursor = ::LoadCursor(nullptr, IDC_ARROW);
    wc.hInstance = ::GetModuleHandle(nullptr);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hIcon = ::LoadIconW(nullptr, IDI_APPLICATION);
    wc.hIconSm = ::LoadIconW(nullptr, IDI_APPLICATION);
    wc.hbrBackground = HBRUSH(::GetStockObject(BLACK_BRUSH));
    wc.lpfnWndProc = wnd_proc;
    if (!::RegisterClassExW(&wc)) {
        return EXIT_FAILURE;
    }
    LONG styles = WS_OVERLAPPED | WS_BORDER | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION;
    HWND window_handle = ::CreateWindowExW(WS_EX_TOPMOST, wc.lpszClassName, L"Some Window", styles, 100, 100, 100, 100, HWND_DESKTOP, nullptr, wc.hInstance, nullptr);
    if (!window_handle) {
        ::UnregisterClass(wc.lpszClassName, wc.hInstance);
        return EXIT_FAILURE;
    }
    const int desktop_size_w = ::GetSystemMetrics(SM_CXSCREEN);
    const int desktop_size_h = ::GetSystemMetrics(SM_CYSCREEN);
    RECT calculate_rect{ 0, 0, 500, 500 };
    ::printf_s("::AdjustWindowRect: %s\n", ::AdjustWindowRect(&calculate_rect, styles, FALSE) == TRUE ? "true" : "false");
    ::printf_s("%d x %d\n", calculate_rect.right - calculate_rect.left, calculate_rect.bottom - calculate_rect.top);
    ::ShowWindow(window_handle, SW_NORMAL);
    ::UpdateWindow(window_handle);
    const int window_w = calculate_rect.right - calculate_rect.left;
    const int window_h = calculate_rect.bottom - calculate_rect.top;
    ::SetWindowPos(window_handle, nullptr, desktop_size_w / 2 - window_w / 2, desktop_size_h / 2 - window_h / 2, window_w, window_h, 0);
    RECT client_rect{ 0 };
    ::GetClientRect(window_handle, &client_rect);
    ::printf_s("client rect: [ %dx%d ]\n", client_rect.right - client_rect.left, client_rect.bottom - client_rect.top);
    MSG msg{ 0 };
    while (::GetMessageW(&msg, nullptr, 0, 0)) {
        ::TranslateMessage(&msg);
        ::DispatchMessageW(&msg);
    }
    return msg.wParam;
}

Результат:

::AdjustWindowRect: true
516 x 539
client rect: [ 500x500 ]
READ ALSO
Перевести строку в число не использую стандартные функции [закрыт]

Перевести строку в число не использую стандартные функции [закрыт]

Мне нужно написать программу которая переводит строку в числоНапример: вводится строка "1234" на выход получаем число 1234, все было бы проще...

128
Область применения std::weak_ptr

Область применения std::weak_ptr

std::weak_ptr может быть создан из std::shared_ptr, но у меня такой вопросweak_ptr может вернуть информацию про умный указатель, точнее висячий он или нет

127
Форматированный вывод в консоль C++

Форматированный вывод в консоль C++

Имеется массив структур device следующего вида:

161
std::string vs const std::string&amp; vs std::string_view

std::string vs const std::string& vs std::string_view

Что правильнее передавать как аргумент функции(например в конструктор), если там эта строка будет просто скопирована?

143