日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

学习windows编程 day6 之模拟记事本

發布時間:2024/6/30 windows 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习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 之模拟记事本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。