Message Box и немного фантазии
От: Павел Блудов Россия  
Дата: 13.06.03 03:54
Оценка: 445 (13)
Статья :
Message Box и немного фантазии
Автор(ы): Paul Bludov
Дата: 29.05.2003
В статье рассматриваются способы расширения функциональности стандартных окон сообщений, а также создания нестандартных.


Авторы :
Павел Блудов

Аннотация :
В статье рассматриваются способы расширения функциональности стандартных окон сообщений, а также создания нестандартных.
Re: Message Box и немного фантазии
От: _nn_  
Дата: 03.07.03 15:24
Оценка:
Здравствуйте, Павел Блудов, Вы писали:

Очень хорошая статья
Как раз такое искал. Спасибо.

Можно ли это переписать на C ?
Спасибо заранее.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Message Box и немного фантазии
От: Jenyay http://jenyay.net
Дата: 03.07.03 16:32
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Можно ли это переписать на C ?


А кто ж запретит
... << RSDN@Home 1.1 alpha 1 >>
Софт, исходники и фото
Re[3]: Message Box и немного фантазии
От: _nn_  
Дата: 03.07.03 18:01
Оценка:
Здравствуйте, Jenyay, Вы писали:

Мне код бы....
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Message Box и немного фантазии
От: Блудов Павел Россия  
Дата: 04.07.03 01:19
Оценка: 6 (1)
Здравствуйте, _nn_, Вы писали:

_nn_>Можно ли это переписать на C ?


Как правило, код, написанный на C++ легко переносится на С,
если Вы пишите на С используя ООП.

Например, если имеется класс

class CSample
{
   int m_nVal;

public:
   CSample(int nVal)
      : m_nVal(nVal)
   {
   }

   int GetVal() const
   {
      return m_nVal;
   }
};


то его эквивалент на C

struct Sample
{
   int m_nVal;
};

Sample *Sample_New(int nVal)
{
   Sample *pSample = (Sample *)malloc(sizeof(struct Sample));
   if (pSample)
      pSample->m_nVal = nVal;
   return pSample;
}

int Sample_GetVal(Sample *pObj)
{
      return pObj->m_nVal;
}


и т.д. Иными словами, создается объект, который явно передается
в каждую функцию этого псевдокласса.

Павел.
Re: Message Box и немного фантазии
От: Sproot_ Россия  
Дата: 23.09.04 15:04
Оценка:
Здравствуйте, Павел!

Просьба может немного не по существу статьи, но тем не мение, я очень надеюсь, что вы в силах мне помочь...
Проблема с MessageBox-ом, а точнее с его отцентровкой относительно друго окна...
Суть проблемы в следующем:
Есть приложение, которое создает второй поток, в котором, в свою очередь, вызывается MessadgeBox... этот бокс появляется по середине экрана...
Так вот, хотелось бы, чтоб этот мессаджбокс появлялся отцентровано, относительно главного окна приложения, хэндл этого окна мы имеем, хэндл мессаджбокса, соответственно, нет...
Просто вызов ::MessadgeBox(hwndMainWnd, "bla-bla", "bla-bla", MB_OK); — не проходит.
Подскажите, пожалуйста, как можно изменить позицию мессаджбокса или хотябы как получить его хэндл...

Заранее спасибо!!
с уважением, Павел.
Настоящий MessageBox + хук под Vista ;)
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 20.10.07 15:00
Оценка: :))
Здравствуйте, Павел Блудов, Вы писали:

ПБ>Статья :

ПБ>Message Box и немного фантазии
Автор(ы): Paul Bludov
Дата: 29.05.2003
В статье рассматриваются способы расширения функциональности стандартных окон сообщений, а также создания нестандартных.


... << RSDN@Home 1.2.0 alpha rev. 774 Windows 2003 5.2.3790.65536 >>
непонятка с DrawText
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 21.10.07 11:36
Оценка:
Здравствуйте, Павел Блудов, Вы писали:

ПБ>Статья :

ПБ>Message Box и немного фантазии
Автор(ы): Paul Bludov
Дата: 29.05.2003
В статье рассматриваются способы расширения функциональности стандартных окон сообщений, а также создания нестандартных.


такая непонятка: в "Способ №2: универсальное диалоговое окно", когда используется DrawText для вычисления размера текста:

    hdcDlg = ::GetWindowDC(hwndDlg);
    ::DrawText(hdcDlg, pInit->m_lpText, -1, &rect,
           DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT);

она почему-то практически всегда возвращает ширину большую, чем действительно нужно, если для наглядности добавить к тексту бордюр, то это видно на примере:



где тут могла собака порыться?
... << RSDN@Home 1.2.0 alpha rev. 774 Windows 2003 5.2.3790.65536 >>
Re: непонятка с DrawText
От: Блудов Павел Россия  
Дата: 22.10.07 00:08
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>где тут могла собака порыться?

Ну я бы начал танцы с бубном с установки очень большого или очень маленького размера для шрифта.
Если разница будет увеличиваться/уменьшаться в пропорции, то скорее всего для вычисления размеров и отображения используются разные шрифты.
Тогда встанет вопрос, где найти "тот".

P.S. Это происходит только под вистой или всюду?
Re: Эх Vista.…
От: Блудов Павел Россия  
Дата: 22.10.07 00:15
Оценка:
Здравствуйте, Odi$$ey!

Под висту надо заново переписывать статью.
В том плане, чтобы взять TaskDialog и прозрачно реализовать его функиональность для WinXP/2k.
Я думал об этом, но всё надеялся, что кто-нибудь это за меня сделает.
Re[2]: непонятка с DrawText
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 22.10.07 02:37
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

