Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 40

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 34 35 36 37 38 39 < 40 > 41 42 43 44 45 46 .. 173 >> Следующая

Изменение функции Initlnstance
Откройте файл TextDemo.cpp и добавьте обращение функции SetWindowText к функции Initlnstance.
// Единственное окно приложения отображается и обновляется m_pMainWnd->ShowWindow(SW_show); m_pMainWnd->UpdateWindow() ;
m_pMainWnd->SetWindowText ("Text Demo");
return TRUE;
}
Теперь можно построить и выполнить программу TextDemo, а также использовать новые полосы прокрутки отображаемого текста. Оставьте проект TextDemo открытым, чтобы в следующем параграфе добавить в программу некоторые дополнительные средства.
Чтение кодов
символов, вводимых с клавиатуры_
В этом параграфе вы узнаете, как воспринимается нажатие клавиши, когда окно программы активно. Подобно обработке сообщений мыши (см. гл. 10), при чтении кодов клавиш обеспечивается соответствующий обработчик сообщения в классе представления программы. Вначале вы узнаете, как задается обработчик сообщения wm_keydown, посылаемого при нажатии любой клавиши, кроме системной, а затем, как задается обработчик сообщения wm_char, посылаемого при нажатии символьной клавиши.
Обработка сообщения wm_keydown
При каждом нажатии клавиши система посылает сообщение wm_keydown окну, в котором в данный момент находится фокус ввода, принадлежащий либо активному окну, либо наследуемому из активного окна. Активное диалоговое окно имеет выделенный заголовок или рамку. В программе MFC, сгенерированной мастером AppWizard, при активном главном окне фокус содержится в окне представления, следовательно, при нажатии клавиши именно это окно получает сообщения wm_keydown. В MDI-приложении фокус находится в активном окне представления. Предоставление обработчика сообщения wm_keydown полезно, прежде всего, при визуализации сообщений клавиш, которые не генерируют печатные символы, например, стрелок и функциональных клавиш.
Примечание
Если нажимается системная клавиша, то окну с фокусом посылается сообщение wm_syskeydown, а не wm_keydown. Системными клавишами являются Prt Scr, Alt и любые другие, нажатые одновременно с Alt. Обычно системные клавиши обрабатывает Windows, а не программа приложения.
Для изучения обработки сообщения wm_keydown добавим в программу TextDemo клавиатурный интерфейс, позволяющий прокручивать текст, используя и клавиши, и полосы прокрутки. Откройте в Developer Studio проект TextDemo, а затем запустите мастер ClassWizard. В диалоговом окне мастера откройте вкладку Message Maps, а в списке Class Name выберите имя класса CTextDemoView, чтобы обработчик сообщения был добавлен классу представления (это необходимо, так как сообщения wm_keydown посылаются окну представления). В списке Object IDs выберите CTextDemoView, в списке Message — идентификатор wm_keydown. Затем щелкните на кнопке Add Function. ClassWizard добавит обработчик сообщения с именем OnKeyDown в класс представления программы.
Щелкните на кнопке Edit Code и добавьте в функцию OnKeyDown фрагмент программы, приведенный ниже.
void CTextDemoView::OnKeyDown(UINT nChar, uint nRepCnt, uint nFlags) {
// TODO: Здесь добавьте собственный код обработчика // и/или вызов стандартного обработчика
CSize DocSize = GetTotalSize () ; RECT ClientRect; GetClientRect(&ClientRect) ; switch(nChar) {
case VK_LEFT: // стрелка влево
if (ClientRect.right < DocSize.cx)
SendMessage (WMJHSCROLL, SB_LINELEFT); break ;
case VK_RIGHT: // стрелка вправо if (ClientRect.right < DocSize.cx)
SendMessage (WH_HSCROI_L, SB_LINERIGHT); break;
case VK_UP: // стрелка вверх
if (ClientRect.bottom < DocSlze.cy)
SendMessage (WM_VSCROLL, SB_LINEUP); break ;
case VK_DOWN: // стрелка вниз
if (ClientRect.bottom < DocSize.cy)
SendMessage (WM_VSCROLL, SB_LINEDOWN); break ;
case VK_HOME: // клавиша Home
if (::GetKeyState (VK_CONTROL) 6 0x8000) // нажата
// клавиша Ctrl
{
if (ClientRect.bottom < DocSize.cy)
SendHessage (WM_VSCROLL, SB_LEFT);
}
else // только клавиша Home
<
if (ClientRect.right < DocSize.cx)
SendMessage (WM_HSCROLL, SB_TOP);
break ;
case VK_END: // клавиша End
if (: .-GetKeyState <VK_CONTROL) & 0x8000) // нажата
// клавиша Ctrl
{
if (ClientRect.bottom < DocSize.cy)
SendMessage iWH_VSCROLL, SB_BOTTOM);
}
else // только клавиша End
{
if (ClientRect.right < DocSize.cx)
SendMessage (WM_SCROLL, SB_RIGHT);
)
break;
case VK_PRIOR: // клавиша PgUp
if (ClientRect.bottom < DocSize.cy)
SendMessage (WM_VSCROLL, SB_PAGEUP); break ;
case VK_NEXT: // клавиша PgDn
if (ClientRect.bottom < DocSize.cy)
SendUessage (WM_VSCROLL, SB_PAGEDOWN); break ;
}
CScrollView: :OnKeyDown(nChar, nRepCnt, nFlags);
I
Первый параметр, переданный в функцию OnKeyDown — это nChar. Он содержит значение, называемое виртуальным кодом клавиши, определяющим нажатую клавишу. Функция OnKeyDown использует этот код, чтобы выполнить переход к соответствующей подпрограмме. В табл. 18.6 приведен список виртуальных кодов клавиш, которые не генерируют сообщения wmchar. Клавиши, генерирующие сообщения wm char, описаны в следующем параграфе. Они обрабатываются функцией обработки сообщения wmchar, которая идентифицирует их по коду символа.
Предыдущая << 1 .. 34 35 36 37 38 39 < 40 > 41 42 43 44 45 46 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100