Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Изменить размеры листера
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Thu Aug 04, 2005 09:58    Post subject: Изменить размеры листера Reply with quote

Возникла необходимость сохранять и восстанавливать размеры листера. Собственно в этом и вопрос.
Есть неверное какое-то сообщение из разряда WM_, но роясь в winuser.h я ничего с похожим названием не нашел.
Спасибо
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Thu Aug 04, 2005 10:29    Post subject: Reply with quote

Это не сообщение, это процедура, точно не скажу по памяти, но вроде MaximizeWindow/RestoreWindow... короче, ищи в процедурах.
Back to top
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Thu Aug 04, 2005 12:07    Post subject: Reply with quote

2D1P
То о чем ты говоришь это наверное параметры функции ShowWindow.
Но мне это не помогает.
Может я не совсем правильно описал суть вопроса.
Мне нужно при закрытии плагина сохранить его позицию (координаты верхнего левого угла, высоту, ширину), а потом когда плагин снова запустят восстановить эту самую позицию.
Просто так я доступ к его свойствам получить не могу, ибо я его не создавал, но у меня есть его хендл и собственно ему и надо послать какую-то команду дабы он изменил свою позицию.
Может есть и другое решение, но я даже не знаю в какую сторону рыть.
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Thu Aug 04, 2005 12:54    Post subject: Reply with quote

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

в общем, копай в MSDN, там это точно есть.. но где - склероз не даёт вспомнить.
Back to top
View user's profile Send private message
D1P



Joined: 20 Dec 2004
Posts: 2973
Location: Тбилиси

Post (Separately) Posted: Thu Aug 04, 2005 16:25    Post subject: Reply with quote

Вот, посмотрел: копай в сторону процедур setwindowpos/getwindowpos
Back to top
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Fri Aug 05, 2005 08:58    Post subject: Reply with quote

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

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

Подлый этот листер :))
Back to top
View user's profile Send private message
Parcan



Joined: 15 Dec 2004
Posts: 398
Location: Russian

Post (Separately) Posted: Fri Aug 05, 2005 09:22    Post subject: Reply with quote

Maximus

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

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

СОХРАНЕНИЕ РАЗМЕРОВ
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
Back to top
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Fri Aug 05, 2005 11:17    Post subject: Reply with quote

Большое блин спасибо, уже начало помогать
Back to top
View user's profile Send private message
Maximus



Joined: 07 Apr 2005
Posts: 927
Location: Украина, Кировоградская обл., г. Знаменка

Post (Separately) Posted: Tue Dec 13, 2005 12:22    Post subject: Reply with quote

В дополнение:
Если листеру сказать чтобы он сделал свое состояние максимизированным вместо запомненного нормального или наоборот, то он это ни в какую делать не хочет. Если вставить этот код в событие OnShow формы. Но если положить таймер и поставить ему Интервал 0.5 сек (не меньше) и вкинуть код в событие OnTimer (тут же Таймер и запрещаем), то все будет ОК (ну или почти ОК). Правда, если у юзверя выставлена анимация при сворачивании-разворачивании окон, то возможно будет немного напрягать. Но зато для своего плага можно сделать настройки независимые от настроек Листера.
Та же ситуация и с изменением заколовка окна. Борется там же.
Back to top
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Wed Jan 14, 2009 17:50    Post subject: Reply with quote

Как получить Fullscreen режим?
Пытался
Code:
SetWindowLong(GetParent(ListWin), GWL_EXSTYLE, GetWindowLong(ListWin, GWL_EXSTYLE) | WS_EX_TOPMOST);
SetWindowPos(GetParent(ListWin), HWND_TOPMOST,0,0,XScreenResolution,YScreenResolution,SWP_SHOWWINDOW);

и
Code:
SetParent(ListWin,GetDesktopWindow());

В первом случае мешает заголовок окна листера и рамка.Причем заголовок хоть за верхний край экрана можно увести(да и то вопрос как это будет выглядеть при включенных стилях XP), а вот рамка-никуда.
А во втором - отваливаются все хоткеи.
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Wed Jan 14, 2009 22:32    Post subject: Reply with quote

Worros wrote:
Как получить Fullscreen режим?

Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER
Back to top
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Wed Jan 14, 2009 23:30    Post subject: Reply with quote

VadiMGP wrote:
Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER

Ага, сделал, спасибо.
А как теперь заставить листер перерисовать меню при выходе из полноэкранного?
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Wed Jan 14, 2009 23:39    Post subject: Reply with quote

А что, оно совсем не рисуется или как-то покорежено?
Вообще-то отрисовка меню - это системная функция, Листер тут как бы не при делах.
Back to top
View user's profile Send private message
Worros



Joined: 19 Jan 2007
Posts: 1123

Post (Separately) Posted: Wed Jan 14, 2009 23:54    Post subject: Reply with quote

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

Вообще не рисуется.
вхожу в полноэкранный
Code:
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);


выхожу из полноэкранного
Code:
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ю неправомерно?
Back to top
View user's profile Send private message
VadiMGP



Joined: 21 Mar 2007
Posts: 1625

Post (Separately) Posted: Thu Jan 15, 2009 00:03    Post subject: Reply with quote

Worros wrote:
Вообще не рисуется.
Может быть винда сама посчитала, что раз у окна нет заголовка, то ему и меню не полагается и выкинула его?
Попробуй перед уходом в полноэкранный сохранить хэндл от меню - GetMenu(), а после возврата восстановить его через SetMenu().
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group