Входно изходен интерфейс. Работа с клавиатура и мишка
| Информационни технологии | 2009-12-04 | 80 сваляния |
15 Входно/изходен интерфейс. Работа с клавиатура и мишка. Преобразуване съобщенията от клавиатура. Каретка. Поддържащи класове в MFC среда. Прозорци и събития, произхождащи от клавиатура и мишка.
-
Клавиатура
При инсталация на Windows се променя клавиатурният драйвер за DOS.
case WM_KEYDOWN :
switch (wParam){
case VK_HOME: ..... ; //виртуален код на Home
break;
case VK_END : ... ; //виртуален код на END
break;
Натискане на клавиш поражда съобщение или група от съобщения, които се отлагат в опашката на фокусираният прозорец. Натискането на клавиш генерира съобщемие, отпускането на клавиш друго съобщение, комбинация Alt + клавиш също поражда съобщение.
case WM_KEYDOWN :
switch (wParam){
case VK_xxxx: SendMessage(hwnd, message,wParam,lParam);
break;
WM_KEYDOWN виртуален код на а
WM_CHAR ASCII код на а
WM_KEYUP виртуален код на а
Когато се извлече WM_KEYDOWN от опашката .. ще char. Тогава фрагментът обработващ клавиатура може да се промени по следният начин:
case WM_CHAR :
switch(wParam):
{case 'b': ........; // backspace
break;
case 'n' : ........; // буква n
break;
default: ..........
Клавиатура в 32 битова среда (допълнения):
Съобщенията се пренасочват към помощният фокус прозорец.
Промяна на фокус :WM_SETFOCUS, WM_KILLFOKUS и съответно: ON_WM_SETFOCUS, ON_WM_KILLFOKUS в картата на съобщенията.
pOldWnd указател на прозорец който до сега е имал фокуса.
void CMainWindow::OnSetFocus( CWnd* pOldWnd){}
Същото е и при OnKillFocus той ще има за параметър новия прозорец, той ще получи фокус. Това важи само за прозорци, които се намират в един и същи thread.
-
Каретка.
Това е тази чертичка или правоъгълниче, което показва къде ще се изпише буквата. Тя трябва да се управлява от нас.
CWnd има 7 ф-ииза работа с каретка:
CreateCaret създава я от битмап
GetCaretPos
SetCaretPos
ShowCaret
HideCaret
-
Мишка.
-
При движение на мишката WM_MOUSEMOVE . Съобщенията от мишкатасе отлагат в опашката на прозореца над която е тя, а не на фокусирания.
- При натиснат бутон : WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK
Как можем да определим кога курсор влиза и излиза от рамката на прозорец:
влизането : в опашка се отлага WM_MOUSEMOVE.В windows 98 се появи и интересна ф-ия ::TrackMouseEvent() (за да проверим можем ли да я използваме:#define _WIN32_WINNT 0x0400 ).С тази ф-ия можем да укажем приложението ( с параметър HWND) да получава съобщния WM_MOUSELEAVE и WM_MOUSEHOVER.С Track_Mouse.Exent() можем да се регистрираме не искаме да получава и информация когато мишката напусне нашият прозорец и когато мишката остава неподвижна за да направим това нещо правим #define.WM_MOUSELEAVE и WM_MOUSEHOVER нямат привързване към функция т.е. трябва да предефинираме картата на съобщенията.
Още едно съобщение свързано с движението на командата MOUSEWILL
Прихващане на мишка:
CWnd::SetCapture()
::ReleaseCapture()
курсор на мишка
1.Създаване на курсор чрез WNDCLASS :
CString strWndClass = AfxRegisterWndClass(,AfxGetApp() LoadStandartCursor( IDC_CROSS),..); //в констр. на CMainWindow
..
Create( strWndClass,); // в CFrameWnd::Create() при създаване на прозореца рамка.
2. С API ф-ия ::SetCursor(m_hCursor);
Тагове от реферата: съобеният, виаура, преобуване, интерф











