- •«Программирование внешних устройств»
- •Механизм сообщений от клавиатуры.
- •Коды oem, ansi, ascii, виртуальные коды.
- •Виртуальные клавиши.
- •Символьные сообщения.
- •Системные сообщения.
- •Преобразование кодов.
- •Как отличить нажатия совпадающих клавиш.
- •Как узнать ввод строчных и прописных букв.
- •Фокус ввода.
- •Захват и освобождение окном мыши.
- •Обработка сообщений от мыши.
- •Функция таймера.
Фокус ввода.
//При создании окна необходимо указать WS_TABSTOP. Клавиша TAB перемещает пользователя в следующее управление, определенное стилем WS_TABSTOP.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{ hWnd = CreateWindow(szWindowClass, L"111", WS_OVERLAPPEDWINDOW|WS_TABSTOP,
10, 10, 600, 200, NULL, NULL, hInst, NULL);
hWnd2 = CreateWindow(L"20", L"222", WS_OVERLAPPEDWINDOW|WS_TABSTOP,
10, 220, 600, 200, NULL, NULL, hInstance, NULL);
hWnd3 = CreateWindow(L"30", L"333", WS_OVERLAPPEDWINDOW|WS_TABSTOP,
10, 430, 600, 200, NULL, NULL, hInstance, NULL);}
//оконная процедура первого окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ case WM_KEYDOWN:
switch(wParam)
{case VK_TAB: //обработчик клавиши TAB
SetActiveWindow(hWnd3); //делает окно активным
SetFocus(hWnd3); //устанавливает в данное окно фокус ввода
if ((!SetFocus(hWnd3)) & (!SetActiveWindow(hWnd3))) TextOut(hdc, 0, 0, L"Error", 2);
break;
}break;}
//оконная процедура второго окна
RESULT CALLBACK WndProc2(HWND hWnd2, UINT message, WPARAM wParam, LPARAM lParam)
{ case WM_KEYDOWN:
switch(wParam)
{case VK_TAB: //обработчик клавиши TAB
SetActiveWindow(hWnd); //делает окно активным
SetFocus(hWnd); //устанавливает в данное окно фокус ввода
if ((!SetFocus(hWnd)) & (!SetActiveWindow(hWnd))) TextOut(hdc, 0, 0, L"Error", 2);
break;
}break;}
//оконная процедура третьего окна
LRESULT CALLBACK WndProc3(HWND hWnd3, UINT message, WPARAM wParam, LPARAM lParam)
{case VK_TAB: //обработчик клавиши TAB
SetActiveWindow(hWnd2); //делает окно активным
SetFocus(hWnd2); //устанавливает в данное окно фокус ввода
if ((!SetFocus(hWnd2)) & (!SetActiveWindow(hWnd2))) TextOut(hdc, 0, 0, L"Error", 2);
break;
}break;}
Захват и освобождение окном мыши.
LRESULT CALLBACK WndProc3(HWND hWnd3, UINT message, WPARAM wParam, LPARAM lParam)
{ case WM_KEYDOWN:
switch(wParam)
{case VK_UP: // если нажата стрелка вверх, то
SetCapture(hWnd3); // после вызова этой функции все сообщения мыши посылаются в оконную процедуру окна №3.
InvalidateRect(hWnd3, NULL, TRUE); //заставляет Windows поместить сообщение WM_PAINT в очередь сообщений оконной процедуры №3.
UpdateWindow(hWnd3); // для перерисовки окна сразу после его изменения.
TextOut(hdc, 0, 20, L"Область окна захвачена.", 23);
break;
case VK_DOWN: // обрабатывает сообщение нажатия стрелки вниз.
ReleaseCapture();// возвращает обработку мыши в нормальный режим.
InvalidateRect(hWnd3, NULL, TRUE);
UpdateWindow(hWnd3);
TextOut(hdc, 0, 20, L"Область окна освобождена.", 25);
break;
break;}
Обработка сообщений от мыши.
// В данной работе иллюстрация работы мыши производится в окне №3.
LRESULT CALLBACK WndProc3(HWND hWnd3, UINT message, WPARAM wParam, LPARAM lParam)
{case WM_LBUTTONDOWN: // если нажата левая кнопка мыши то окно изменяет свое положение.
b=SetWindowPos(hWnd, NULL, 100, 30, 600, 200, NULL);
b2=SetWindowPos(hWnd2, NULL, 250, 250, 600, 200, NULL);
b3=SetWindowPos(hWnd3, NULL, 350, 460, 600, 200, NULL);
break;}
Координаты x, y.
// В данной работе иллюстрация работы мыши производится в окне №3.
LRESULT CALLBACK WndProc3(HWND hWnd3, UINT message, WPARAM wParam, LPARAM lParam)
{case WM_MOUSEMOVE: //генерация сообщения на движение мыши
TextOut(hdc, 0, 0, L"Координаты мыши: ", 17);
x=LOWORD(lParam);
y=HIWORD(lParam);
coord=wsprintf(buf,L"%d, %d", x, y);
TextOut(hdc, 130, 0, buf, coord);
break;}
Курсор мыши. Управление курсором.
// В данной работе иллюстрация работы мыши производится в окне №3.
LRESULT CALLBACK WndProc3(HWND hWnd3, UINT message, WPARAM wParam, LPARAM lParam)
{case WM_KEYDOWN:
switch(wParam)
{case VK_LEFT: //если нажата стрелка влево, то курсор виден.
ShowCursor(TRUE);
break;
case VK_RIGHT: //если нажата стрелка вправо, то курсор исчезает.
ShowCursor(FALSE);
break;}
break;}
Сообщения мыши в клиентской и не клиентской области окна.
// В данной функции обрабатывается сообщение WM_NCMOUSEMOVE,,которое говорит о том что мышь в не клиентской области.
LRESULT CALLBACK WndProc3(HWND hWnd3, UINT message, WPARAM wParam, LPARAM lParam)
{case WM_NCMOUSEMOVE:
TextOut(hdc, 0, 60, L"Мышь в неклиентской области", 27);
break;}
Установка и снятие таймера.
//В данной функции устанавливается таймер для 1-го окна. По истечении 3 секундпоявится окно "111".
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{SetTimer(hWnd, sec1, 3000, NULL);}
//В данной оконной процедуре находится обработчик для таймера. В этой же процедуре «убивается» таймер.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ case WM_TIMER: //генерирует сообщения от таймера.
ShowWindow(hWnd, a);
UpdateWindow(hWnd);
KillTimer(hWnd,sec1); //останавливает поток сообщений WM_TIMER даже во время обработки сообщений.
break;}