Здравствуйте, 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: