WM_SETFONT на WM_CREATE
От: andreip  
Дата: 24.01.04 12:26
Оценка:
Добрый день, уважаемые! Возникла проблема. Создаю окно CreateWindow(...), а в WndProc для этого окна ставлю обработчик WM_CREATE, в к-м пытаюсь окну присвоить шрифт...

WNDCLASS wc;
....
wc.lpfnWndProc = (WNDPROC)WndProc;
......
RegisterClass(&wc);
CreateWindow(......);

...WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0);
//Здесь пытаюсь проверить: что получилось
hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
//Так вот hFont равен 0, т.е. ни фига
break;
}
}


Вопрос: Почему? Что не так?

Да, кстати, если пользоваться PostMessage, то фонт в результате применяется, но мне очень важно не получать обратно управления, пока шрифт не будет установлен. Да и где в МСДН-е написано, что SendMessage делать нельзя? Я рылся, но не нашел, может с этим поможете?

Спасибо!!!
Re: WM_SETFONT на WM_CREATE
От: Alexmoon Украина  
Дата: 24.01.04 12:42
Оценка:
Здравствуйте, andreip, Вы писали:

A>Вопрос: Почему? Что не так?

вкратце. В МСДН это есть. Читаем ремарки к функции CreateWindow. До возврата из оконной процедуры при обработке сообщения WM_CREATE окно еще не есть создано и все попытки синхронно оттуда установить любые пользовательские параметры окну закончятся неудачей.
Re[2]: WM_SETFONT на WM_CREATE
От: andreip  
Дата: 24.01.04 13:37
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>вкратце. В МСДН это есть. Читаем ремарки к функции CreateWindow. До возврата из оконной процедуры при обработке сообщения WM_CREATE окно еще не есть создано и все попытки синхронно оттуда установить любые пользовательские параметры окну закончятся неудачей.


К сожалению все-таки даже с подсказкой не нашел этого в мсдн-е (October 2001 для 6-й студии), но дело даже не в этом. Пользовательские параметры — это какие?
текст можно, любые SetWidnowLong можно, все размеры можно, мало того, если засабкласить, например, системный BUTTON, то там и фонт назначить можно. И все на WM_CREATE.

Выход, конечно, нашел, но как-то криво это...
не должно быть так, мне кажется.
Re[3]: WM_SETFONT на WM_CREATE
От: Alexmoon Украина  
Дата: 24.01.04 14:02
Оценка:
Здравствуйте, andreip, Вы писали:

A>К сожалению все-таки даже с подсказкой не нашел этого в мсдн-е (October 2001 для 6-й студии), но дело даже не в этом. Пользовательские параметры — это какие?

A>текст можно, любые SetWidnowLong можно, все размеры можно, мало того, если засабкласить, например, системный BUTTON, то там и фонт назначить можно. И все на WM_CREATE.
Пользовательские настройки — это касется всего, что не делается по умолчанию без дополнительных вызовов, ну допустим SendMessage and etc.
У меня конечно VC7.1 and MSDN 2003, April, но это ситуацию не меняет. Все старо как мир. Вообщем не буду внедрятся в полемику. Скажу просто, что это неправильно. По мере набора опыта поймешь почему. Достаточно того, что ты можешь устанавливать все что хочешь, но если обработка сообщения WM_CREATE закончится неудачей, то все твои мытарства бесполезны. Сказал майкрософт, что до окончания обработки WM_CREATE — окно нельзя считатьь созданным, то значит это нужно не обсуждать а принимать на веру. Это его окна и он их доит.

A>Выход, конечно, нашел, но как-то криво это...

A>не должно быть так, мне кажется.
В твоем случае, если ты не задумал никаких акробатических номеров, достаточно создать окно unvisible (без флага WS_VISIBLE), затем все твои SendMessages, а потом ShowWindow and UpdateWindow.
Re: WM_SETFONT на WM_CREATE
От: kliff Россия http://www.esignal.ru
Дата: 24.01.04 16:29
Оценка:
Здравствуйте, andreip, Вы писали:

A>Добрый день, уважаемые! Возникла проблема. Создаю окно CreateWindow(...), а в WndProc для этого окна ставлю обработчик WM_CREATE, в к-м пытаюсь окну присвоить шрифт...


A>WNDCLASS wc;

A>....
A>wc.lpfnWndProc = (WNDPROC)WndProc;
A>......
A>RegisterClass(&wc);
A>CreateWindow(......);

A>...WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

A>{
A> switch (uMsg)
A> {
A> case WM_CREATE:
A> HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
A> SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0);
A> //Здесь пытаюсь проверить: что получилось
A> hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
A> //Так вот hFont равен 0, т.е. ни фига
A> break;
A> }
A>}


A>Вопрос: Почему? Что не так?


A>Да, кстати, если пользоваться PostMessage, то фонт в результате применяется, но мне очень важно не получать обратно управления, пока шрифт не будет установлен. Да и где в МСДН-е написано, что SendMessage делать нельзя? Я рылся, но не нашел, может с этим поможете?


A>Спасибо!!!


Попробуй так

case WM_CREATE:
  {
    LRESULT lRet = DefWindowProc(hWnd, ..);
    if (-1 == lRet)
      return lRet;
    SendMessage(hWnd, WM_SETFONT, ..)
    ..
    return 0;
  }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.