Как динамически изменять положение CStatic в диалоге ?
От: sSerge  
Дата: 07.05.03 19:03
Оценка:
Надо при позиционировании объекта CStatic в случае изменения размеров системного шрифта.

1) Пара "GetDlgItem (IDC_MY_ITEM)" + "SetWindowPos()" не работает.

2) Изменять шаблон диалога перед запуском — не предлагать. Работает, но не так как надо.
Точнее — не удается позиционировать объект с точностью до пикселя.
В принципе интересно и про GroupBox...
С уважением, Сергей.
Re: Как динамически изменять положение CStatic в диалоге ?
От: Serguei666 Беларусь  
Дата: 07.05.03 21:39
Оценка:
Здравствуйте, 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 в диалоге ?
От: template  
Дата: 08.05.03 05:47
Оценка:
Здравствуйте, sSerge, Вы писали:

S>Надо при позиционировании объекта CStatic в случае изменения размеров системного шрифта.


S>1) Пара "GetDlgItem (IDC_MY_ITEM)" + "SetWindowPos()" не работает.


S>2) Изменять шаблон диалога перед запуском — не предлагать. Работает, но не так как надо.

S> Точнее — не удается позиционировать объект с точностью до пикселя.
S> В принципе интересно и про GroupBox...

А для чего была создана MoveWindow?
Re[2]: Как динамически изменять положение CStatic в диалоге
От: sSerge  
Дата: 08.05.03 10:50
Оценка:
Здравствуйте, 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 в диалоге
От: Patalog Россия  
Дата: 08.05.03 12:01
Оценка:
Здравствуйте, sSerge, Вы писали:

[]

S> Внимательное изучение MSDN на предмет различий между ф-ми

S> SetWindowPos и MoveWindow привело к тому, что оказывается
S> MoveWindow двигает все подряд, а SetWindowPos — избирательно.
S> (Цитировать MSDN не буду, там всего по 3 строки на каждую ф-цию).

Хм, а можно таки поподробнее в этом месте?
Сдается мне, что ты просто не "умеешь готовить" SetWindowPos...
Почетный кавалер ордена Совка.
Re[3]: Как динамически изменять положение CStatic в диалоге
От: Serguei666 Беларусь  
Дата: 08.05.03 15:18
Оценка:
Здравствуйте, sSerge, Вы писали:

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


S> Что вы тогда будете делать? Есть свой котелок?

S> Нет. Не буду.

И это хорошо, иначе вы поставили бы меня в неудобное положение.


>>1) Пара "GetDlgItem (IDC_MY_ITEM)" + "SetWindowPos()" не работает.

>А если я докажу, что работает?
S> Попробуй.

Ну, например, так:
Пишете в OnInitDialog после вызова OnInitDialog предка:

GetDlgItem(IDC_MY_ITEM)->SetWindowPos(NULL, 66, 6, 0, 0, SWP_NOSIZE);
CRect Rect;
GetDlgItem(IDC_MY_ITEM)->GetWindowRect(Rect);
ScreenToClient(Rect);
ASSERT(Rect.left == 66 && Rect.top == 6);

несрабатывание 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 работает как надо.
Хотите сказать 'спасибо'? Тогда поставьте оценку
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.