Кто запоминает размер и положение окна
От: lsv  
Дата: 10.02.11 07:08
Оценка:
Умеет ли Винда запоминать и хранить размер и положение основного окна программы? Или эти параметры надо запоминать самому?
Как вообще подобное делают? А то надо чтоб программа всегда открывалась в том же положении, как и закрыта была.
Re: Кто запоминает размер и положение окна
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 10.02.11 07:11
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Умеет ли Винда запоминать и хранить размер и положение основного окна программы? Или эти параметры надо запоминать самому?

lsv>Как вообще подобное делают? А то надо чтоб программа всегда открывалась в том же положении, как и закрыта была.

Надо "запоминать" самому — например, в обработчике WM_WINDOWPOSCHANGED.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: Кто запоминает размер и положение окна
От: Pavel Dvorkin Россия  
Дата: 10.02.11 07:15
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Умеет ли Винда запоминать и хранить размер и положение основного окна программы?


Нет. Размеры и положение окна указываются в вызове CreateWindow(Ex). Если там стоит CW_USEDEFAULT, Windows сама решает, какие будут размеры.

>Или эти параметры надо запоминать самому?


Да.

lsv>Как вообще подобное делают? А то надо чтоб программа всегда открывалась в том же положении, как и закрыта была.


Создай в реестре HKCU\Software\YourCompany\YourProduct и пиши туда при выходе из программы, читай на входе. Если не прочиталось — используй дефолтные размеры Windows или свои.
With best regards
Pavel Dvorkin
Re[2]: Кто запоминает размер и положение окна
От: lsv  
Дата: 10.02.11 07:47
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Создай в реестре HKCU\Software\YourCompany\YourProduct и пиши туда при выходе из программы, читай на входе. Если не прочиталось — используй дефолтные размеры Windows или свои.

А можно пример реализации, т.е. как запоминать, а потом читать и настраивать?
Re[3]: Кто запоминает размер и положение окна
От: Pavel Dvorkin Россия  
Дата: 10.02.11 07:55
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>А можно пример реализации, т.е. как запоминать, а потом читать и настраивать?


Примера у меня нет, писать некогда. Поищи на тему создания/чтения ключей и данных в реестре, этого добра навалом.
With best regards
Pavel Dvorkin
Re: Кто запоминает размер и положение окна
От: Malokhatko  
Дата: 10.02.11 08:59
Оценка:
Здравствуйте, lsv, Вы писали:

Собственно установить положение:
WINDOWPLACEMENT wp;

wp.length = sizeof(WINDOWPLACEMENT);
wp.ptMinPosition = theApp.ParamStore.ptMinPosition;
wp.ptMaxPosition = theApp.ParamStore.ptMaxPosition;
wp.rcNormalPosition =  theApp.ParamStore.rcNormalPosition;
wp.showCmd = 1;

SetWindowPlacement(&wp);



Еще одby момент, пользователь может "задвинуть" окно за экран, поэтому мы написали следующую функцию

void EnsureVisible(CWnd* pWnd)
{
    ASSERT( pWnd );
    if (!pWnd)
        return;

    // Если прямоугольник выходит за координаты текущего монитора, то поставить его на место
#if (WINVER < 0x0500)
#error HMONITOR requires WINVER >= 0x0500
#endif

    HMONITOR hMonitor;
    MONITORINFO mi;
    RECT rc;
    CRect r;

    pWnd->GetWindowRect(r);
    int w = r.right  - r.left;
    int h = r.bottom - r.top;
    hMonitor = MonitorFromRect(&r, MONITOR_DEFAULTTONEAREST);

    mi.cbSize = sizeof(mi);
    GetMonitorInfo(hMonitor, &mi);
    rc = mi.rcWork;
    
    r.left = max(rc.left, min(rc.right-w, r.left));
    r.top = max(rc.top, min(rc.bottom-h, r.top));
    r.right = r.left + w;
    r.bottom = r.top + h;
    //--

    pWnd->SetWindowPos(NULL, r.left, r.top, abs(r.right-r.left), abs(r.bottom-r.top), SWP_NOZORDER | SWP_SHOWWINDOW);
    pWnd->ShowWindow(SW_SHOWNORMAL);
        
    return;
}
Re[2]: Кто запоминает размер и положение окна
От: CEMb  
Дата: 10.02.11 16:17
Оценка:
Здравствуйте, Malokhatko, Вы писали:

M>Собственно установить положение:

M>
M>WINDOWPLACEMENT wp;

M>wp.length = sizeof(WINDOWPLACEMENT);
M>wp.ptMinPosition = theApp.ParamStore.ptMinPosition;
M>wp.ptMaxPosition = theApp.ParamStore.ptMaxPosition;
M>wp.rcNormalPosition =  theApp.ParamStore.rcNormalPosition;
M>wp.showCmd = 1;

M>SetWindowPlacement(&wp);
M>


Ещё бонус WINDOWPLACEMENT в том, что он так же может запоминать/восстанвливать состояние окна, в wp.showCmd, было ли оно свёрнуто(SW_SHOWMINIMIZED), просто октырто(SW_SHOWNORMAL), развёрнуто на весь экран(SW_SHOWMAXIMIZED) или ещё как. Я ещё кроме плейсмента топмост запоминаю/восстанавливаю своим окнам можно, наверно, ещё полупрозрачность для некоторых случаев добавить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.