Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MFC Grid Control размер  (Прочитано 16202 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Boriska
Помогающий

us
Offline Offline

« : 11-09-2015 09:53 » 

Привет форумчане

Подскажите пожалуйста как менять размер колонок правильно (ну и наверное строк) в этом контроле при изменении разрешения, размеров диалога или размера системного шрифта. Пока работаю с одним разрешением и размером и шрифтом подгоняю размеры колонок при помощи пробелов, но это от незнания.
« Последнее редактирование: 11-09-2015 09:57 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 12-09-2015 09:24 » 

Boriska, насколько я помню, в MFC нет внятного грида, но тырнет подсказывает, что это "MFC Grid Control" -  самописный контрол , вот нашлась такая статья

http://www.codeproject.com/Articles/8/MFC-Grid-control

Там всё, о чём ты спрашиваешь, упоминается. В частности, функция ExpandColumnsToFit
Записан

Boriska
Помогающий

us
Offline Offline

« Ответ #2 : 12-09-2015 16:40 » 

Спсб. Повесил на WM_SIZE и WM_SIZING - работает. А вот при инициализации диалога не догоняю куда логично подвесить - окна ж еще нет. Хотя в OnInitDialoge - это работает.
« Последнее редактирование: 12-09-2015 16:49 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 13-09-2015 13:11 » 

в OnInitDialog окно уже создано

Код:
BOOL CMyDialog::OnInitDialog() 
{
CDialog::OnInitDialog();

//здесь можно ворочать контролами

return 1;
}

В WM_SIZE и WM_SIZING, думаю, не слишком хорошо ресайз встраивать, если таблица будет большая, может и тормозюкать. Лучше вызывать ресайз сразу после изменения шрифта . Скажем, в OnFontChange
« Последнее редактирование: 13-09-2015 13:18 от Алексей++ » Записан

Boriska
Помогающий

us
Offline Offline

« Ответ #4 : 13-09-2015 16:20 » 

Алексей++ Не совсем понял о чем ты,
Цитата
Лучше вызывать ресайз сразу после изменения шрифта . Скажем, в OnFontChange
я же изменяю размеры окна. Разрешение и шрифт я же в системе изменяю и возможно тогда, когда программа не запущена.
« Последнее редактирование: 13-09-2015 16:22 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 13-09-2015 16:24 » 

Boriska, а зачем при изменении размеров окна менять размеры колонок? Ну, ежели действительно нужно - пожалуйста, конечно
Записан

Boriska
Помогающий

us
Offline Offline

« Ответ #6 : 14-09-2015 07:15 » 

Алексей++, Потому что столкнулся с тем, что начали программу запускать под разным разрешением, на разных мониторах, с разным шрифтом. Вот и хочу ее переделать, чтобы была удобочитаемой Улыбаюсь
Понимаю, что можно перед показом окна пересчитать все и показать, но хочется сделать, чтобы был ресайз. Кстати ни разу
не делал ни того ни другого, только слышал. Алексей++, пожалуйста будь гидом в этом темном царстве Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 15-09-2015 04:59 » 

Boriska, что касается MFC - бесполезняк пытаться там что-то автоматически настроить в этом плане, не стОит оно усилий (к примеру, на Qt об этом вообще практически не думаешь - я на него плотно пересел уже ).

Можно условиться, что разрешение и шрифты не меняются ежеминутно (полагаю, можно настроить внешний вид окна один раз после первого запуска). Выведи им возле нужных элементов интерфейса маленькие кнопочки - выбор шрифта, таблицы по ширине они сами настроят мышкой, высоту строки в таблице тоже. И сохраняешь эти настройки в файл возле экзешника (удобно в формате json или xml)

Возможно, эти кнопочки даже покажутся по некой кнопке настройки, а потом так же скроются.
Записан

Boriska
Помогающий

us
Offline Offline

« Ответ #8 : 15-09-2015 18:39 » 

Алексей++, не подскажешь почему моя кнопка при сдвиге правой границы
на миллиметры буквально улетает влево. Такое впечатление, как дикий коэф. усиления.
Код: (C++)
void CMyDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
        CDialogEx::OnSizing(fwSide, pRect);

        CRect rect;
        GetDlgItem(IDC_BUTTON1)->GetWindowRect(&rect);
        ScreenToClient(&rect);

        int delta = (m_WndRect.right - pRect->right);
        //m_WndRect - первонач размер диалога

        rect.left = rect.left - delta;
        rect.right = rect.right - delta;

        GetDlgItem(IDC_BUTTON1)->MoveWindow(rect, TRUE);
}
« Последнее редактирование: 15-09-2015 18:47 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 16-09-2015 04:40 » 

Boriska,

1) я не знаю, что ты хочешь сделать, что должно происходить ?
2) а также - правую границу чего именно двигаешь ?

вполне логично предположить, что кнопка уедет, ведь ты берёшь её координаты, сдвигаешь их на delta и задаёшь эти новые координаты кнопке. И так постоянно
Записан

Boriska
Помогающий

us
Offline Offline

« Ответ #10 : 16-09-2015 09:01 » 

Алексей++,
1. Делаю sizing диалога. Пробую при уменьшении окна (правая граница) смещать кнопки
влево ну и хочу изменять размер сustom control под grid. Ну то бишь по моим расчетам
чтобы при изменении размера окна, контролы оставалить в поле зрения, уменьшаясь и
съезжая со своих мест. Сделал это для начала для одной кнопки, но она чет двигается
как я написал не пропорционально изменению размера окна.
2. Правую границу выбрал просто так, пробую для начала.
« Последнее редактирование: 16-09-2015 09:04 от Boriska » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 17-09-2015 04:50 » 

Boriska, ну вот я пытался такое когда-то провернуть https://club.shelek.ru/viewart.php?id=173

сразу скажу - попытка отмасштабировать ВСЁ - это фигня полная. Тем более на MFC, где нет компоновщиков

Но можно задаться мысленной сеткой на диалоге и решить, какие узлы сетки будут меняться при изменении размера. В обработчике пересчитываешь узлы сетки, затем, согласно своей задумке, перемещаешь контролы по этой сетке и меняешь их размеры. В MFC важно следить за тем, чтобы не устанавливать размер и позицию контрола, если эта позиция и размер уже заданы - а то можно нарваться на бесконечную рекурсию.

К примеру, мы решаем, что у нас слева вертикально будет колонка кнопок постоянного размера (и, по сути, неподвижных вообще) , а справа - окно просмотра. его левая и и верхняя границы неподвижны, а правая и нижняя "прилипают к краю диалога".  Так и действуем , сетка очень несложная получается в этом случае

« Последнее редактирование: 17-09-2015 04:58 от Алексей++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines