简易文本编辑器分析

一、消息机制分析

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

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 case1

if i = 2 jmp case2

if i = 3 jmp case3

case1

case2

case3

二、交互性分析

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的区别

你可能感兴趣的:(C,/,C++)