Надо при позиционировании объекта CStatic в случае изменения размеров системного шрифта.
1) Пара "GetDlgItem (IDC_MY_ITEM)" + "SetWindowPos()" не работает.
2) Изменять шаблон диалога перед запуском — не предлагать. Работает, но не так как надо.
Точнее — не удается позиционировать объект с точностью до пикселя.
В принципе интересно и про GroupBox...
С уважением, Сергей.
Re: Как динамически изменять положение CStatic в диалоге ?
Здравствуйте, sSerge, Вы писали:
S>Надо при позиционировании объекта CStatic в случае изменения размеров системного шрифта.
S>1) Пара "GetDlgItem (IDC_MY_ITEM)" + "SetWindowPos()" не работает.
Даже не знаю, что и сказать. Сильное утверждение. А если я докажу, что работает? Вот посажу CStatic в точку с координатами (0,0) и он ровненько там и окажется, а Spy++ это подтвердит. Что вы тогда будете делать? Есть свой котелок?
S>2) Изменять шаблон диалога перед запуском — не предлагать. Работает, но не так как надо. S> Точнее — не удается позиционировать объект с точностью до пикселя.
Утвержение непонятно. Вот вы позиционируете объект в точку с координатами (0,0),
а он оказывается не в точке с координатами (0,0)? А где же тогда?
В точке с координатами (1,1)? Или (10,10)?
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re: Как динамически изменять положение CStatic в диалоге ?
Здравствуйте, sSerge, Вы писали:
S>Надо при позиционировании объекта CStatic в случае изменения размеров системного шрифта.
S>1) Пара "GetDlgItem (IDC_MY_ITEM)" + "SetWindowPos()" не работает.
S>2) Изменять шаблон диалога перед запуском — не предлагать. Работает, но не так как надо. S> Точнее — не удается позиционировать объект с точностью до пикселя. S> В принципе интересно и про GroupBox...
А для чего была создана MoveWindow?
Re[2]: Как динамически изменять положение CStatic в диалоге
Здравствуйте, Serguei666, Вы писали:
S> Что вы тогда будете делать? Есть свой котелок?
Нет. Не буду.
>>1) Пара "GetDlgItem (IDC_MY_ITEM)" + "SetWindowPos()" не работает. >А если я докажу, что работает?
Попробуй.
Благодаря наводке template-а испытания "::MoveWindow" прошли успешно.
Спасибо за его лаконичный и точный ответ. Он сэкономил мне массу времени.
Внимательное изучение MSDN на предмет различий между ф-ми
SetWindowPos и MoveWindow привело к тому, что оказывается
MoveWindow двигает все подряд, а SetWindowPos — избирательно.
(Цитировать MSDN не буду, там всего по 3 строки на каждую ф-цию).
S>2) Изменять шаблон диалога перед запуском — не удается позиционировать объект с точностью до пикселя. S>Утверждение непонятно.
Попробую объяснить. (Хотя желания мало).
При позиционировании объектов при помощи шаблона диалога (DLGTEMPLATEEX)
координаты указываются в "логических единицах". Перевод их в физические
(пиксели) производится непосредственно при создании диалога. Это дает
возможность масштабировать элементы диалога (как и сам диалог) в зависимости
от конкретных настроек. Более точно — смотри GetDeviceCaps. Практика показывает,
что коэффициент преобразования — не целый. Поэтому поместить объект в
точку (0,0) — все получится как надо, а вот в точку (1,1) — уже далеко не всегда.
(Я бы сказал — никогда). Посмотреть на этот балет можно сделав снапшот диалога,
и сравнив логические координаты объектов и реальные отступы (в пикселях).
P.S.
Вопрос решен ::MoveWindow работает как надо.
С уважением, Сергей.
Re[3]: Как динамически изменять положение CStatic в диалоге
[]
S> Внимательное изучение MSDN на предмет различий между ф-ми S> SetWindowPos и MoveWindow привело к тому, что оказывается S> MoveWindow двигает все подряд, а SetWindowPos — избирательно. S> (Цитировать MSDN не буду, там всего по 3 строки на каждую ф-цию).
Хм, а можно таки поподробнее в этом месте?
Сдается мне, что ты просто не "умеешь готовить" SetWindowPos...
Почетный кавалер ордена Совка.
Re[3]: Как динамически изменять положение CStatic в диалоге
несрабатывание ASSERTа — будет достаточным доказательством?
S> Благодаря наводке template-а испытания "::MoveWindow" прошли успешно. S> Спасибо за его лаконичный и точный ответ. Он сэкономил мне массу времени. S> Внимательное изучение MSDN на предмет различий между ф-ми S> SetWindowPos и MoveWindow привело к тому, что оказывается S> MoveWindow двигает все подряд, а SetWindowPos — избирательно. S> (Цитировать MSDN не буду, там всего по 3 строки на каждую ф-цию).
CWnd::SetWindowPos у меня занимает 3 экрана. Кстати, где вы там увидели слово "избирательно"? Какое английсков слово мне искать в MSDN статье по CWnd::SetWindowPos, чтобы узнать про избирательность?
S>2) Изменять шаблон диалога перед запуском — не удается позиционировать объект с точностью до пикселя. S>Утверждение непонятно. S> Попробую объяснить. (Хотя желания мало).
Если нет желания — и не надо. Помощь нужна вам, а не мне. Внятное и подробное написание вопроса — залог получения точного и правильного ответа.
S> При позиционировании объектов при помощи шаблона диалога (DLGTEMPLATEEX) S> координаты указываются в "логических единицах". Перевод их в физические S> (пиксели) производится непосредственно при создании диалога. Это дает S> возможность масштабировать элементы диалога (как и сам диалог) в зависимости S> от конкретных настроек. Более точно — смотри GetDeviceCaps. Практика показывает, S> что коэффициент преобразования — не целый. Поэтому поместить объект в S> точку (0,0) — все получится как надо, а вот в точку (1,1) — уже далеко не всегда.
... где (0,0) и (1,1) — это какие координаты? В пикселах? В dialog unit'ах? И какие проблемы в обоих случаях?
Если координаты в пикселах — используете SetWindowPos
Если в dialog unit'ах — переводите координаты в пиксельные и ...(см. выше)
Да, перевод будет с погрешностью, так это ж вычислительная техника, работающая на ноликах и единичках. Тут все дискретно. И если MoveWindow для вас подходит, то подойдет и SetWindowPos. Они же оба принимают пиксельные координаты
S> (Я бы сказал — никогда). Посмотреть на этот балет можно сделав снапшот диалога, S> и сравнив логические координаты объектов и реальные отступы (в пикселях).
S>P.S. S> Вопрос решен ::MoveWindow работает как надо.