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. .net 下的集合

    集合的操作在编码的时候很常见.但是由于经常使用几种集合.而忽略了一些不常用的集合.在这里我整理下. 首先先了解下接口: 1.IEnumerable,返回一个循环访问集合的枚举器. 2.IEnumera ...

  2. 05 Go 1.5 Release Notes

    Go 1.5 Release Notes Introduction to Go 1.5 Changes to the language Map literals The Implementation ...

  3. centos7上安装指定版本gitlab

    当我们在做gitlab服务器迁移的时候需要两台服务器中的gitlab相同,如果不同则不让回复git备份.这样我们就要安装指定版本的gitlab. 1. 安装依赖软件 yum -y install po ...

  4. java 内部类与控制框架

    应用程序控制框架(application framework)就是设计解决某类特殊问题的一个类,或一组类,要运用某个应用程序框架,通常是继承一个类或多个类,并覆盖这些方法.在覆盖的方法中编写代码定制应 ...

  5. hdu 4813(2013长春现场赛A题)

    把一个字符串分成N个字符串 每个字符串长度为m Sample Input12 5 // n mklmbbileay Sample Outputklmbbileay # include <iost ...

  6. 解决loadrunner 脚本和replaylog中的中文乱码问题

    解决loadrunner 脚本和replaylog中的中文乱码问题 解决这个问题必须认识到一个事实就是,loadrunner和测试服务器交换数据使用的是utf8格式,但是展现在replaylog中是使 ...

  7. NHibernate 错误

    Unable to locate persister for the entity named 'Model.Customer'.The persister define the persistenc ...

  8. Django实战(22):处理登录和注销

    我们已经可以在view函数中判断用户是否已经登录以及获取用户信息: if request.user.is_authenticated(): #判断用户是否已登录 user = request.user ...

  9. ORACLE TO_CHAR(SYSDATE,'D')

    DDD是该天在一年内的第多少天,d是在一周内第几天,dd是一个月内的 DY :Day of week abbreviated Mon, Tue, Fri DAY :Day of week spelle ...

  10. tensorflow初始化参数内存占满问题

    最近使用tensorflow构建了一个浅层的网络,初始化参数的时候发现两个1080ti 22G的显存马上占满 后来发现解决办法为:在创建session的时候把显存设置为自适应即可,如下 config ...