IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Не восстанавливается рамка окна, WinAPI
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


По моему замыслу окно должно раскрываться на весь экран по альт+ентер, оно раскрывается, но обратно схлопывается при повторном нажатии альт+ентер неправильно.

uses
Windows, Messages;

var
C: TWndClass;
H: hWnd;
A: THandle;
M: TMsg;

const acc: array [0 .. 2] of word = (fVirtKey or fAlt, vk_Return, 1);

function WP(H: hWnd; M: uInt; W: wParam; L: lParam): longint; stdcall;
begin
Result := 0;
case M of
wm_Command: begin
case LoWord(W) of
1: begin
if IsZoomed(H) then begin
ShowWindow(H, sw_Restore);
SetWindowLong(H, gwl_Style, ws_OverlappedWindow or ws_Visible); вот в этом месте!!!
end else begin
SetWindowLong(H, gwl_Style, integer(ws_PopUp or ws_Visible));
ShowWindow(H, sw_ShowMaximized);
end;
end;
end;
end;
wm_Destroy: begin
PostQuitMessage(0);
Exit;
end;
end;
Result := DefWindowProc(H, M, W, L);
end;

begin
with C do begin
Style := cs_HRedraw or cs_VRedraw or cs_OwnDC;
lpfnWndProc := @WP;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := MainInstance;
hIcon := 0;
hCursor := LoadCursor(0, idc_Arrow);
hbrBackground := Color_BtnFace + 1;
lpszMenuName := nil;
lpszClassName := 'test';
end;
RegisterClass©;
A := CreateAcceleratorTable(acc, 1);
H := CreateWindow('test', 'test', ws_OverlappedWindow or ws_Visible, 100, 100, 400, 300, 0, 0, MainInstance, nil);
ShowWindow(H, cmdShow);
UpdateWindow(H);
while GetMessage(M, 0, 0, 0) do begin
if TranslateAccelerator(H, A, M) = 0 then begin
TranslateMessage(M);
DispatchMessage(M);
end;
end;
end.



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


развернулось во весь экран и без рамки, вернулось с рамкой и кнопками закрыть, развернуть.
а надо как? чтобы маленькое окно тоже было без рамки? или у большого была рамка?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> вернулось с рамкой и кнопками закрыть, развернуть.

Блин, почему тогда у меня вернулось без рамки...

Добавлено через 2 мин.
А, оно только рисуется без рамки, а если его свернуть-развернуть, то рамка появляется.
Короче, надо какую-то перерисовку добавить походу.
Посылка wm_Paint не помогла, UpdateWindow не помогает, что такое...


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Используй RedrawWindow для перерисовки окна. Обязательно в последнем параметре укажи RDW_FRAME...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Обязательно в последнем параметре укажи RDW_FRAME...

А во втором и третьем?
Ну в первом я указал H, а вот дальше...
nil и 0 не прокатывают.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


h,0,0,RDW_FRAME
отработало
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






RedrawWindow(H, nil, 0, RDW_FRAME or RDW_INVALIDATE);
должно восстановить рамку. Трудно вслепую советовать, я сейчас под Семеркой, тут рамка появляется сразу, без перерисовки окна...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


InvalidateRect(H, nil, False); тоже не помог...

Добавлено через 2 мин.
> h,0,0,RDW_FRAME
отработало

Ну у тебя и так работало.

> RedrawWindow(H, nil, 0, RDW_FRAME or RDW_INVALIDATE)

Нифига...

Если что, у меня классическая тема, всё выключено, кроме галочки "отображать содержимое при перетаскивании", она мне нужна для отладки интерфейса. Выключение галочки не помогло.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






SetWindowPos(H, 0, 0, 0, 0, 0,
SWP_FRAMECHANGED or SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE);
после смены стиля - тоже не помогает? SWP_FRAMECHANGED как бы должно намекнуть системе, что надо перерисовать заголовок...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


О, а вот через SetWindowPos заработало.
Проверю дома заодно. Просто прикол из 1го поста проявился на двух хрюшах, настроенных одинаково. Только у одной сервис-пак второй, у другой третий.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.04.2024 7:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name