简易文本编辑器分析

来源:互联网 发布:桂圆淘宝 编辑:程序博客网 时间:2024/04/29 00:48

一、消息机制分析

编辑代码的时候,直接源文件编辑

switch (message)       {       case WM_INPUTLANGCHANGE:  //当输入法发生切换时,此消息发送          dwCharSet = wParam ;  //wParam参数是新输入法使用的字符集                                        // fall through        case WM_CREATE:            hdc = GetDC (hwnd) ;            SelectObject (hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0,                                     dwCharSet, 0, 0, 0, FIXED_PITCH  , NULL)) ;                        GetTextMetrics (hdc, &tm) ;            cxChar = tm.tmAveCharWidth ;            cyChar = tm.tmHeight ;                        DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ;            ReleaseDC (hwnd, hdc) ;     case WM_SIZE://清空内存区,把内存区置为空格字符,然后设置光标为0,0位置,最后刷新,重新绘制这边没有用break;   swith(i) case 结构  case 1 , case 2, case 3 等价于 if i =1 jmp case1if i = 2 jmp case2if i = 3 jmp case3case1case2case3

二、交互性分析

1、重绘消息处理

case WM_PAINT //将内存中所有字符全部输出hdc = BeginPaint (hwnd, &ps) ;                        SelectObject (hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0,                                     dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)) ;                                            for (y = 0 ; y < cyBuffer ; y++)                 TextOut (hdc, 0, y * cyChar, & BUFFER(0,y), cxBuffer) ;              DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ;            EndPaint (hwnd, &ps) ;            return 0 ;


2、字符输入消息处理

case WM_CHAR:  //每输入一个字符,则将其所在内存区域的位置定位到TextOut()中的x,y,再将其输出,WM_SIZE消息已经将内存区置为' ';所以后面的不会输出//然后,再换一行,验证是否到本行的终点,到了则行位置为0;再++列,判断是否到了所在行的列末尾,到了则列置0,          for (i = 0 ; i < (int) LOWORD (lParam) ; i++)            {                 switch (wParam)                 { case x...  break;;//这里是光标控制处理                    default:                      // character codes                       BUFFER (xCaret, yCaret) = (TCHAR) wParam ;                                            HideCaret (hwnd) ;                      hdc = GetDC (hwnd) ;                                  SelectObject (hdc, CreateFont (0, 0, 0, 0, 0, 0, 0, 0,                                     dwCharSet, 0, 0, 0, FIXED_PITCH, NULL)) ;                        TextOut (hdc, xCaret * cxChar, yCaret * cyChar,                               & BUFFER (xCaret, yCaret), 1) ;                        DeleteObject (                           SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ;                      ReleaseDC (hwnd, hdc) ;                      ShowCaret (hwnd) ;                        if (++xCaret == cxBuffer)                      {                           xCaret = 0 ;                                                      if (++yCaret == cyBuffer)                                yCaret = 0 ;                      }                      break ;                 }            }                        SetCaretPos (xCaret * cxChar, yCaret * cyChar) ; 

2、光标处理 

 主要是设置光标的位置,

处理VK_DELETE:时,会将内存区该行的数据从后面拷贝到前面,再输出

case WM_KEYDOWN:switch(wParam){  case VK_HOME://设置Home键

3、注意事项

WM_CHAR消息中,如果是Unicode界面的程序,此时能接受中文汉字;非Unicode界面程序,输入法对于双字节字符,会连续发送两个字节

三、总结

主要是WM_SIZE消息,释放了适合页面大小的一段内存,然后在编辑时,进行定位操作

参考:1、插入符号的函数和TYPER程序

2、WM_INPUTLANGCHANGE消息

3、windows键盘消息和字符集

4、switch语句的分析

5、Win32输入编程技术分析

6、\n和\r的含义

7、WM_IME_CHAR和WM_CHAR的区别

原创粉丝点击