1. Trang chủ
  2. » Công Nghệ Thông Tin

Bàn phím trong lập trình c trên windows

19 338 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 172,8 KB

Nội dung

Bàn phím lập trình c windows Bàn phím lập trình c windows Bởi: Khuyet Danh BÀN PHÍM TRONG LẬP TRÌNH C TRÊN WINDOWS Trong môi trường tương tác đồ hoạ ngày có hai thành phần nhập liệu thiếu bàn phím (keyboard) thiết bị chuột (mouse) Tuy số ứng dụng không tiện lợi dùng bàn phím, chương trình trò chơi (game), hay mô đồ họa với thiết bị định vị thiết bị chuột chẳng hạn, bàn phím thiết bị thay máy tính Bàn phím hỗ trợ nhập liệu phong phú : chương trình soạn thảo văn thiếu việc nhập liệu từ bàn phím Nếu máy tính bị hư thiết bị chuột bị ta thực thi tác vụ ứng dụng cách bình thường Trong phần tìm hiểu thông điệp phát sinh từ bàn phím cách can thiệp để xử lý chúng Nền tảng sở bàn phím Windows nhận xử lý thông tin nhận từ bàn phím, qua hình thức thông điệp gởi cho ứng dụng Trong ứng dụng Windows thông điệp hệ điều hành chuyển cho hàm xử lý cửa sổ WndProc ứng dụng Windows cung cấp loại thông điệp khác để phân biệt tình phím gõ Tuy nhiên lúc phải xử lý toàn thông điệp đó, thông thường cần xử lý nửa thông điệp phát sinh từ bàn phím, thông điệp lại Windows xử lý mặc định Ví dụ, Windows bỏ qua nhấn phím Ctrl, Alt, Shift với phím khác, không muốn chặn để xử lý riêng cho ứng dụng Trong trường hợp muốn chặn để xử lý riêng cho mình, chẳng hạn tạo phím nóng (hotkey) phải ý tránh dùng trùng hợp với phím nóng mà Windows cung cấp Vì theo quyền ưu tiên, ứng dụng xử lý thông điệp làm cho hệ thống không hoạt động bình thường 1/19 Bàn phím lập trình c windows Thành phần giao tiếp chung hộp thoại (dialog) có nhiều giao tiếp với bàn phím, không cần quan tâm đến việc giao tiếp với bàn phím hộp thoại kích hoạt Xử lý bàn phím hộp thoại thường giao cho Windows xử lý Các điều khiển dùng hộp thoại hộp nhập liệu (edit box), hộp lựa chọn (check box), hay nút nhấn (button) điều có khả tự xử lý phím gõ vào trả lại thông báo phím gõ cho cửa sổ cha (parent window) Tuy vậy, với số điều khiển định theo ứng dụng ta phải xử lý thông điệp để tăng cường thêm sức mạnh thành phần điều khiển Tóm lại ứng dụng cấu thành từ thành phần điều khiển không quan tâm đến việc xử lý thông điệp từ bàn phím Khái niệm focus ứng dụng môi trường Windows Windows đưa khái niệm quan tâm (focus) cho ứng dụng chạy đồng thời thời điểm Vì có bàn phím, nên Windows phải quản lý phân phối thông điệp gõ vào cho ứng dụng Thông thường, có trường hợp Windows : số ứng dụng chạy kích hoạt (active) hay ứng dụng chạy Khi có chương trình ứng dụng kích hoạt Windows xem ứng dụng nhận quan tâm.Trong ứng dụng có nhiều cửa sổ, thời điểm cửa sổ nhận quan tâm Theo chế này, Windows cung cấp dạng gọi hàng đợi thông điệp Mỗi thông điệp đưa vào hàng đợi xử lý thông điệp Windows phân phối đến ứng dụng tương ứng Hàm DispatchMessage vòng lặp xử lý thông điệp chịu trách nhiệm chuyển thông điệp đến thủ tục xử lý cửa sổ WndProc cửa sổ tương ứng Một cửa sổ xác định trạng thái quan tâm cách chặn thông điệp WM_SETFOCUS, WM_KILLFOCUS hàm xử lý WndProc Thông điệp WM_SETFOCUS cho cửa sổ biết thời điểm nhận quan tâm Windows ngược lại WM_KILLFOCUS thông báo cho cửa sổ biết quan tâm từ Windows Phần sau giới thiệu kỹ xử lý thông điệp Cơ chế hàng đợi quản lý hàng đợi Trong Windows người dùng nhấn nhả phím bàn phím, thông qua trình điều khiển thiết bị bàn phím (keyboard driver) diễn dịch mã quét (scan code) phần cứng sang hình thức thông điệp Trước hết Windows tạm thời lưu trữ thông điệp vào hàng đợi thông điệp hệ thống (system message queue) Hàng đợi thông điệp hệ thống Windows hàng đợi quản lý thao tác tiền xử lý thông tin nhập từ bàn phím chuột Windows lấy thông điệp hàng đợi xử lý gởi đến hàng đợi ứng dụng ứng dụng xử lý xong thông điệp bàn phím thiết bị chuột trước 2/19 Bàn phím lập trình c windows Lý mà Windows phải chia thành hai giai đoạn trình nhận gởi thông điệp từ bàn phím đến hàng đợi ứng dụng việc đồng hóa với tiến trình Nếu Windows không quản lý hàng đợi hệ thống khó đồng tiến trình ứng dụng Ví dụ, cửa sổ nhận quan tâm chuẩn bị xử lý thông điệp Người dùng gõ phím nhanh thông điệp trước chưa xử lý xong Giả sử người dùng muốn chuyển qua ứng dụng khác nhấn Alt-Tab, thông điệp bàn phím đưa vào hàng đợi hệ thống phân phát cho ứng dụng đưa vào hàng đợi ứng dụng Với tính đồng hóa Windows thông điệp từ bàn phím đảm bảo chuyển giao cho cửa sổ tương ứng Xử lý thông điệp từ bàn phím Thông điệp từ thao tác nhấn nhả phím Thao tác nhập liệu từ bàn phím thao tác nhấn nhả phím Khi thao tác nhấn phím bàn phím thực Windows phát sinh thông điệp WM_KEYDOWN hay WM_SYSKEYDOWN đưa vào hàng đợi thông điệp ứng dụng hay cửa sổ nhận quan tâm (focus) Cũng tương tự, ta nhả phím thông điệp WM_KEYUP hay WM_SYSKEYUP hệ điều hành phân phát tới hàng đợi Khi thực thao tác nhập từ bàn phím việc nhấn (down) nhả (up) phải đôi với Tuy nhiên, nhấn phím giữ Windows phát sinh hàng loạt thông điệp WM_KEYDOWN hay WM_SYSKEYDOWN, với thao tác nhả phát sinh thông điệp WM_KEYUP hay WM_SYSKEYUP Các thông điệp gởi đến hàm WndProc cử sổ nhận quan tâm Windows Ngoài biết thời điểm mà thông điệp phím gõ vào lúc cách dùng hàm GetMessageTime Như thấy dòng thao tác nhấn hay thả có hai dạng thông điệp khác WM_KEYDOWN WM_SYSKEYDOWN thao tác nhấn, tương tự thao tác nhả Thông điệp có tiếp đầu ngữ "SYS" thường phát sinh người dùng nhấn phím gõ hệ thống Khi người dùng nhấn phím Alt kết hợp với phím khác thường phát sinh thông điệp WM_SYSKEYDOWN WM_SYSKEYUP Đối với tổ hợp phím Alt, chức thường gọi mục chọn trình đơn menu ứng dụng hay trình đơn hệ thống system menu dùng để chuyển đổi tác vụ nhiều ứng dụng khác (phím Alt+Tab hay Alt+Esc), đóng cửa sổ ứng dụng kết hợp với phím chức F4 Khi xây dựng chương trình ứng dụng, thường quan tâm đến thông điệp WM_SYSKEYDOWN thông điệp WM_SYSKEYUP Chúng ta cần dùng hàm DefWindowProc cuối hàm WndProc cửa sổ nhận thông điệp Windows 3/19 Bàn phím lập trình c windows chịu trách nhiệm xử lý thông điệp dạng hệ thống này, có tác vụ đặc biệt chặn thông điệp để xử lý Tuy nhiên ta không nên làm chương trình chạy không bình thường ứng dụng khác Không phải giao phó hoàn toàn cho Windows xử lý thông điệp hệ thống ứng dụng, mà Windows xử lý thông điệp hệ thống đưa thông điệp bình thường khác đến ứng dụng Ví dụ nhấn phím Alt+Tab Windows tạo thông điệp hệ thống gởi vào hàng đợi ứng dụng không xử lý thông điệp theo mặc định hàm DefWindowProc xử lý trả thông điệp WM_KILLFOCUS cho ứng dụng, ứng dụng dễ dàng xử lý Tóm lại thông điệp WM_KEYDOWN WM_KEYUP thường sinh phím nhấn thông thường không kết hợp với phím Alt Nếu chương trình bỏ qua không xử lý thông điệp Windows không tạo thông điệp hay xử lý đặc biệt Các thông điệp phát sinh từ bàn phím Sau bảng mô tả thông điệp phát sinh từ bàn phím (theo thứ tự Alphabet) Mô tả thông điệp phát sinh từ bàn phím Thông điệp Nguyên nhân phát sinh WM_ACTIVATE Thông điệp gởi đến cửa sổ bị kích hoạt cửa sổ không bị kích hoạt Nếu cửa sổ hàng đợi nhập liệu, thông điệp truyền cách đồng bộ, thủ tục Windows cửa sổ bị kích hoạt, sau đến thủ tục cửa sổ kích hoạt Nếu cửa sổ không nằm hàng đợi thông điệp gởi cách không đồng bộ, cửa sổ kích hoạt Thông báo đến cửa sổ người dùng tạo kiện lệnh ứng dụng, ví dụ người dùng kích vào button sử WM_APPCOMMAND dụng chuột hay đánh vào kí tự kích hoạt lệnh ứng dụng WM_CHAR Thông điệp gởi tới cửa sổ có quan tâm thông điệp WM_KEYDOWN dịch từ hàm TranslateMessage Thông điệp WM_CHAR có chứa mã kí tự phím nhấn WM_DEADCHAR Thông điệp gởi tới cửa sổ có quan tâm thông điệp WM_KEYUP xử lý từ hàm 4/19 Bàn phím lập trình c windows TranslateMessage Thông điệp xác nhận mã kí tự phím dead key nhấn Phím dead key phím kết hợp để tạo kí tự ngôn ngữ tiếng anh (xuất bàn phím hỗ trợ ngôn ngữ khác tiếng Anh) WM_GETHOTKEY Ứng dụng gởi thông điệp để xác định phím nóng liên quan đến cửa sổ Để gởi thông điệp dùng hàm SendMessage WM_HOTKEY Thông điệp gởi người dùng nhấn phím nóng đăng kí RegisterHotKey WM_KEYDOWN Thông điệp gởi cho cửa sổ nhận quan tâm người dùng nhấn phím bàn phím Phím phím hệ thống (Phím nhấn phím Alt) WM_KEYUP Thông điệp gởi cho cửa sổ nhận quan tâm người dùng nhả phím nhấn trước đó.Phím phím hệ thống (Phím nhấn phím Alt) WM_KILLFOCUS Thông điệp gởi tới cửa sổ nhận quan tâm trước quyền WM_SETFOCUS Thông điệp gởi tới cửa sổ sau cửa sổ nhận quan tâm Windows WM_SETHOTKEY Ứng dụng gởi thông điệp đến cửa sổ liên quan đến phím nóng, người dùng nhấn phím nóng cửa sổ tương ứng liên quan tới phím nóng kích hoạt WM_SYSCHAR Thông điệp gởi tới cửa sổ nhận quan tâm hàm TranslateMesage xử lý xong thông điệp WM_SYSKEYDOWN Thông điệp WM_SYSCHAR chứa mã cửa phím hệ thống Phím hệ thống phím có chứa phím Alt tổ hợp phím khác Thông điệp gởi tới cửa sổ nhận quan tâm thông điệp WM_SYSKEYDOWN biên dịch WM_SYSDEADCHAR hàm TranslateMessage Thông điệp xác nhận mã kí tự phím hệ thống deadkey nhấn WM_SYSKEYDOWN Thông điệp gởi tới cửa sổ nhận quan tâm người dùng nhấn phím F10 hay nhấn Alt trước nhấn phím khác Thông điệp gởi không 5/19 Bàn phím lập trình c windows có cửa sổ nhận quan tâm lúc cửa sổ nhận cửa sổ kích hoạt (Active) WM_SYSKEYUP Thông điệp gởi tới cửa sổ nhận quan tâm người dùng nhấn phím mà trước giữ phím Alt Cũng tương tự cửa sổ nhận quan tâm thông điệp gởi cho cửa sổ kích hoạt Mã phím ảo (Virtual key code) Windows cung cấp khái niệm phím ảo nhằm tách rời với thiết bị bàn phím hay nói cách khác tiến tới độc lập thiết bị với bàn phím Khi phím nhấn phần cứng vật lý phát sinh mã quét (scan code), bàn phím tương thích IBM phím gán với mã ví dụ phím W 17, phím E 18, phím R 19 Cách xếp túy dựa vị trí vật lý phím bàn phím Những người xây dựng nên Windows nhận thấy dùng trực tiếp mã quét không thích hợp bị lệ thuộc vào bàn phím tương lai Do họ cố xử lý bàn phím cách độc lập thiết bị hơn, cách tạo bảng định nghĩa tập giá trị phím tổng quát mà sau gọi mã phím ảo Một số giá trị bàn phím ảo mà ta không thấy xuất bàn phím IBM tương thích tìm thấy chúng bàn phím nhà sản xuất khác hay chúng để dành cho bàn phím tương lai Các giá trị phím ảo định nghĩa tập tin tiêu đề WINUSER.H bắt đầu với tiếp đầu ngữ VK_xxxxx sau bảng mô tả phím ảo thông dụng Windows giao tiếp với bàn phím IBM tương thích Mô tả phím ảo Thập phân Thập lục phân Hằng phím định nghĩa WINUSER.H Windows dùng 01 VK_LBUTTON Nút chuột trái 02 VK_RBUTTON Nút chuột phải 03 VK_CANCEL 04 VK_MBUTTON X Bàn phím IBM tương thích Ctrl –Break Nút chuột Các thông điệp nhận dùng chuột, ta không nhận thông điệp gõ từ bàn phím Không nên dùng phím Ctrl–Break ứng dụng Windows, phím thường ngắt ứng dụng DOS Những giá trị phím ảo tiếp sai dành cho phím Backspace, Tab, Enter, Escape, Spacebar dùng nhiều chương trình Windows 6/19 Bàn phím lập trình c windows Mô tả phím ảo Thập phân Thập lục phân Hằng phím định nghĩa WINUSER.H Windows Bàn phím IBM tương thích dùng 08 VK_BACK X Backspace 09 VK_TAB X Tab 12 0C VK_CLEAR X Phím số NumPad với đền Numlock tắt 13 0D VK_RETURN X Enter (cho hai phím) 16 10 VK_SHIFT X Shift (cho hai phím) 17 11 VK_CONTROL X Ctrl (cho hai phím) 18 12 VK_MENU X Alt (cho hai phím) 19 13 VK_PAUSE X Pause 20 14 VK_CAPITAL X Caps Lock 27 1B VK_ESCAPE X Esc 32 20 VK_SPACE X Spacebar Bảng mô tả phím ảo tiếp sau phím thường sử dụng nhiều Windows Mô tả phím ảo (tiếp theo) Thập phân Thập lục phân Hằng phím định nghĩa WINUSER.H Windows dùng Bàn phím IBM tương thích 33 21 VK_PRIOR X Page Up 34 22 VK_NEXT X Page Down 35 23 VK_END X End 36 24 VK_HOME X Home 37 25 VK_LEFT X Phím trái 38 26 VK_UP X Phím mũi tên lên 39 27 VK_RIGHT X Phím phải 40 28 VK_DOWN X Phím xuống 7/19 Bàn phím lập trình c windows 41 29 VK_SELECT - 42 2A VK_PRINT - 43 2B VK_EXECUTE - 44 2C VK_SNAPHOT Print Screen 45 2D VK_INSERT X Insert 46 2E VK_DELETE X Delete 47 2F VK_HELP Một số phím ảo VK_SELECT, VK_PRINT, VK_EXECUTE, hay VK_HELP thường xuất bàn phím giả lập mà nhìn thấy Tiếp sau mã phím ảo phím số phím chữ bàn phím Trong bàn phím bổ sung phím Num Pad qui định riêng Mô tả phím chữ số bàn phím Thập phân Thập Hằng phím định nghĩa lục phân WINUSER.H Windows Bàn phím IBM tương thích dùng 48-57 30-39 Không X Từ phím đến phím bàn phím 65-90 41-5A Không X Từ phím A đến phím Z Mã phím ảo bảng với mã ASCII kí tự mà phím thể Trong ứng dụng Windows thường không dùng mã phím ảo mà thay vào ứng dụng xử lý thông điệp kí tự dành cho kí tự có mã ASCII Cuối mã phím ảo bàn phím mở rộng Num Pad (bên phải bàn phím) phím chức (F1, F2, F3 ) Mô tả phím bổ sung Thập phân Thập Hằng phím định nghĩa lục phân WINUSER.H Windows Bàn phím IBM tương dùng thích 96-105 60-69 VK_NUMPAD0 đến VK_NUMPAD9 Phím – đèn Num Lock bật 106 6A VK_MULTIPLY Phím * 107 6B VK_ADD Phím + 8/19 Bàn phím lập trình c windows 108 6C VK_SEPARATOR 109 6D VK_SUBTRACT Phím - 110 6E VK_DECIMAL Phím 111 6F VK_DIVIDE Phím / 112-121 70-79 VK_F1 đến VK_F10 X Phím F1 đến F10 122-135 7A-87 VK_F11 đến VK_F24 Phím F11 đến F24 144 90 VK_NUMLOCK Num Lock 145 91 VK_SCROLL Scroll Lock Một số phím ảo F13- F24 Windows tạo phòng hờ cho bàn phím sau Thường ứng dụng Windows dùng phím F1 – F10 mà Các tham số wParam lPram thông điệp phát sinh từ bàn phím Trong thông điệp phím gõ (WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP) tham số wParam nhận giá trị mã phím ảo Còn tham số lParam chứa thông tin chi tiết phím gõ vào Bảng sau mô tả thông tin chứa 32 bit tham số lParam Mô tả thông tin chứa tham số lParam Bit nhận dạng Nội dung 0-15 Chứa số lần phím nhấn xuống Nếu nhấn nhả giá trị 1, giữ phím số lập tăng theo 16-23 Chứa mã quét OEM (Original Equipment Manufacturer) phát sinh từ phần cứng, ta không quan tâm đến thông tin 24 Cờ có giá trị phím nhấn phím thuộc nhóm phím mở rộng bàn phím IBM tương thích hay phím Alt, Ctrl bên phải bàn phím nhấn Windows quan tâm đến giá trị cờ 29 Mã ngữ cảnh phím (Context code), cờ có giá trị phím Alt nhấn, điều tương ứng với thông điệp WM_SYSKEYDOWN hay WM_SYSKEYUP phát sinh 30 Trạng thái phím trước đó, trường cho biết phím trước trạng thái nhả, phím trước trạng thái nhấn 9/19 Bàn phím lập trình c windows 31 Trạng thái dịch chuyển phím, cờ phím nhấn, phím nhấn Đoạn chương trình minh họa Đoạn chương trình minh họa chương trình nhỏ nhập kí tự từ bàn phím xuất hình #define BUFSIZE 65535; #define SHIFTED 0x8000; LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { HDC hdc; // Thiết bị ngữ cảnh TEXTMETRIC tm; // Cấu trúc metric văn static DWORD dwCharX; // Bề ngang kí tự static DWORD dwCharY; // Chiều dài kí tự static DWORD dwClientX; // Bề ngang vùng làm việc static DWORD dwClientY; // Chiều dài vùng làm việc static DWORD dwLineLen; // Chiều dài dòng static DWORD dwLines; // Số dòng văn vùng làm việc static int nCaretPosX = 0; // Tọa độ x caret static int nCaretPosY = 0; // Tọa độ y caret static int nCharWidth = 0; // Bề dày kí tự static int cch = 0; // Số kí tự buffer static int nCurChar = 0; // Chỉ đến kí tự thời buffer static PTCHAR pchInputBuf; // Kí tự tạm đưa vào buffer 10/19 Bàn phím lập trình c windows int i, j; // Biến lặp int cCR = 0; // Số kí tự xuống dòng int nCRIndex = 0; // Chỉ đến kí tự xuống dòng cuối int nVirtKey; // Mã phím ảo TCHAR szBuf [128]; // Buffer tạm TCHAR ch; // Kí tự PAINTSTRUCT ps; // Dùng cho hàm BeginPaint RECT rc; // Hình chữ nhật hàm DrawText SIZE sz; // Kích thước chuỗi COLORREF crPrevText; // Màu văn COLORREF crPrevBk; // Màu switch ( message ) { case WM_CREATE: /* Lấy thông tin font thời */ hdc = GetDC ( hWnd ); GetTextMetrics ( hdc, &tm ); ReleaseDC ( hWnd, hdc ); dwCharX = tm.tmAveCharWidth; dwCharY = tm.tmHeight; /* Cấp phát nhớ đệm để lưu kí tự nhập vào */ pchInputBuf = (LPTSTR)GlobalAlloc( GPTR,BUFSIZE * sizeof ( TCHAR ) ); 11/19 Bàn phím lập trình c windows return 0; case WM_SIZE: /* Lưu giữ kích thước vùng làm việc */ dwClientX = LOWORD ( lParam ); dwClientY = HIWORD ( lParam ); /* Tính kích thước tối đa dòng số dòng tối đa vùng làm việc */ dwLineLen = dwClientX - dwCharX; dwLines = dwClientY / dwCharY; break; case WM_SETFOCUS: /* Tạo hiển thị caret cửa sổ nhận quan tâm */ CreateCaret ( hWnd, ( HBITMAP ) 1, 0, dwCharY ); SetCaretPos ( nCaretPosX, nCaretPosY * dwCharY ); ShowCaret ( hWnd ); break; case WM_KILLFOCUS: /*Ẩn caret hủy cửa sổ không nhận quan tâm */ HideCaret ( hWnd ); DestroyCaret ( ); break; case WM_CHAR: 12/19 Bàn phím lập trình c windows switch ( wParam ) { case 0x08: // Backspace case 0x0A: // Linefeed case 0x1B: // Escape MessageBeep( ( UINT ) –1 ); return 0; case 0x09: // tab /* Chuyển phím tab thành kí tự trắng liên tục */ for ( i = 0; i < 4; i ++ ) SendMessage (hWnd, WM_CHAR, 0x20, 0); return 0; case 0x0D: // Xuống dòng /* Lưu kí tự xuống dòng tạo dòng đưa caret xuống vị trí */ pchInputBuf [ cch++ ] = 0x0D; nCaretPosX = 0; nCaretPosY += 1; break; default: // Xử lý kí tự hiển thị ch = ( TCHAR ) wParam; HideCaret ( hWnd ); 13/19 Bàn phím lập trình c windows /* Lấy bề dày kí tự xuất */ hdc = GetDC ( hWnd ); GetCharWidth32 ( hdc, (UINT) wParam, (UINT)wParam, &nCharWidth ); TextOut(hdc, nCaretPosX, nCaretPosY*dwCharY, &ch, 1); ReleaseDC ( hWnd, hdc ); /* Lưu kí tự vào buffer */ pchInputBuf [ cch++ ] = ch; /* Tính lại vị trí ngang caret Nếu vị trí tới cuối dòng chèn thêm kí tự xuống dòng di chuyển caret đến dòng */ nCaretPosX += nCharWidth; if ( ( DWORD ) nCaretPosX > dwLineLen ) { nCaretPosX = 0; pchInputBuf [ cch++ ] = 0x0D; ++nCaretPosY; } nCurChar = cch; ShowCaret ( hWnd ); break; } SetCaretPos ( nCaretPosX, nCaretPosY * dwCharY ); break; 14/19 Bàn phím lập trình c windows case WM_KEYDOWN: switch ( wParam ) { case VK_LEFT: // LEFT arrow /* Caret di chuyển qua trái đến đầu dòng */ if ( nCaretPosX > ) { HideCaret ( hWnd ); /* Tính toán lại vị trí caret qua trái */ ch = pchInputBuf [ nCurChar ]; hdc = GetDC ( hWnd ); GetCharWidth32 ( hdc, ch, ch, &nCharWidth ); ReleaseDC ( hWnd, hdc ); nCaretPosX=max(nCaretPosX-nCharWidth,0 ); ShowCaret ( hWnd ); } break; case VK_RIGHT: // RIGHT arrow /* Di chuyển caret sang phải */ if (nCurChar < cch) { HideCaret ( hWnd ); 15/19 Bàn phím lập trình c windows /* Tính toán lại vị trí caret sang phải */ ch = pchInputBuf [ nCurChar ]; if ( ch == 0x0D ) { nCaretPosX = 0; nCaretPosY++; } /* Nếu kí tự enter kiểm tra xem phím shift có nhấn hay không Nếu có nhấn đổi màu xuất hình */ else { hdc = GetDC ( hWnd ); nVirtKey = GetKeyState ( VK_SHIFT ); if ( nVirtKey & SHIFTED ) { crPrevText=SetTextColor( hdc,RGB (255, 255, 255) ); crPrevBk= SetBkColor(hdc,RGB(0,0,0)); TextOut(hdc,nCaretPosX,nCaretPosY*dwCharY, &ch,1 ); SetTextColor ( hdc, crPrevText ); SetBkColor ( hdc, crPrevBk ); } GetCharWidth32(hdc,ch,ch,&nCharWidth); 16/19 Bàn phím lập trình c windows ReleaseDC ( hWnd, hdc ); nCaretPosX = nCaretPosX + nCharWidth; } nCurChar++; ShowCaret ( hWnd ); break; } break; case VK_UP: // Phím mũi tên lên case VK_DOWN: // Phím mũi tên xuống MessageBeep ( (UINT) –1 ); return 0; case VK_HOME: // Phím home /* Thiết lập vị trí caret dòng */ nCaretPosX = nCaretPosY = 0; nCurChar = 0; break; case VK_END: // Phím end /* Di chuyển cuối văn lưu vị trí kí tự xuống dòng cuối */ for ( i=0; i < cch; i++ ) { if ( pchInputBuf [ i ] == 0x0D ) 17/19 Bàn phím lập trình c windows { cCR++; nCRIndex = i + 1; } } nCaretPosY = cCR; /* Chép tất kí tự từ kí tự xuống dòng cuối đến kí tự thời vừa nhập từ bàn phím vào nhớ đệm */ for ( i = nCRIndex, j = 0; i < cch; i++, j++ ) szBuf [ j ] = pchInputBuf [ i ]; szBuf [ j ] = TEXT ( '\0' ); /* Tính vị trí dọc caret */ hdc = GetDC ( hWnd ); GetTextExtentPoint32(hdc,szBuf, lstrlen(szBuf), &sz ); nCaretPosX = sz.cx; ReleaseDC ( hWnd, hdc ); nCurChar = cch; break; default: break; } SetCaretPos( nCaretPosX, nCaretPosY*dwCharY ); break; 18/19 Bàn phím lập trình c windows case WM_PAINT: if ( cch == ) break; hdc = BeginPaint ( hWnd, &ps ); HideCaret ( hWnd ); SetRect ( &rc, 0, 0, dwLineLen, dwClientY ); DrawText ( hdc, pchInputBuf, -1, &rc, DT_LEFT ); ShowCaret ( hWnd ); EndPaint ( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage ( ); /* Giải phóng buffer */ GlobalFree ( ( HGLOBAL) pchInputBuf ); UnregisterHotKey ( hWnd, 0xAAAA ); break; default: return DefWindowProc ( hWnd, message, wParam, lParam ); } return NULL; } 19/19

Ngày đăng: 20/10/2016, 05:44

TỪ KHÓA LIÊN QUAN