学习windows编程 day6 之模拟记事本
生活随笔
收集整理的這篇文章主要介紹了
学习windows编程 day6 之模拟记事本
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//短的函數(shù)最好定義為宏
#define BUFFER(x,y) *(y*cxBuffer+x+pBuffer)//取出一個(gè)字符//字符消息
//WM_CHAR,WM_DEADCHAR,WM_SYSCHAR,WM_SYSDEADCHAR
//前兩個(gè)是由WM_KEYDOWN/UP消息產(chǎn)生,后兩個(gè)是由WM_SYSKEYDOWN/UP消息產(chǎn)生
//DEADCHAR是某些國家字母有符號,多種表現(xiàn)形式。有DEADCHAR會組合更多,但是我們有不到這個(gè)//消息參數(shù)
//wParam:指定該按鍵的虛擬鍵代碼
//在下面兩種消息中的含義
//----WM_KEYDOWN:虛擬鍵代碼 key
//----WM_CHAR:ANSI或Unicode字符碼(看宏定義區(qū)別) char//lParam
//擴(kuò)展鍵標(biāo)記(手冊)//消息排序 假設(shè)按下A鍵并釋放,大寫狀態(tài)關(guān)閉
//1.WM_KEYDOWN 'A'的虛擬按鍵代碼0x41 無論大小寫都是大寫的按鍵代碼,區(qū)別在WM_CHAR處
//2.WM_CHAR 'a'的虛擬按鍵代碼0x61
//3.WM_KEYUP 'A'的虛擬按鍵代碼0x41//若是持續(xù)按下‘A'鍵
//會循環(huán)1、2步驟,在抬起時(shí)走3//插入符號 一個(gè)程序共享一個(gè)插入符號 獲得焦點(diǎn)(活動窗口) 響應(yīng)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; //客戶區(qū)大小static int cxChar, cyChar; //字體大小static int cxCaret, cyCaret; //插入符位置static int cxBuffer, cyBuffer; //列數(shù)行數(shù)static TCHAR * pBuffer = NULL;int x, y, i;//用于循環(huán)使用switch (message){case WM_CREATE://獲取字體大小hdc = GetDC(hwnd);//系統(tǒng)默認(rèn)等寬字體
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);//獲取行數(shù)和列數(shù)cxBuffer = (int)cxClient / cxChar;cyBuffer = (int)cyClient / cyChar;cxBuffer = max(1, cxBuffer);cyBuffer = max(1, cyBuffer);//設(shè)置字符集指針的大小if (pBuffer!=NULL){free(pBuffer);}pBuffer = (TCHAR *)malloc(cxBuffer*cyBuffer*sizeof(TCHAR));//初始化這個(gè)空間for (y = 0; y < cyBuffer; y++){for (x = 0; x < cxBuffer; x++){BUFFER(x,y) = ' ';}}//設(shè)置光標(biāo)位置,左上角cxCaret = 0; cyCaret = 0;if (hwnd==GetFocus()){SetCaretPos(cxCaret*cxChar, cyCaret*cyChar);//設(shè)為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++)//用戶按鍵過快時(shí)
{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);//先隱藏光標(biāo)
HideCaret(hwnd);TextOut(hdc, cxCaret*cxChar, cyCaret*cyChar, &BUFFER(cxCaret, cyCaret), 1);if (++cxCaret == cxBuffer){cxCaret = 0;if (++cyCaret == cyBuffer){cyCaret = 0;}}//顯示光標(biāo)
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);
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/ssyfj/p/8520394.html
總結(jié)
以上是生活随笔為你收集整理的学习windows编程 day6 之模拟记事本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: week01-绪论
- 下一篇: JS forEach()与map()