OE>>где тут могла собака порыться?

БП>Ну я бы начал танцы с бубном с установки очень большого или очень маленького размера для шрифта.
БП>Если разница будет увеличиваться/уменьшаться в пропорции, то скорее всего для вычисления размеров и отображения используются разные шрифты.

да, пожалуй, так оно и есть:



БП>Тогда встанет вопрос, где найти "тот".




БП>P.S. Это происходит только под вистой или всюду?


я смотрел под win2003 и под vista — одинаково
... << RSDN@Home 1.2.0 alpha rev. 774 Windows 2003 5.2.3790.65536 >>
Re[2]: непонятка с DrawText
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 22.10.07 16:01
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Тогда встанет вопрос, где найти "тот".


Вроде добил Сделал так: (код на MFC, но должно быть понятно)

    // правильный шрифт для сообщений, зависящий
    // от системных установок
    CFont _msgFont;

    ...
    
    // создание шрифта для сообщений по системным настройкам
    NONCLIENTMETRICS ncm;
    ncm.cbSize = sizeof( NONCLIENTMETRICS );
    SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof( ncm ), &ncm, 0 );
    _msgFont.CreateFontIndirect( &ncm.lfMessageFont );

    ...

    _textControl.SetFont( &_msgFont );

    ...
    
    // вычисляем действительные размеры текста
    CClientDC dc( this );
    dc.SelectObject( &_msgFont );

    dc.DrawText( _text, &rectText, DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT );
    // почему-то иногда чуть-чуть не хватает
    rectText.right += _border;
    rectText.bottom += _border;
... << RSDN@Home 1.2.0 alpha rev. 774 Windows 2003 5.2.3790.65536 >>
Re[2]: Эх Vista.…
От: CEMb  
Дата: 23.10.07 02:54
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Под висту надо заново переписывать статью.

БП>В том плане, чтобы взять TaskDialog и прозрачно реализовать его функиональность для WinXP/2k.
БП>Я думал об этом, но всё надеялся, что кто-нибудь это за меня сделает.

Назвался груздем
Re[3]: непонятка с DrawText
От: CEMb  
Дата: 23.10.07 02:59
Оценка:
Здравствуйте, Odi$$ey, Вы писали много

Я использую GetTextExtentPoint32 для вычисления размеров текста.
В hdc закидывается HFONT, на выходе получается SIZE
Re[4]: непонятка с DrawText
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 23.10.07 05:27
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Я использую GetTextExtentPoint32 для вычисления размеров текста.

CEM>В hdc закидывается HFONT, на выходе получается SIZE

я пробовал, GetTextExtentPoint32() дает точно те же результаты, что и DrawText(), т.е. выставишь ручками нужный шрифт — правильные, а возьмешь HDC как

hdcDlg = ::GetWindowDC(hwndDlg);

— левые, т.е. соответствующие непонятно какому шрифту, явно не тому, каким выводятся надписи на диалоге.
... << RSDN@Home 1.2.0 alpha rev. 774>>
Re[5]: непонятка с DrawText
От: CEMb  
Дата: 23.10.07 06:53
Оценка:
Здравствуйте, 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 в нём фонт системный (страшно-квардраный), то есть, имхо, он набирается "по минимуму" — чёрный солидбраш, чёрный пен, страшный фонт, етс...

Могу и ошибаться
Re[5]: непонятка с DrawText
От: programmater  
Дата: 23.10.07 11:23
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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


CEM>>Я использую GetTextExtentPoint32 для вычисления размеров текста.

CEM>>В hdc закидывается HFONT, на выходе получается SIZE

OE>я пробовал, GetTextExtentPoint32() дает точно те же результаты, что и DrawText(), т.е. выставишь ручками нужный шрифт — правильные, а возьмешь HDC как


OE>
OE>hdcDlg = ::GetWindowDC(hwndDlg);
OE>

OE> — левые, т.е. соответствующие непонятно какому шрифту, явно не тому, каким выводятся надписи на диалоге.
Подтверждаю. У твоей проблемы ноги растут оттуда же, откуда и у моей. Сам в свое время на такое нарвался. здесь
Автор: _devdi_
Дата: 17.03.06
Re[2]: Эх Vista.…
От: Carc Россия http://www.amlpages.com/home.php
Дата: 23.10.07 18:29
Оценка:
> В том плане, чтобы взять TaskDialog и прозрачно реализовать его функиональность для WinXP/2k.
А причем тут TaskDialog?
Это кто?
Сорри, за вероятно идиотские вопросы, но в Виста ни малейшего опыта. Просто в свое время доводил идею MessageBox с галкой под свои нужды (ну в смысле когда CheckBox может быть не один, или вообще это не CheckBox`ы а что то другое — RadioButton`ы, PushButton`ы и.т.д) — что называется тема "горячая".
Posted via RSDN NNTP Server 2.1 beta
Aml Pages Home
Re[5]: непонятка с DrawText
От: c-smile Канада http://terrainformatica.com
Дата: 23.10.07 20:39
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>
OE>hdcDlg = ::GetWindowDC(hwndDlg);
OE>

OE> — левые, т.е. соответствующие непонятно какому шрифту, явно не тому, каким выводятся надписи на диалоге.

Ну дык ::GetWindowDC(hwndDlg) и ::GetClientDC(hwndDlg) это разные вещи.
Попробуй GetClientDC — в нем должен быть правильный шрифт выбран.
Re[6]: непонятка с DrawText
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 24.10.07 09:39
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Попробуй GetClientDC — в нем должен быть правильный шрифт выбран.


А есть такая функция? можно ссылочку на msdn?
... << RSDN@Home 1.2.0 alpha rev. 780>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.