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. linux编译警告 will be initialized after

    http://blog.chinaunix.net/uid-17019762-id-3152012.html 作为一个有强迫症的人,实在是受不了 warning 的存在 这个warning是由于初始化 ...

  2. php 中更简洁的三元运算符 ?:

    PHP 三元运算符是对参数赋值时候的一个简洁的主要用法. 一个主要的用法: PHP 三元运算符能够让你在一行代码中描述判定代码, 从而替换掉类似以下的代码: <?php if (isset($v ...

  3. PHP获得用户的真实IP地址

    <?php /** * 获得用户的真实IP地址 * * @access public * @return string */ function real_ip() { static $reali ...

  4. css-css背景

    CSS 允许应用纯色作为背景,也允许使用背景图像创建相当复杂的效果 一:背景色background-color 属性 p {background-color: gray;} 二:背景图像 backgr ...

  5. Sourcetree使用 - git图形化工具(三)

    前面两个章节总结了Sourcetree的安装与配置Sourcetree密钥,这个章节主要讲如何使用Sourcetree.以前呢,都是使用git Bash进行命令行方式进行操作git,感觉部分时间浪费在 ...

  6. oracle创建job和删除job

    https://blog.csdn.net/u010001043/article/details/56479774

  7. 跟我一起学WPF(0):初识WPF

    WPF是什么 WPF是微软的新一代图形引擎系统,全称为Windows Presentation Foundation,从.NET3.0版本开始引入,为用户界面.2D/3D 图形.文档和媒体提供了统一的 ...

  8. Bootstrap入门八:图片

    1.响应式图片 在 Bootstrap 版本 3 中,通过为图片添加 .img-responsive 类可以让图片支持响应式布局.其实质是为图片设置了 max-width: 100%;. height ...

  9. caffe for python

    导言 本教程中,我们将会利用Caffe官方提供的深度模型——CaffeNet(该模型是基于Krizhevsky等人的模型的)来演示图像识别与分类.我们将分别用CPU和GPU来进行演示,并对比其性能.然 ...

  10. Java 中的三大特性

    我们都知道 Java 中有三大特性,那就是继承 ,封装和多态 .那我今天我就来说说这几个特性 . 老样子 ,先问问自己为什么会存在这些特性 .首先说封装 ,封装就是使用权限修饰符来实现对属性的隐藏 , ...