一、主界面交互分析
主要分析其消息响应:
1、WM_CREATE
创建Edit框,全局变量hEdit保留句柄,然后SendMessage(EM_SETMARGINS)来设置行号的边界线,这边设置的是Left 45 right 5
子类化SetWindowLong(hEdit)来设置Edit框新的消息处理函数,
用全局变量lpEditProc保存返回的旧的地址
2、WM_SIZE
GetClientRect()获取主窗口的client,然后MoveWindow()/*[相对于父窗口客户区]*/,在客户区移动hEdit窗口,
3、WM_COMMAND
a. 打开:
GetOpenFileName来获取路径strFile,CreateFile获取文件句柄,ReadFile读取文件到全局变量缓冲区strFileBuf[8192]中,
SendMessage(hEdit,WM_CLEAR)清空Edit框,
SetWindowText(hEidt)设置缓冲区的文本,并显示。
b.保存
GetSaveFileName获取保存路径,CreateFile获取文件句柄,GetWindowText获取文本内容到缓冲区,GetWindowTextLength来获取文本长度,WriteFile将缓冲数据写到文件中。
c.其他的一些操作
invoke SendMessage,hEdit,EM_UNDO,0,0
invoke SendMessage,hEdit,EM_REDO,0,0
invoke SendMessage,hEdit,WM_CUT,0,0
invoke SendMessage,hEdit,WM_COPY,0,0
invoke SendMessage,hEdit,WM_PASTE,0,0
二、Edit框界面分析
a. WM_PAINT消息
CallWindowProc让原来的Edit处理必要的WM_PAINT消息,然后调用BeginPaint();
ShowLineNum(hEdit) //显示行号
EndPaint()
b. WM_KEYUP或者WM_KEYDOWN
GetClientRect(),然后左边+45
InvalidateRect(hEdit),立即重绘
最后调用CallWindowProc,再返回ret
c. ShowLineNum(hEdit)分析
采用双缓冲进行输出,其核心算法是
while( FirstLine <= LineCount )//第一行的行号,页面的总行数
{
TextOut( hdcCpb, 1, CharHeight, countBuf, wsprintf( countBuf, TEXT("%4u"), FirstLine++ ));//x=1,y = CharHeight =1 , 最后是以字符的高度+4递增,
//当高度>客户区的高度,则不再TextOut,hdCpb是缓冲区的dc
CharHeight += chHeight + 4;
if( CharHeight > ClientHeight ) break;
}
三、总结
a. 刷新的时候,所有的参数都是获取的,并保持在Local局部变量中。除了hEdit句柄之外,当然消息处理时,已经传了句柄。
b. 子类化时,就指定了新才消息处理函数,然后调用时,要调用默认的进行一个处理。
参考:1、用RadASM开发记事本程序
4、在文本框绘制行号