Есть код.
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"?
Например вот так:
#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 ]
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Мне нужно написать программу которая переводит строку в числоНапример: вводится строка "1234" на выход получаем число 1234, все было бы проще...
std::weak_ptr может быть создан из std::shared_ptr, но у меня такой вопросweak_ptr может вернуть информацию про умный указатель, точнее висячий он или нет
Что правильнее передавать как аргумент функции(например в конструктор), если там эта строка будет просто скопирована?