Страница 1 из 3

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

Добавлено: Чт авг 04, 2005 09:58
Maximus
Возникла необходимость сохранять и восстанавливать размеры листера. Собственно в этом и вопрос.
Есть неверное какое-то сообщение из разряда WM_, но роясь в winuser.h я ничего с похожим названием не нашел.
Спасибо

Добавлено: Чт авг 04, 2005 10:29
D1P
Это не сообщение, это процедура, точно не скажу по памяти, но вроде MaximizeWindow/RestoreWindow... короче, ищи в процедурах.

Добавлено: Чт авг 04, 2005 12:07
Maximus
2D1P
То о чем ты говоришь это наверное параметры функции ShowWindow.
Но мне это не помогает.
Может я не совсем правильно описал суть вопроса.
Мне нужно при закрытии плагина сохранить его позицию (координаты верхнего левого угла, высоту, ширину), а потом когда плагин снова запустят восстановить эту самую позицию.
Просто так я доступ к его свойствам получить не могу, ибо я его не создавал, но у меня есть его хендл и собственно ему и надо послать какую-то команду дабы он изменил свою позицию.
Может есть и другое решение, но я даже не знаю в какую сторону рыть.

Добавлено: Чт авг 04, 2005 12:54
D1P
Я точно помню, что получал позицию и размеры окна. Но не помню как, под рукой нет ни исходников, ни доков. И я точно помню, что мог изменять размеры и позицию окна.

в общем, копай в MSDN, там это точно есть.. но где - склероз не даёт вспомнить.

Добавлено: Чт авг 04, 2005 16:25
D1P
Вот, посмотрел: копай в сторону процедур setwindowpos/getwindowpos

Добавлено: Пт авг 05, 2005 08:58
Maximus
Щас будем копать, спасибо.

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

Подлый этот листер :))

Добавлено: Пт авг 05, 2005 09:22
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

Добавлено: Пт авг 05, 2005 11:17
Maximus
Большое блин спасибо, уже начало помогать

Добавлено: Вт дек 13, 2005 11:22
Maximus
В дополнение:
Если листеру сказать чтобы он сделал свое состояние максимизированным вместо запомненного нормального или наоборот, то он это ни в какую делать не хочет. Если вставить этот код в событие OnShow формы. Но если положить таймер и поставить ему Интервал 0.5 сек (не меньше) и вкинуть код в событие OnTimer (тут же Таймер и запрещаем), то все будет ОК (ну или почти ОК). Правда, если у юзверя выставлена анимация при сворачивании-разворачивании окон, то возможно будет немного напрягать. Но зато для своего плага можно сделать настройки независимые от настроек Листера.
Та же ситуация и с изменением заколовка окна. Борется там же.

Добавлено: Ср янв 14, 2009 16:50
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), а вот рамка-никуда.
А во втором - отваливаются все хоткеи.

Добавлено: Ср янв 14, 2009 21:32
VadiMGP
Worros писал(а):Как получить Fullscreen режим?
Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER

Добавлено: Ср янв 14, 2009 22:30
Worros
VadiMGP писал(а):Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER
Ага, сделал, спасибо.
А как теперь заставить листер перерисовать меню при выходе из полноэкранного?

Добавлено: Ср янв 14, 2009 22:39
VadiMGP
А что, оно совсем не рисуется или как-то покорежено?
Вообще-то отрисовка меню - это системная функция, Листер тут как бы не при делах.

Добавлено: Ср янв 14, 2009 22:54
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ю неправомерно?

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