1.1 前言

这两天在看notepad++ 1.0版本的源代码。看了许久终于把程序的窗口之间的关系搞清楚了现在把其组织的要点写于此,希望对大家有所帮助。

1.2 窗口元素之间的关系

Notepad++主要有以下窗口元素(见下图)。

其中Notepad_plus 是程序的主要窗口,其他:工具栏、状态栏、主次编辑窗口、主次选项卡窗口以及对话框窗口均为主窗口的子窗口。

 
 

_mainDocTab 和 _subDocTab 为 类:DocTabView 其成员_pView 分别指向 _mainEditView和_subEditView即两个编辑窗口。这样方便了改变窗口大小是窗口的重新布局。见下节

1.3 窗口的布局

窗口的布局从Notepad_plus 的消息处理程序开始:

case WM_SIZE:// 窗口改变大小是重新布局

{

    RECT rc;

    getMainClientRect(rc);// exclude statusbar and toolbar area

    _pMainWindow->reSizeTo(rc);

    getStatusBarClientRect(rc);

    _statusBar.reSizeTo(rc);

    return TRUE;

}

主窗口收到窗口大小被改变之后、对各个子窗口进行重新布局。

1. getMainClientRect(rc);// exclude statusbar and toolbar area

计算客户区(除去工具栏和状态栏的矩形窗口区域)。

2. _pMainWindow->reSizeTo(rc);

这里的_pMainWindow (在没有分裂编辑窗口时即只有一个编辑窗口时)是指向_mainDocTab的指针。将该函数调用展开如下:

virtual void DocTabView::reSizeTo(RECT & rc)

{

TabBar::reSizeTo(rc);

rc.left += marge;

rc.top += marge;

rc.right -= ;

rc.bottom -= ;

_pView->reSizeTo(rc);

};

这里的关键是函数TabBar::reSizeTo(rc);的调用。将其展开如下:

void TabBar::reSizeTo(RECT & rc2Ajust)

{

// Important to do that!

// Otherwise, the window(s) it contains will take all the resouce of CPU

// We don't need to resiz the contained windows if they are even invisible anyway!

display(rc2Ajust.right > );

Window::reSizeTo(rc2Ajust);

TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust);

}

这里 TabBar 将其窗口占满除工具栏和状态栏的区域。然后调用TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust);返回选项卡的客户去(出去标签的矩形区域)

这几层调用之后,我们再回到:

virtual void DocTabView::reSizeTo(RECT & rc)

{

TabBar::reSizeTo(rc);

rc.left += marge;

rc.top += marge;

rc.right -= ;

rc.bottom -= ;

_pView->reSizeTo(rc);

};

此时rc为选项卡的客户区,_pView为指向编辑窗口的指针,其调用reSizeTo函数将其窗口调整到合适的位置,

3. getStatusBarClientRect(rc);

_statusBar.reSizeTo(rc);

后两句顾名思义为调整状态栏位置

以上就是Notepad++ 1.0版本的 窗口布局要点

Notepad++源代码阅读——窗口元素组织与布局的更多相关文章

  1. Notepad++源代码阅读——窗口封装与继承

    引言 近期在看Notepad++的源代码,学习学习Win32 原生API的开发技巧. 本文以Notepad++ 1.0版本的源代码为例讲解如何封装windows窗口,实现面向对象开发,如何通过窗口的继 ...

  2. 非常好!!!Linux源代码阅读——环境准备【转】

    Linux源代码阅读——环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 ...

  3. 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)

    本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...

  4. 利用doxygen提高源代码阅读效率

    阅读开源项目的源代码是提高自己编程能力的好方法,而有一个好的源代码阅读工具无疑能够让你在阅读源代码时事半功倍.之前找过不少源代码阅读工具,像SourceInsight.sourcenav.scitoo ...

  5. 淘宝数据库OceanBase SQL编译器部分 源代码阅读--Schema模式

    淘宝数据库OceanBase SQL编译器部分 源代码阅读--Schema模式 什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们能够能够把Data ...

  6. CI框架源代码阅读笔记3 全局函数Common.php

    从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...

  7. Java Jdk1.8 HashMap源代码阅读笔记二

    三.源代码阅读 3.元素包括containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a ...

  8. 非常好!!!Linux源代码阅读——内核引导【转】

    Linux源代码阅读——内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...

  9. 非常好!!!Linux源代码阅读——中断【转】

    Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处 ...

随机推荐

  1. java基础65 JavaScript中的Window对象(网页知识)

    1.javaScript组成部分 1.EMCAScript(基本语法)    2.BOM(Browser Object Model):浏览器对象模型            浏览器对象模型中的浏览器的各 ...

  2. Java容器---Set: HashSet & TreeSet & LinkedHashSet

    1.Set接口概述        Set 不保存重复的元素(如何判断元素相同呢?).如果你试图将相同对象的多个实例添加到Set中,那么它就会阻止这种重复现象. Set中最常被使用的是测试归属性,你可以 ...

  3. css 让背景图片不停旋转

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Oracle学习笔记:wm_concat函数合并字段

    在Oracle中使用wm_concat(column)可以实现字段的分组合并,逗号分隔. 例如,现有表temp_cwh_test: -- 创建临时表 create table temp_cwh_tes ...

  5. Linux学习笔记:nohup & 后台任务

    在linux中,使用nohup xxx.sh &可以将前台任务变成后台任务执行,如果只使用&的话,在突然断网或者关闭启动终端时,内核会向后台任务发送sighup信号,从而导致后台任务停 ...

  6. PowerTool x64驱动模块逆向分析(持续更新)

    比赛打完了,来继续搞了,因为那个主动防御正在写,所以想找找思路正好想到可以来逆向一下PT的驱动模块看看pt大大是怎么写的程序. PT x64版本的驱动模块是这个kEvP64.sys. 0x0 先来看看 ...

  7. drools7 (三、kmodule 介绍)

    注意几点: 1. kmodule 有默认的加载路径, 看  KieModuleModelImpl 这个类的源代码 public class KieModuleModelImpl implements ...

  8. Iterator 迭代器

    意图 提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示. 动机 一个聚合对象, 如列表(list), 应该提供一种方法来让别人可以访问它的元素,而又不需暴露它的内部结构 迭 ...

  9. python开发之路Day17-算法设计(冒泡排序、选择排序、插入排序、二叉树)

    s12-20160514-day17 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  10. centos6 yum 安装nginx 不成功解决办法

    转自  http://wlheihei.com/view/64 [root@51ou.com yum.repos.d]# yum install nginxLoaded plugins: fastes ...