Страница 2 из 3
Добавлено: Ср янв 14, 2009 23:56
Worros
VadiMGP писал(а):Попробуй перед уходом в полноэкранный сохранить хэндл от меню - GetMenu(), а после возврата восстановить его через SetMenu().
Помогает, но только в сочетании с WS_OVERLAPPEDWINDOW.
При WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |WS_VISIBLE меню не отображается. А от WS_OVERLAPAPDWINDOW другой побочный эффект, не перерисовывается открывшаяся по сторонам уменьшившегося окна область.
И бордер ни в какую не желает пропадать.
Добавлено: Чт янв 15, 2009 00:11
VadiMGP
Ну тогда остается только залп из всех орудий. Сначала сохраняешь все стили (обычные и расширенные) и меню. Потом высекаешь заголовок и уходишь на весь экран. По возвращении восстанавливаешь все, что сохранял.
Добавлено: Чт янв 15, 2009 00:13
Worros
Спасибо, попробую.
Добавлено: Пт янв 16, 2009 14:14
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
восстанавливает заголовок, но не меню.
Добавлено: Пт янв 16, 2009 14:39
VadiMGP
Ну тогда не знаю. Наверно надо искать принципиально другие пути. Возможно, временно у своего окна убирать стиль WS_CHILD и показывать его на весь экран. Кстати, напиши автору Imagine - он же это как-то делает, хотя тоже немного коряво.
Добавлено: Пт янв 16, 2009 15:16
Worros
WS_CHILD убрать? пробовал. Сразу отвалились все хоткеи.
Их и сейчас, похоже, mplayer прихватывает, только нерегулярно как то
Автор Imagine вроде корейско-корявоанглоязычный? У меня с этим проблемы.Мой английский еще хуже. Да, кстати, коряво.
/offtop
Я только сейчас начал понимать, почему он не синхронизировал fittowindow в своем плагине с листером. Какая жуткая логика у ListSendCommand

Добавлено: Пт янв 16, 2009 17:28
VadiMGP
Worros писал(а):WS_CHILD убрать? пробовал. Сразу отвалились все хоткеи.
Можно попробовать вручную пересылать все WM_KEYDOWN и WM_KEYUP в окно листера.
А вообще вырисовывается главный вопрос - сколько времени/сил ты готов угрохать на то, чтобы убрать этот треклятый заголовок и рамочку? Оно того стоит?
Добавлено: Пт янв 16, 2009 18:15
Worros
VadiMGP писал(а):Worros писал(а):WS_CHILD убрать? пробовал. Сразу отвалились все хоткеи.
Можно попробовать вручную пересылать все WM_KEYDOWN и WM_KEYUP в окно листера.
А вообще вырисовывается главный вопрос - сколько времени/сил ты готов угрохать на то, чтобы убрать этот треклятый заголовок и рамочку? Оно того стоит?
Понятно, неутешительно. Не стоит наверное. Спасибо за советы.
Добавлено: Сб фев 21, 2009 07:01
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);
В таком виде всё нормально.
Может кому ещё пригодится. Я по этим граблям несколько дней ходил.
Добавлено: Пн мар 09, 2009 01:14
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);
Отслеживаю в пошаговой отладке. Одна эта строчка выполняется несколько секунд на весьма неслабом компе
В чем может быть моя ошибка?
P.S. VS2003
Добавлено: Пн мар 09, 2009 01:55
Worros
И даже такая строчка
Код: Выделить всё
MoveWindow(gp->DataForThread.ListerWin,20,20,gp->DataForThread.naturewidth,gp->DataForThread.natureheight,true);
тоже. Та же строчка выполняется мгновенно из ListLoad. Значит плавающая запятая точно не при чем, а у меня проблемы с межпоточным взаимодействием. Но что именно? Я не понимаю

Добавлено: Пн мар 09, 2009 01:56
VadiMGP
Worros писал(а):Отслеживаю в пошаговой отладке.
А сколько времени эта строчка выполняется без пошаговой отладки? Если задержка только в дебаггере, то плюнь. Известны заморочки дебаггера при переключении контекста потоков.
Если же она и в самом деле долго выполняется, то разбивай на более простые действия и хронометрируй их. Так и найдешь кто там такой задумчивый.
Кстати, почему ты работаешь с VS2003? По-моему это сплошное недоразумение, а не среда работы. Я через неделю снес его к чертовой матери. VS2005 меня тоже порядком разочаровал. Вот VS2008 с SP1 у меня прижился.
Добавлено: Пн мар 09, 2009 02:03
Worros
VadiMGP писал(а):А сколько времени эта строчка выполняется без пошаговой отладки?
Столько же. Секунды. Я в отладку и полез потому, что тормоза заметны на глаз и сильно напрягают.
VadiMGP писал(а):Если же она и в самом деле долго выполняется, то разбивай на более простые действия и хронометрируй их. Так и найдешь кто там такой задумчивый.
Где прочитать, как это делается? Я не умею.
VadiMGP писал(а):Кстати, почему ты работаешь с VS2003? По-моему это сплошное недоразумение, а не среда работы. Я через неделю снес его к чертовой матери. VS2005 меня тоже порядком разочаровал. Вот VS2008 с SP1 у меня прижился.
IDE удобнее, чем у VC6 , и в то же время разница между ними не столь велика. Поэтому работаю над проектом в VC7.1, а выкладываемые паблик релизы компилирую в шестерке (код компактнее).
Добавлено: Пн мар 09, 2009 02:07
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, до установки ивента.
Добавлено: Пн мар 09, 2009 02:10
Worros
И еще, я припоминаю рекомендацию не посылать из потока SendMessage рабочему окну, а использовать исключительно PostMessage. Это не из этой оперы? Кажется, что-то аналогичное.