Re[25]: Или бага, или sort() от меня чего-то ждет
От: c-smile Канада http://terrainformatica.com
Дата: 13.10.16 20:54
Оценка: 3 (1)
Здравствуйте, Scorpion1105, Вы писали:

S>Здравствуйте, c-smile, Вы писали:


S>Проблема воспроизводится, можно проверить.



Вот это

   SIZE sz;
   sz.cx = ::SciterGetMinWidth(hwndDlg);
   sz.cy = ::SciterGetMinHeight(hwndDlg, sz.cx);


достаточно тяжелая оперция. В частности этот вот вызов SciterGetMinHeight(hwndDlg, sz.cx);
Фактически делается set_width(new_width) -> relayout -> get_calculated_height(). Т.е. полный relayout содержимого.
Проблема еще в side effect — DOM остается в состоянии new_width layout.
Такое имеет смысл делать только олин раз — после начальной загрузки.

Если же контент динамический (высота зависит от ширины в runtime) то после SciterGetMinHeight нужно "возвращать всё в зад" чтобы восстановить текущий layout:

INT_PTR scdialog::on_WM_GETMINMAXINFO(HWND hwndDlg, WPARAM wParam, LPARAM lParam)
{
   RECT rcClient = rcScreen;

   ...

   auto fsctl = self(hwndDlg);      assert(fsctl);

   MINMAXINFO *pInfo = (MINMAXINFO *)lParam;
   POINT Max = fsctl->GetMaxDialogSize();
   POINT Min = fsctl->GetMinDialogSize();
   Min.x += szBorder.cx;
   Min.y += szBorder.cy;

   pInfo->ptMinTrackSize = Min; // УСТАНОВИЛИ МИНИМАЛЬНЫЙ РАЗМЕР
   pInfo->ptMaxTrackSize = Max; // УСТАНОВИЛИ МАКСИМАЛЬНЫЙ РАЗМЕР

   //!!!!!!!!! Restore current normal layout:

   GetClientRect(hwndDlg,&rcClient);
   BOOL dummy;
   SciterProcND(hwndDlg,WM_SIZE,SIZE_RESTORED,MAKELONG(rcClient.right-rcClient.left,rcClient.bottom-rcClient.top),&dummy);

   return 0;
}


Т.к. WM_GETMINMAXINFO вызывается на каждый чих то SciterGetMinHeight нужно избегать.


S>--

S>Есть workaroud, конечно — к SciterGetMinWidth/Height() единственное обращение делается в on_WM_INITDIALOG, значения запоминаются. В on_WM_GETMINMAXINFO используются сохраненные значения, без обращений к SciterGetMinWidth/Height(), тогда паразитных ресайзов не наблюдается. Тем не менее, не понятно, почему так...

S>--

S>>>Вопрос по инспектору — он совсем не умеет показывать markup для контента, загруженного через SciterLoadHtml? Или можно как-то?
S>>>Так получается, что всё показывает — DOM, внешние css, картинки и пр., а саму страницу нет.

S>И вот этот вот вопрос еще актуален, если не затруднит.


1. в WinMain
// enable debugger/inspector
SciterSetOption(NULL,SCITER_SET_DEBUG_MODE,TRUE);


2. В твоем коде исправить багу — dialog у тебя создается с parent = NULL. А нужно parent окно.

3. (C запущенным inspector) В окне dialog нажать CTRL+SHIFT+I — увидишь свое окно и markup:

Отредактировано 13.10.2016 21:02 c-smile . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.