一、消息机制分析
编辑代码的时候,直接源文件编辑
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的区别