Изменить размеры листера

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Изменить размеры листера

Сообщение Maximus »

Возникла необходимость сохранять и восстанавливать размеры листера. Собственно в этом и вопрос.
Есть неверное какое-то сообщение из разряда WM_, но роясь в winuser.h я ничего с похожим названием не нашел.
Спасибо
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Это не сообщение, это процедура, точно не скажу по памяти, но вроде MaximizeWindow/RestoreWindow... короче, ищи в процедурах.
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

2D1P
То о чем ты говоришь это наверное параметры функции ShowWindow.
Но мне это не помогает.
Может я не совсем правильно описал суть вопроса.
Мне нужно при закрытии плагина сохранить его позицию (координаты верхнего левого угла, высоту, ширину), а потом когда плагин снова запустят восстановить эту самую позицию.
Просто так я доступ к его свойствам получить не могу, ибо я его не создавал, но у меня есть его хендл и собственно ему и надо послать какую-то команду дабы он изменил свою позицию.
Может есть и другое решение, но я даже не знаю в какую сторону рыть.
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

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

в общем, копай в MSDN, там это точно есть.. но где - склероз не даёт вспомнить.
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Вот, посмотрел: копай в сторону процедур setwindowpos/getwindowpos
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

Щас будем копать, спасибо.

И тут по ходу еще одна смешная проблема возникла:
На форме есть контрол со свойством alClient, листер себе открывается, максимизируется (ну т.е. на экране выглядит таковым), а когда в программе пытаешся получить допустим высоту оного контрола - получаешь его высоту так, как будто бы он находится в нормальном состоянии (wsNormal). Специально делат принт-скрины и проверял :)
Може кто-нить и с этим поможет.

Подлый этот листер :))
Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение Parcan »

Maximus

да с листером боротся приходится :)

я сделал так (думая разберешся)

СОХРАНЕНИЕ РАЗМЕРОВ
void __stdcall ListCloseWindow(HWND ListWin)
{
//какойто код
//esli ispol'zuetsya opciya zapominat' razmer okna
//tut sohranim razmer okna
if ((!QuickView) && (SaveWindowSize))
{
//fayl nastroek ArchView.ini
MIniFile fINI;
RECT rcClient;
fINI.SetFile(gp->pIniFile);
//sohranim razmeri
hParentWnd = ::GetParent(ListWin);
::GetWindowRect(hParentWnd, &rcClient);
LeftPos = rcClient.left;
TopPos = rcClient.top;
Width = gp->OriginalWidth;
Height = gp->OriginalHeight;
fINI.WriteKey(gp->sSettings.SectionsINI.SectWindow, "WidthWindow", rcClient.right - rcClient.left);
fINI.WriteKey(gp->sSettings.SectionsINI.SectWindow, "HeightWindow", rcClient.bottom - rcClient.top);
}
//какойто код
//esli ispol'zuetsya opciya zapominat' razmer okna
//tut vosstanovim stariy razmer okna listera
if ((!QuickView) && (SaveWindowSize))
{
//vosstanovim razmeri
::SetWindowPos(hParentWnd, HWND_TOP,
LeftPos, TopPos, Width, Height, SWP_DRAWFRAME);
}
//какойто код
}

ВОССТАНОВЛЕНИЕ РАЗМЕРОВ
HWND __stdcall ListLoad(HWND ParentWin,char* FileToLoad,int ShowFlags)
{
//какойто код
//dlya zapuska cherez F3 vozmojno nado ustanovit' razmer
if ((!gp->TypeQuickView) &&
(gp->sSettings.sSettingsWindow.SaveWindowSize))
{
//sohranim razmeri (чтобы восстановить после закрытия плагина, может нажали 4 и будет открыт другой плагин)
::GetWindowRect(ParentWin, &rcClient);
gp->OriginalWidth = rcClient.right - rcClient.left;
gp->OriginalHeight = rcClient.bottom - rcClient.top;
//proverim nashi razmeri
if (!gp->sSettings.sSettingsWindow.WidthWindow)
gp->sSettings.sSettingsWindow.WidthWindow = gp->OriginalWidth;
if (!gp->sSettings.sSettingsWindow.HeightWindow)
gp->sSettings.sSettingsWindow.HeightWindow = gp->OriginalHeight;
//ustanovim novie razmeri
::SetWindowPos(ParentWin, HWND_TOP,
rcClient.left, rcClient.top,
gp->sSettings.sSettingsWindow.WidthWindow,
gp->sSettings.sSettingsWindow.HeightWindow,
SWP_DRAWFRAME);
}
//какойто код
}

