Программирование на Visual C++. Архив рассылки | страница 29
Alexey Merkulov
A5. По поводу скрытых ошибок в программах, не ленитесь в критических местах использовать TRACE0, а перед использованием указателей проверяйте содержимое
>HRESULT AnyMethod(MyClass* pPointer) {
> if(pPointer != NULL) {
> // и только здесь начинайте с ним работать!
> } else {
> TRACE0("Получен пустой указатель");
> return S_FALSE;
> }
>}
Alexei A. Zanine, System Engineer
Q. У меня есть вопрос по обработке события WM_KEYUP. Играя с диалогом, обнаружил, что он сам никак не реагирует на нажатия клавы. Как решение, использовал следующий способ: для каждого типа контрола делал свой класс, который реагирует на WM_KEYUP, и в обработчике этого события пересылал сообщение окну диалога. […] Но такой способ отдаeт некоторой горбатостью, может быть существует какое-то более элегантное решение?
Роман Коновалов
A. На этот вопрос пришли похожие ответы, суть которых сводится к совету перекрыть функцию PreTraslateMessage() и все нажатия обрабатывать там. Такие ответы прислали Igor Sorokin , Дмитрий Елюсеев и Alex Hin.
Dmitri A. Doulepov советует также обратить внимание на функцию IsDialogMessage( ).
Я поясню – эта функция вызывается из CWnd::PreTranslateMessage( ) для того, чтобы определить, предназначено ли сообщение для диалога. Если да, то она обрабатывает это сообщение, проверяет клавиатурные сообщения и конвертирует их в команды диалогового окна (например, TAB преобразуется в команду перехода к следующему элементу управления.)
Пример:
>BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) {
> // TODO: Add your specialized code here and/or call the base class
> if (pMsg->message==WM_KEYUP && pMsg->wParam==VK_DOWN) {
> MessageBox("DOWN KEY WAS RELEASED!");
> return TRUE; // уберите это, если хотите, чтобы
> // сообщение еще обработалось и стандартным образом
> }
> // вызываем стандартную обработку, оттуда будет
> // вызвана PreTranslateInput(), откуда, в свою
> // очередь, вызывается IsDialogMessage()
> return CDialog::PreTranslateMessage(pMsg);
>}
Я решил, что будет лучше публиковать по одному вопросу в выпуске. Так и размер выпусков будет меньше (повторюсь, меня не раз укоряли за то, что выпуски получаются слишком "тяжелые"), да и проще ссылаться на вопросы – по номеру выпуска.
Вопрос сегодняшнего выпуска:
Q. Нужно изменить шрифт у одного элемента типа CStatic. Делаю это функцией SetFont(CFont font). Фонт меняется у элемента … и у всего окна :(. Включая кнопки и другие элементы типа static. Мне его надо было толстым сделать, так у меня такие кнопки стали — загляденье:)) Кто-нибудь знает в чем дело и как решить?