Добрый день, уважаемые! Возникла проблема. Создаю окно CreateWindow(...), а в WndProc для этого окна ставлю обработчик WM_CREATE, в к-м пытаюсь окну присвоить шрифт...
...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 делать нельзя? Я рылся, но не нашел, может с этим поможете?
Здравствуйте, andreip, Вы писали:
A>Вопрос: Почему? Что не так?
вкратце. В МСДН это есть. Читаем ремарки к функции CreateWindow. До возврата из оконной процедуры при обработке сообщения WM_CREATE окно еще не есть создано и все попытки синхронно оттуда установить любые пользовательские параметры окну закончятся неудачей.
Здравствуйте, Alexmoon, Вы писали:
A>вкратце. В МСДН это есть. Читаем ремарки к функции CreateWindow. До возврата из оконной процедуры при обработке сообщения WM_CREATE окно еще не есть создано и все попытки синхронно оттуда установить любые пользовательские параметры окну закончятся неудачей.
К сожалению все-таки даже с подсказкой не нашел этого в мсдн-е (October 2001 для 6-й студии), но дело даже не в этом. Пользовательские параметры — это какие?
текст можно, любые SetWidnowLong можно, все размеры можно, мало того, если засабкласить, например, системный BUTTON, то там и фонт назначить можно. И все на WM_CREATE.
Выход, конечно, нашел, но как-то криво это...
не должно быть так, мне кажется.
Здравствуйте, 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.
Здравствуйте, 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>Спасибо!!!