Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.30.162] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
В очередной раз написал класс, который двигает и растягивает контролы при изменении размера диалога.
Естественно, захотелось сделать так, чтобы диалог нельзя было сделать меньше определенного размера. Тупо вбивать не хочется, более привлекает, просто чтобы размер диалога не делался менее исходного. Куски кода, имеющие отношение к делу: *.h : class CBlackListManagerDlg : public CDialog { // Construction public: .... ControlMover cm; .... *.cpp: BOOL CBlackListManagerDlg::OnInitDialog() { CDialog::OnInitDialog(); cm.Initialise(this); return TRUE; // return TRUE unless you set the focus to a control } void CBlackListManagerDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { // TODO: Add your message handler code here and/or call default if(cm.m_lWidth > 100){ lpMMI->ptMinTrackSize = CPoint(cm.m_lWidth, 300); } CDialog::OnGetMinMaxInfo(lpMMI); } Ну и в самом мувере: class ControlMover{ public: LONG m_lWidth; LONG m_lHeight; void Initialise(CWnd* pParent); .... void ControlMover::Initialise(CWnd* pParent){ m_pParent = pParent; if (!m_pParent) return; CRect rcDialog; m_pParent->GetClientRect(rcDialog); m_lWidth = rcDialog.Width(); m_lHeight = rcDialog.Height(); ... Все прозрачно, ясно, но... Под ХП все работает ожидаемым образом: Прикреплённая картинка
А под 7й окно распидорашивает в неимоверную ширину: Прикреплённая картинка
Сам я руками размер окна не изменяю, так что единственный вариант - что на этапе OnInitDialog() в m_lWidth заносится какой-то мусор. Спрашивается - почему? Что эдакого семерка делает более чрезпопно, чем ХП? Добавлено Поставил костыль: void CBlackListManagerDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { if(cm.m_lWidth > 100 && cm.m_lWidth < 2000){ lpMMI->ptMinTrackSize = CPoint(cm.m_lWidth, 300); } CDialog::OnGetMinMaxInfo(lpMMI); } и теперь тихо офигеваю, т.к. это подействовало. 7ка что, два раза инит диалог вызывает? |
Сообщ.
#2
,
|
|
|
Из того что ты привел ничего не понятно. Код простой все на виду, един. что вижу так это что булет если не указать парент? вроде как члены не будут инициализированы
|
Сообщ.
#3
,
|
|
|
Все, решен вопрос, семерка OnGetMinMaxInfo первый раз вызывает до OnInitDialog. Поставил защиту в виде проверки, проинициализировано ли все в классе ControlMover. Заодно пофиксил еще кое-то и попрятал что не должно торчать наружу в защищенные методы. Не идеально... Но теперь пашет, как ожидалось.
Добавлено Цитата Cfon @ Из того что ты привел ничего не понятно. Код простой все на виду, един. что вижу так это что будет если не указать парент? вроде как члены не будут инициализированы Ну если на входе передать NULL то конечно ничего вообще работать не будет, ну и печали особой в том не будет, прога то основную функцию выполнять сможет, просто свистелко-перделка "автоподгонка под размер" не будет работать. Гораздо веселее когда в таком случае ставят ассерт, и все к чертям вылетает, и попробуй без дебагера найти концы |
Сообщ.
#4
,
|
|
|
Сообщ.
#5
,
|
|
|
красиво
я если честно вообще стараюсь не тратить время на интерфейс, ИМХО главное назначение программы сначала решаю чтобы программа выполняла свою цель, ну а потом занимаюсь интерфейсом. |
Сообщ.
#6
,
|
|
|
Cfon, на самом деле тут оно нахрен не надо, изначально в другой проге делал, которая для просмотра и редактирования картинок, просто захотел инкапсулировать и выдернуть так чтобы легким движением руки в любой проект потом кидать. Вот теперь сижу и смотрю как допилить, чтобы оба списка масштабировались, и при этом не усложнить все до маразма. В смысле чтобы при растягивании оба списка оставались примерно одной ширины.
|
Сообщ.
#7
,
|
|
|
Цитата barazuk @ Cfon, на самом деле тут оно нахрен не надо, изначально в другой проге делал, которая для просмотра и редактирования картинок, просто захотел инкапсулировать и выдернуть так чтобы легким движением руки в любой проект потом кидать. на самом деле все уже придумано и выложено в инет например вот: https://www.codeproject.com/Articles/116/Layout-Manager-for-Dialogs-Formviews-DialogBars-an |
Сообщ.
#8
,
|
|
|
Цитата Cfon @ на самом деле все уже придумано и выложено в инет Ай вещь на самом деле простецкая настолько, что проще самому с нуля сделать, чем если что разбираться в чужом говнокоде чтобы что-то прикрутить Добавлено Цитата Cfon @ например вот: О боже какой адский трындец |
Сообщ.
#9
,
|
|
|
ну хз смотри сам, а я всегда сначала гуглю особенно на codeproject или sourceforge.net
просто мне так удобнее |
Сообщ.
#10
,
|
|
|
Цитата Cfon @ ну хз смотри сам, а я всегда сначала гуглю особенно на codeproject или sourceforge.net Я обычно только подглядываю основную идею... В 99% случаев допиливание и вылов багов в чужом мегакоде на все случаи жизни намного дольше, чем сделать ту маленькую штучку, которую собственно нужно сделать из того парового велосипеда на ядерной тяге, который обычно пафосно городят там где достаточно 20 строк кода |
Сообщ.
#11
,
|
|
|
вот пример MFC диалога c Layout (упростил макс ).
вся работа происходит в OnInitDialog. Все что нам нужно добавить в проект файлы ETSLayout.cpp(.h) и поменять базовый класс диалога c CDialogEx на ETSLayoutDialog. VS 2010. Прикреплённый файлTestLayout.zip (95,2 Кбайт, скачиваний: 95) |
Сообщ.
#12
,
|
|
|
Цитата Cfon @ на самом деле все уже придумано и выложено в инет например вот: https://www.codeproject.com/Articles/116/Layout-Manager-for-Dialogs-Formviews-DialogBars-an Получается так, что не всё. Чтобы как-то ограничить размеры окна достаточно обработать сообщение WM_SIZE. Полученные в сообщении размеры сравниваем с ограничениями, и если надо используем "SetWindowPos". Разве этого не достаточно ? |
Сообщ.
#13
,
|
|
|
Цитата ЫукпШ @ "SetWindowPos". И получаем ill behaved application. Для этого обрабатывается OnGetMinMaxInfo. |
Сообщ.
#14
,
|
|
|
Цитата ЫукпШ @ Чтобы как-то ограничить размеры окна достаточно обработать сообщение WM_SIZE. Вообще, для того, чтоб в диалоге изменять позицию и размер контролов нужно обрабатывать сообщение WM_WINDOWPOSCHANGING |
Сообщ.
#15
,
|
|
|
Цитата barazuk @ Цитата ЫукпШ @ "SetWindowPos". И получаем ill behaved application. С чего это вдруг ? Прежде чем советовать, я сам попробовал. Можешь не сомневаться - это устойчиво работает. Добавлено Цитата Олег М @ Цитата ЫукпШ @ Чтобы как-то ограничить размеры окна достаточно обработать сообщение WM_SIZE. Вообще, для того, чтоб в диалоге изменять позицию и размер контролов нужно обрабатывать сообщение WM_WINDOWPOSCHANGING Вопрос был о том, "как ограничить размер диалога ?" При изменении размеров окна в оконную процедуру посылается сообщение WM_SIZE с установленными размерами. По этому событию можно сравнить установленные размеры с ограничениями и, если надо, установить допустимые размеры окна. --- Чтобы в диалоге менять что-то, можно использовать любые нужные функции WINAPI. Функции создания "диалога" это оболочка вокруг CreateWindow(Ex). С интерпретатором описания диалогового окна, представленного на языке ресурсов. Это обычные окна (которые все функционально - диалоги), и всё содержимое "диалогов" можно делать исключительно "вручную". Те посредством непосредственного вызова CreateWindow для всех окошек-контролов всех нужных классов. |