Winapi: удаление украшения

Это похоже на дубликат, но сначала услышь меня. Это больше на стороне отладки.
Я пытаюсь удалить границы моего окна, используя метод Вот.

Что может заставить эти функции не работать? Скрытие окон с помощью ShowWindow(Handle, SW_HIDE) тоже не работает Я создал свой собственный класс Window со многими функциями, поэтому я не хочу вставлять сюда весь свой код.

Вот моя функция инициализации для окна:

HRESULT SampleWindow::InitializeSimple(SampleWindow* win)
{
HRESULT         hr;
HWND            hWnd;
SampleWindow*   sampleWin;

sampleWin = new SampleWindow();

aMWindowProps->Center();
hWnd = CreateWindowEx(
NULL,
aMWindowProps->aWindowClass,
aMWindowProps->aWindowTitle,
WS_OVERLAPPEDWINDOW,
aMWindowProps->aRealLeft,
aMWindowProps->aRealTop,
aMWindowProps->GetRelativePosWidth(),
aMWindowProps->GetRelativePosHeight(),
HWND_DESKTOP,
NULL,
*aMWindowProps->aHInstance,
sampleWin);

aMWindowProps->aHwnd = &hWnd;

hr = hWnd ? S_OK : E_FAIL;

win->aHwnd = &hWnd;
//ShowWindow(hWnd, SW_SHOWNORMAL);

return hr;
}

WindowProps как видите, содержит различную информацию о создаваемом окне.
у меня тоже есть HWND переменная указателя в моем классе, которая указывает на обработчик окна.

Вот некоторые вещи, которые я пробовал на своем main, где sw2 — указатель на мой класс окна:

    ShowWindow(*sw2->aHwnd, SW_SHOW);
//ShowWindow(*sw2->aHwnd, nCmdShow);
LONG lStyle = GetWindowLong(*sw2->aHwnd, GWL_STYLE);
lStyle &= WS_POPUP;
//lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
SetWindowLong(*sw2->aHwnd, GWL_STYLE, lStyle);
//ShowWindow(*sw2->aHwnd, SW_MINIMIZE);
//ShowWindow(*sw2->aHwnd, SW_HIDE);
//ShowWindow(*sw2->aHwnd, SW_HIDE);
//SetWindowLong(*sw2->aHwnd, GWL_STYLE, GetWindowLong(*sw2->aHwnd, GWL_STYLE) && ~ WS_BORDER && ~ WS_SIZEBOX && ~ WS_DLGFRAME);
SetWindowPos(*sw2->aHwnd, HWND_TOP, sw2->aMWindowProps->aRealLeft, sw2->aMWindowProps->aRealTop, sw2->aMWindowProps->aRealWidth, sw2->aMWindowProps->aRealHeight, SWP_FRAMECHANGED);
//LONG lExStyle = GetWindowLong(*sw2->aHwnd, GWL_EXSTYLE);
//lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
//SetWindowLong(*sw2->aHwnd, GWL_EXSTYLE, lExStyle);
//SetWindowPos(*sw2->aHwnd, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);

Я просто хотел бы дать несколько советов о том, где отлаживать мой код. Я знаю, что функции работают, так как я тестировал их на гораздо более простом оконном проекте (пример проекта от Microsoft).

0

Решение

Как уже отметил Джонатан Поттер в своем комментарии, ваша ошибка:

aMWindowProps->aHwnd = &hWnd;

hr = hWnd ? S_OK : E_FAIL;

win->aHwnd = &hWnd;

где HWND hWnd действителен только в рамках текущего метода. Я предполагаю, что вы определили aHwnd в вашем классе как что-то вроде:

HWND * aHwnd;

что по крайней мере не нужно. Вы, кажется, ошибаетесь, что HANDLE (HWND — ничто иное) как своего рода экземпляр / объект. Это не так, это больше похоже на указатель или ссылку. Вы всегда можете смело писать:

HWND myAttribute=hWnd;

Пока вы используете его в том же процессе. (Дескрипторы окна действительны даже через границы процесса, но никому об этом не говорят).

На самом деле я не знаю ситуации, когда вы держите указатель на дескриптор вместо самого дескриптора.

Заметьте, я явно писал об дескрипторах, поскольку HWND — это своего рода стандартные оконные дескрипторы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]