Просьба может немного не по существу статьи, но тем не мение, я очень надеюсь, что вы в силах мне помочь...
Проблема с MessageBox-ом, а точнее с его отцентровкой относительно друго окна...
Суть проблемы в следующем:
Есть приложение, которое создает второй поток, в котором, в свою очередь, вызывается MessadgeBox... этот бокс появляется по середине экрана...
Так вот, хотелось бы, чтоб этот мессаджбокс появлялся отцентровано, относительно главного окна приложения, хэндл этого окна мы имеем, хэндл мессаджбокса, соответственно, нет...
Просто вызов ::MessadgeBox(hwndMainWnd, "bla-bla", "bla-bla", MB_OK); — не проходит.
Подскажите, пожалуйста, как можно изменить позицию мессаджбокса или хотябы как получить его хэндл...
она почему-то практически всегда возвращает ширину большую, чем действительно нужно, если для наглядности добавить к тексту бордюр, то это видно на примере:
Здравствуйте, Odi$$ey, Вы писали:
OE>где тут могла собака порыться?
Ну я бы начал танцы с бубном с установки очень большого или очень маленького размера для шрифта.
Если разница будет увеличиваться/уменьшаться в пропорции, то скорее всего для вычисления размеров и отображения используются разные шрифты.
Тогда встанет вопрос, где найти "тот".
Под висту надо заново переписывать статью.
В том плане, чтобы взять TaskDialog и прозрачно реализовать его функиональность для WinXP/2k.
Я думал об этом, но всё надеялся, что кто-нибудь это за меня сделает.
Здравствуйте, Блудов Павел, Вы писали:
OE>>где тут могла собака порыться? БП>Ну я бы начал танцы с бубном с установки очень большого или очень маленького размера для шрифта. БП>Если разница будет увеличиваться/уменьшаться в пропорции, то скорее всего для вычисления размеров и отображения используются разные шрифты.
да, пожалуй, так оно и есть:
БП>Тогда встанет вопрос, где найти "тот".
БП>P.S. Это происходит только под вистой или всюду?
Здравствуйте, Блудов Павел, Вы писали:
БП>Под висту надо заново переписывать статью. БП>В том плане, чтобы взять TaskDialog и прозрачно реализовать его функиональность для WinXP/2k. БП>Я думал об этом, но всё надеялся, что кто-нибудь это за меня сделает.
Здравствуйте, CEMb, Вы писали:
CEM>Я использую GetTextExtentPoint32 для вычисления размеров текста. CEM>В hdc закидывается HFONT, на выходе получается SIZE
я пробовал, GetTextExtentPoint32() дает точно те же результаты, что и DrawText(), т.е. выставишь ручками нужный шрифт — правильные, а возьмешь HDC как
hdcDlg = ::GetWindowDC(hwndDlg);
— левые, т.е. соответствующие непонятно какому шрифту, явно не тому, каким выводятся надписи на диалоге.
Здравствуйте, Odi$$ey, Вы писали:
OE>я пробовал, GetTextExtentPoint32() дает точно те же результаты, что и DrawText(), т.е. выставишь ручками нужный шрифт — правильные, а возьмешь HDC как
OE>
OE>hdcDlg = ::GetWindowDC(hwndDlg);
OE>
OE> — левые, т.е. соответствующие непонятно какому шрифту, явно не тому, каким выводятся надписи на диалоге.
Ну, вроде, всё правильно.
DC и фонт живут отдельно. Фонт может сидеть в окне через WM_SETFONT, но от этого он не будет сидеть в DC. Его надо взять из окна, вставит SelectObject-ом в DC и тогда из DC получать результаты. Скорее всего окно диалога ровно так и делает(как вариант, держит DC открытым до закрытия окна диалога) когда текст рисует. Если взять и посмотреть (пошёл прям сщас и посмотрел,.. и понял что ошибался...) то (VBS, msgbox "exampe") видно, что у окна, текста и кнопки — один и тот же объект HFONT (а я думал, он тока у окна, а дети им пользуются... но как тока я подменил фонт окну, дети стали рисоваться тем самым квадратным системным, то есть объект один, но WM_SETFONT сказано всем).
Когда берёшь руками "свежий" DC в нём фонт системный (страшно-квардраный), то есть, имхо, он набирается "по минимуму" — чёрный солидбраш, чёрный пен, страшный фонт, етс...
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, CEMb, Вы писали:
CEM>>Я использую GetTextExtentPoint32 для вычисления размеров текста. CEM>>В hdc закидывается HFONT, на выходе получается SIZE
OE>я пробовал, GetTextExtentPoint32() дает точно те же результаты, что и DrawText(), т.е. выставишь ручками нужный шрифт — правильные, а возьмешь HDC как
OE>
OE>hdcDlg = ::GetWindowDC(hwndDlg);
OE>
OE> — левые, т.е. соответствующие непонятно какому шрифту, явно не тому, каким выводятся надписи на диалоге.
Подтверждаю. У твоей проблемы ноги растут оттуда же, откуда и у моей. Сам в свое время на такое нарвался. здесь
> В том плане, чтобы взять TaskDialog и прозрачно реализовать его функиональность для WinXP/2k.
А причем тут TaskDialog?
Это кто?
Сорри, за вероятно идиотские вопросы, но в Виста ни малейшего опыта. Просто в свое время доводил идею MessageBox с галкой под свои нужды (ну в смысле когда CheckBox может быть не один, или вообще это не CheckBox`ы а что то другое — RadioButton`ы, PushButton`ы и.т.д) — что называется тема "горячая".