пример этой работы можешь увидеть в листер плагине ArchView
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

Большое блин спасибо, уже начало помогать
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

В дополнение:
Если листеру сказать чтобы он сделал свое состояние максимизированным вместо запомненного нормального или наоборот, то он это ни в какую делать не хочет. Если вставить этот код в событие OnShow формы. Но если положить таймер и поставить ему Интервал 0.5 сек (не меньше) и вкинуть код в событие OnTimer (тут же Таймер и запрещаем), то все будет ОК (ну или почти ОК). Правда, если у юзверя выставлена анимация при сворачивании-разворачивании окон, то возможно будет немного напрягать. Но зато для своего плага можно сделать настройки независимые от настроек Листера.
Та же ситуация и с изменением заколовка окна. Борется там же.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

Как получить Fullscreen режим?
Пытался

Код: Выделить всё

SetWindowLong(GetParent(ListWin), GWL_EXSTYLE, GetWindowLong(ListWin, GWL_EXSTYLE) | WS_EX_TOPMOST);
SetWindowPos(GetParent(ListWin), HWND_TOPMOST,0,0,XScreenResolution,YScreenResolution,SWP_SHOWWINDOW);
и

Код: Выделить всё

SetParent(ListWin,GetDesktopWindow());
В первом случае мешает заголовок окна листера и рамка.Причем заголовок хоть за верхний край экрана можно увести(да и то вопрос как это будет выглядеть при включенных стилях XP), а вот рамка-никуда.
А во втором - отваливаются все хоткеи.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Worros писал(а):Как получить Fullscreen режим?
Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

VadiMGP писал(а):Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER
Ага, сделал, спасибо.
А как теперь заставить листер перерисовать меню при выходе из полноэкранного?
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

А что, оно совсем не рисуется или как-то покорежено?
Вообще-то отрисовка меню - это системная функция, Листер тут как бы не при делах.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

VadiMGP писал(а):А что, оно совсем не рисуется или как-то покорежено?
Вообще-то отрисовка меню - это системная функция, Листер тут как бы не при делах.
Вообще не рисуется.
вхожу в полноэкранный

Код: Выделить всё

SetWindowLong(GetParent(ListWin), GWL_STYLE, GetWindowLong(ListWin, GWL_STYLE) ^ WS_BORDER ^ WS_CAPTION	);

SetWindowLong(GetParent(ListWin), GWL_EXSTYLE, GetWindowLong(ListWin, GWL_EXSTYLE) ^ WS_EX_TOPMOST );
		
SetWindowPos(GetParent(ListWin), HWND_TOPMOST,0,0,1280,1024,SWP_SHOWWINDOW);
выхожу из полноэкранного

Код: Выделить всё

SetWindowLong(GetParent(ListWin), GWL_STYLE, GetWindowLong(ListWin, GWL_STYLE) | WS_BORDER | WS_CAPTION	);

SetWindowLong(GetParent(ListWin), GWL_EXSTYLE, GetWindowLong(ListWin, GWL_EXSTYLE) ^ WS_EX_TOPMOST );

SetWindowPos(GetParent(ListWin), HWND_TOP ,30,30,1200,924,SWP_SHOWWINDOW);
Заголовок окна появляется, а меню - нет.
И бордер кстати все еще заметен. Может быть я xorю неправомерно?
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Worros писал(а):Вообще не рисуется.
Может быть винда сама посчитала, что раз у окна нет заголовка, то ему и меню не полагается и выкинула его?
Попробуй перед уходом в полноэкранный сохранить хэндл от меню - GetMenu(), а после возврата восстановить его через SetMenu().
Ответить