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

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

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

Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

VadiMGP писал(а):Попробуй перед уходом в полноэкранный сохранить хэндл от меню - GetMenu(), а после возврата восстановить его через SetMenu().
Помогает, но только в сочетании с WS_OVERLAPPEDWINDOW.
При WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |WS_VISIBLE меню не отображается. А от WS_OVERLAPAPDWINDOW другой побочный эффект, не перерисовывается открывшаяся по сторонам уменьшившегося окна область.
И бордер ни в какую не желает пропадать.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Ну тогда остается только залп из всех орудий. Сначала сохраняешь все стили (обычные и расширенные) и меню. Потом высекаешь заголовок и уходишь на весь экран. По возвращении восстанавливаешь все, что сохранял.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

Спасибо, попробую.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

VadiMGP писал(а):Ну тогда остается только залп из всех орудий. Сначала сохраняешь все стили (обычные и расширенные) и меню. Потом высекаешь заголовок и уходишь на весь экран. По возвращении восстанавливаешь все, что сохранял.
Сделал. Все равно меню пропадает. Более того, даже и заголовок не появляется, если

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

SetWindowLong(GetParent(ListWin), GWL_STYLE,tmp.Lister_GWL_STYLE);
SetWindowLong(GetParent(ListWin),GWL_EXSTYLE,tmp.Lister_GWL_EX_STYLE);
SetWindowPos(GetParent(ListWin),HWND_TOP,tmp.rcC.left,tmp.rcC.top,(tmp.rcC.right-tmp.rcC.left),(tmp.rcC.bottom-tmp.rcC.top), SWP_SHOWWINDOW);
SetMenu(GetParent(ListWin),tmp.hmenu);
UpdateWindow(GetParent(ListWin));			
Ну а принудительное выставление tmp.Lister_GWL_STYLE| WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |WS_VISIBLE
восстанавливает заголовок, но не меню.
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Ну тогда не знаю. Наверно надо искать принципиально другие пути. Возможно, временно у своего окна убирать стиль WS_CHILD и показывать его на весь экран. Кстати, напиши автору Imagine - он же это как-то делает, хотя тоже немного коряво.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

WS_CHILD убрать? пробовал. Сразу отвалились все хоткеи.
Их и сейчас, похоже, mplayer прихватывает, только нерегулярно как то :shock:
Автор Imagine вроде корейско-корявоанглоязычный? У меня с этим проблемы.Мой английский еще хуже. Да, кстати, коряво.
/offtop
Я только сейчас начал понимать, почему он не синхронизировал fittowindow в своем плагине с листером. Какая жуткая логика у ListSendCommand :(
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Worros писал(а):WS_CHILD убрать? пробовал. Сразу отвалились все хоткеи.
Можно попробовать вручную пересылать все WM_KEYDOWN и WM_KEYUP в окно листера.
А вообще вырисовывается главный вопрос - сколько времени/сил ты готов угрохать на то, чтобы убрать этот треклятый заголовок и рамочку? Оно того стоит?
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

VadiMGP писал(а):
Worros писал(а):WS_CHILD убрать? пробовал. Сразу отвалились все хоткеи.
Можно попробовать вручную пересылать все WM_KEYDOWN и WM_KEYUP в окно листера.
А вообще вырисовывается главный вопрос - сколько времени/сил ты готов угрохать на то, чтобы убрать этот треклятый заголовок и рамочку? Оно того стоит?
Понятно, неутешительно. Не стоит наверное. Спасибо за советы.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

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

::SetMenu(::GetParent(ListWin), NULL);
::SetWindowLong(::GetParent(ListWin), GWL_STYLE, ((::GetWindowLong((::GetParent(ListWin)), GWL_STYLE) & (~WS_OVERLAPPEDWINDOW))|WS_POPUP));
::SetWindowPos (::GetParent(ListWin), HWND_TOP,0,0,XScreenResolution,YScreenResolution,SWP_SHOWWINDOW);
В таком виде всё нормально.
Может кому ещё пригодится. Я по этим граблям несколько дней ходил.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

Отправляю из отдельного потока

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

::MoveWindow(gp->DataForThread.ListerWin,floor((FLOAT)((r1.right-gp->DataForThread.naturewidth)/2)),floor((FLOAT)((r1.bottom-gp->DataForThread.natureheight)/2)),gp->DataForThread.naturewidth,gp->DataForThread.natureheight,true);
Отслеживаю в пошаговой отладке. Одна эта строчка выполняется несколько секунд на весьма неслабом компе :shock:
В чем может быть моя ошибка?
P.S. VS2003
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

И даже такая строчка

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

MoveWindow(gp->DataForThread.ListerWin,20,20,gp->DataForThread.naturewidth,gp->DataForThread.natureheight,true);
тоже. Та же строчка выполняется мгновенно из ListLoad. Значит плавающая запятая точно не при чем, а у меня проблемы с межпоточным взаимодействием. Но что именно? Я не понимаю :shock:
VadiMGP
Сообщения: 1625
Зарегистрирован: Ср мар 21, 2007 20:58

Сообщение VadiMGP »

Worros писал(а):Отслеживаю в пошаговой отладке.
А сколько времени эта строчка выполняется без пошаговой отладки? Если задержка только в дебаггере, то плюнь. Известны заморочки дебаггера при переключении контекста потоков.
Если же она и в самом деле долго выполняется, то разбивай на более простые действия и хронометрируй их. Так и найдешь кто там такой задумчивый.

Кстати, почему ты работаешь с VS2003? По-моему это сплошное недоразумение, а не среда работы. Я через неделю снес его к чертовой матери. VS2005 меня тоже порядком разочаровал. Вот VS2008 с SP1 у меня прижился.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

VadiMGP писал(а):А сколько времени эта строчка выполняется без пошаговой отладки?
Столько же. Секунды. Я в отладку и полез потому, что тормоза заметны на глаз и сильно напрягают.
VadiMGP писал(а):Если же она и в самом деле долго выполняется, то разбивай на более простые действия и хронометрируй их. Так и найдешь кто там такой задумчивый.
Где прочитать, как это делается? Я не умею.
VadiMGP писал(а):Кстати, почему ты работаешь с VS2003? По-моему это сплошное недоразумение, а не среда работы. Я через неделю снес его к чертовой матери. VS2005 меня тоже порядком разочаровал. Вот VS2008 с SP1 у меня прижился.
IDE удобнее, чем у VC6 , и в то же время разница между ними не столь велика. Поэтому работаю над проектом в VC7.1, а выкладываемые паблик релизы компилирую в шестерке (код компактнее).
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

У меня есть кое-какие подозрения.
Вот такой кусок кода не имеет отношения к делу?

В отдельном потоке

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

MoveWindow(gp->DataForThread.ListerWin,20,20,gp->DataForThread.naturewidth,gp->DataForThread.natureheight,true);
SetEvent(hEventParsingThreadReady[gp->DataForThread.iExsCounter]);
В ListLoad

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

WaitForSingleObject(hEventParsingThreadReady[gp->DataForThread.iExsCounter],10000);
Но у меня задержка не 10 сек, а примерно 5

В отладке задержка именно при отработке MoveWindow, до установки ивента.
Worros
Сообщения: 1123
Зарегистрирован: Пт янв 19, 2007 18:46

Сообщение Worros »

И еще, я припоминаю рекомендацию не посылать из потока SendMessage рабочему окну, а использовать исключительно PostMessage. Это не из этой оперы? Кажется, что-то аналогичное.
Ответить