学习windows编程 day6 之模拟记事本
生活随笔
收集整理的這篇文章主要介紹了
学习windows编程 day6 之模拟记事本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//短的函數最好定義為宏
#define BUFFER(x,y) *(y*cxBuffer+x+pBuffer)//取出一個字符//字符消息
//WM_CHAR,WM_DEADCHAR,WM_SYSCHAR,WM_SYSDEADCHAR
//前兩個是由WM_KEYDOWN/UP消息產生,后兩個是由WM_SYSKEYDOWN/UP消息產生
//DEADCHAR是某些國家字母有符號,多種表現形式。有DEADCHAR會組合更多,但是我們有不到這個//消息參數
//wParam:指定該按鍵的虛擬鍵代碼
//在下面兩種消息中的含義
//----WM_KEYDOWN:虛擬鍵代碼 key
//----WM_CHAR:ANSI或Unicode字符碼(看宏定義區別) char//lParam
//擴展鍵標記(手冊)//消息排序 假設按下A鍵并釋放,大寫狀態關閉
//1.WM_KEYDOWN 'A'的虛擬按鍵代碼0x41 無論大小寫都是大寫的按鍵代碼,區別在WM_CHAR處
//2.WM_CHAR 'a'的虛擬按鍵代碼0x61
//3.WM_KEYUP 'A'的虛擬按鍵代碼0x41//若是持續按下‘A'鍵
//會循環1、2步驟,在抬起時走3//插入符號 一個程序共享一個插入符號 獲得焦點(活動窗口) 響應WM_SETFOCUS WM_KILLFOCUS
//createcaret,setcaretpos,showcaret,hidecaret.destroycaret
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc;RECT rect; PAINTSTRUCT ps;TEXTMETRIC tm;static int cxClient, cyClient; //客戶區大小static int cxChar, cyChar; //字體大小static int cxCaret, cyCaret; //插入符位置static int cxBuffer, cyBuffer; //列數行數static TCHAR * pBuffer = NULL;int x, y, i;//用于循環使用switch (message){case WM_CREATE://獲取字體大小hdc = GetDC(hwnd);//系統默認等寬字體
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));GetTextMetrics(hdc, &tm);cxChar = tm.tmAveCharWidth;cyChar = tm.tmHeight + tm.tmExternalLeading;ReleaseDC(hwnd, hdc);break;case WM_SIZE://獲取屏幕大小cxClient = LOWORD(lParam);cyClient = HIWORD(lParam);//獲取行數和列數cxBuffer = (int)cxClient / cxChar;cyBuffer = (int)cyClient / cyChar;cxBuffer = max(1, cxBuffer);cyBuffer = max(1, cyBuffer);//設置字符集指針的大小if (pBuffer!=NULL){free(pBuffer);}pBuffer = (TCHAR *)malloc(cxBuffer*cyBuffer*sizeof(TCHAR));//初始化這個空間for (y = 0; y < cyBuffer; y++){for (x = 0; x < cxBuffer; x++){BUFFER(x,y) = ' ';}}//設置光標位置,左上角cxCaret = 0; cyCaret = 0;if (hwnd==GetFocus()){SetCaretPos(cxCaret*cxChar, cyCaret*cyChar);//設為0,0處,先不需要顯示
}InvalidateRect(hwnd, NULL, TRUE);break;case WM_SETFOCUS:CreateCaret(hwnd, NULL, cxChar, cyChar);SetCaretPos(cxCaret*cxChar, cyCaret*cyChar);//左上角
ShowCaret(hwnd);break;case WM_KILLFOCUS:HideCaret(hwnd);DestroyCaret();break;case WM_KEYDOWN:switch (wParam){case VK_DOWN:cyCaret += 1;break;case VK_UP:cyCaret -= 1;break;case VK_LEFT:cxCaret -= 1;break;case VK_RIGHT:cxCaret += 1;break;case VK_DELETE:for (x = cxCaret; x < cxBuffer - 1;x++){BUFFER(x, cyCaret) = BUFFER(x + 1, cyCaret); }BUFFER(cxBuffer - 1, cyCaret) = ' ';HideCaret(hwnd);hdc = GetDC(hwnd);TextOut(hdc, 0, cyCaret*cyChar, &BUFFER(0, cyCaret), cxBuffer);//重繪這一行
ReleaseDC(hwnd, hdc);ShowCaret(hwnd);default:break;}cxCaret = max(0, cxCaret);cyCaret = max(0, cyCaret);cxCaret = min(cxCaret, cxBuffer - 1);cyCaret = min(cyCaret, cyBuffer - 1);SetCaretPos(cxCaret*cxChar, cyCaret*cyChar);break;case WM_CHAR:for (i = 0; i < (int)LOWORD(lParam);i++)//用戶按鍵過快時
{switch (wParam){case '\b':if (cxCaret>0){cxCaret--;SendMessage(hwnd, WM_KEYDOWN, VK_DELETE, 1);}break;default:BUFFER(cxCaret, cyCaret) = (TCHAR)wParam;hdc = GetDC(hwnd);//先隱藏光標
HideCaret(hwnd);TextOut(hdc, cxCaret*cxChar, cyCaret*cyChar, &BUFFER(cxCaret, cyCaret), 1);if (++cxCaret == cxBuffer){cxCaret = 0;if (++cyCaret == cyBuffer){cyCaret = 0;}}//顯示光標
ShowCaret(hwnd);ReleaseDC(hwnd, hdc);}}break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);GetClientRect(hwnd, &rect);for (y = 0; y < cyBuffer;y++){TextOut(hdc, 0, y*cyChar, &pBuffer[y*cxBuffer], cxBuffer);}EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}
?
轉載于:https://www.cnblogs.com/ssyfj/p/8520394.html
總結
以上是生活随笔為你收集整理的学习windows编程 day6 之模拟记事本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: week01-绪论
- 下一篇: java信息管理系统总结_java实现科