View previous topic :: View next topic |
Author |
Message |
Maximus
Joined: 07 Apr 2005 Posts: 927 Location: Украина, Кировоградская обл., г. Знаменка
|
(Separately) Posted: Thu Aug 04, 2005 09:58 Post subject: Изменить размеры листера |
|
|
Возникла необходимость сохранять и восстанавливать размеры листера. Собственно в этом и вопрос.
Есть неверное какое-то сообщение из разряда WM_, но роясь в winuser.h я ничего с похожим названием не нашел.
Спасибо |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Thu Aug 04, 2005 10:29 Post subject: |
|
|
Это не сообщение, это процедура, точно не скажу по памяти, но вроде MaximizeWindow/RestoreWindow... короче, ищи в процедурах. |
|
Back to top |
|
|
Maximus
Joined: 07 Apr 2005 Posts: 927 Location: Украина, Кировоградская обл., г. Знаменка
|
(Separately) Posted: Thu Aug 04, 2005 12:07 Post subject: |
|
|
2D1P
То о чем ты говоришь это наверное параметры функции ShowWindow.
Но мне это не помогает.
Может я не совсем правильно описал суть вопроса.
Мне нужно при закрытии плагина сохранить его позицию (координаты верхнего левого угла, высоту, ширину), а потом когда плагин снова запустят восстановить эту самую позицию.
Просто так я доступ к его свойствам получить не могу, ибо я его не создавал, но у меня есть его хендл и собственно ему и надо послать какую-то команду дабы он изменил свою позицию.
Может есть и другое решение, но я даже не знаю в какую сторону рыть. |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Thu Aug 04, 2005 12:54 Post subject: |
|
|
Я точно помню, что получал позицию и размеры окна. Но не помню как, под рукой нет ни исходников, ни доков. И я точно помню, что мог изменять размеры и позицию окна.
в общем, копай в MSDN, там это точно есть.. но где - склероз не даёт вспомнить. |
|
Back to top |
|
|
D1P
Joined: 20 Dec 2004 Posts: 2973 Location: Тбилиси
|
(Separately) Posted: Thu Aug 04, 2005 16:25 Post subject: |
|
|
Вот, посмотрел: копай в сторону процедур setwindowpos/getwindowpos |
|
Back to top |
|
|
Maximus
Joined: 07 Apr 2005 Posts: 927 Location: Украина, Кировоградская обл., г. Знаменка
|
(Separately) Posted: Fri Aug 05, 2005 08:58 Post subject: |
|
|
Щас будем копать, спасибо.
И тут по ходу еще одна смешная проблема возникла:
На форме есть контрол со свойством alClient, листер себе открывается, максимизируется (ну т.е. на экране выглядит таковым), а когда в программе пытаешся получить допустим высоту оного контрола - получаешь его высоту так, как будто бы он находится в нормальном состоянии (wsNormal). Специально делат принт-скрины и проверял :)
Може кто-нить и с этим поможет.
Подлый этот листер :)) |
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 399 Location: Russian
|
(Separately) Posted: Fri Aug 05, 2005 09:22 Post subject: |
|
|
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 |
|
Back to top |
|
|
Maximus
Joined: 07 Apr 2005 Posts: 927 Location: Украина, Кировоградская обл., г. Знаменка
|
(Separately) Posted: Fri Aug 05, 2005 11:17 Post subject: |
|
|
Большое блин спасибо, уже начало помогать |
|
Back to top |
|
|
Maximus
Joined: 07 Apr 2005 Posts: 927 Location: Украина, Кировоградская обл., г. Знаменка
|
(Separately) Posted: Tue Dec 13, 2005 12:22 Post subject: |
|
|
В дополнение:
Если листеру сказать чтобы он сделал свое состояние максимизированным вместо запомненного нормального или наоборот, то он это ни в какую делать не хочет. Если вставить этот код в событие OnShow формы. Но если положить таймер и поставить ему Интервал 0.5 сек (не меньше) и вкинуть код в событие OnTimer (тут же Таймер и запрещаем), то все будет ОК (ну или почти ОК). Правда, если у юзверя выставлена анимация при сворачивании-разворачивании окон, то возможно будет немного напрягать. Но зато для своего плага можно сделать настройки независимые от настроек Листера.
Та же ситуация и с изменением заколовка окна. Борется там же. |
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Wed Jan 14, 2009 17:50 Post subject: |
|
|
Как получить 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 |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Wed Jan 14, 2009 22:32 Post subject: |
|
|
Worros wrote: | Как получить Fullscreen режим? |
Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER |
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Wed Jan 14, 2009 23:30 Post subject: |
|
|
VadiMGP wrote: | Topmost тут ни при чем. Чтобы убрать заголовок окна надо у него убрать стили WS_CAPTION и WS_BORDER |
Ага, сделал, спасибо.
А как теперь заставить листер перерисовать меню при выходе из полноэкранного? |
|
Back to top |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Wed Jan 14, 2009 23:39 Post subject: |
|
|
А что, оно совсем не рисуется или как-то покорежено?
Вообще-то отрисовка меню - это системная функция, Листер тут как бы не при делах. |
|
Back to top |
|
|
Worros
Joined: 19 Jan 2007 Posts: 1123
|
(Separately) Posted: Wed Jan 14, 2009 23:54 Post subject: |
|
|
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 |
|
|
VadiMGP
Joined: 21 Mar 2007 Posts: 1625
|
(Separately) Posted: Thu Jan 15, 2009 00:03 Post subject: |
|
|
Worros wrote: | Вообще не рисуется. | Может быть винда сама посчитала, что раз у окна нет заголовка, то ему и меню не полагается и выкинула его?
Попробуй перед уходом в полноэкранный сохранить хэндл от меню - GetMenu(), а после возврата восстановить его через SetMenu(). |
|
Back to top |
|
|
|
|
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
|