【文本】用RadASM开发记事本程序分析

一、主界面交互分析

        主要分析其消息响应:

        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开发记事本程序

2、RichEdit显示行号

3、RichEdit打造完美语法着色器

4、在文本框绘制行号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值