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. django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析

    url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...

  2. MongoDB安全:内置角色概览

    官文列举如下(文档不长,过英语四级者可以轻松阅读,就不需要看本文额)(基于MongoDB 3.6的文档,4.0也没有变化): Role-Based Access Control Built-In Ro ...

  3. python网络编程--进程池

    一:进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程, 如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止. 进程池中有两个方法: apply a ...

  4. urllib2使用初探

    在入门urllib2之前,我想应该先调研一下urllib与urllib2的区别[1].首先我们要明白的是,这两个模块不可以相互替代.两者都是接受URL请求的模块,但是提供了不同的功能,两个显著的区别是 ...

  5. java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)

    一.String字符串 问:笔试题:new String("abc")创建了几个对象?答:两个对象,一个对象是 位于堆内存,一个对象位于字符串常量池 class Demo17 { ...

  6. Linux基础 - crontab

    列出当前用户设置的定时任务 crontab -l 编辑定时任务 crontab -e 用法 m h dom mon dow * * * * * command 字段详解: *:any m: minut ...

  7. 网络编程--Socket与ServerSocket

    1.服务器端代码 package net; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Sock ...

  8. Winsock—I/O模型之选择模型(一)

    Winsock中提供了一些I/O模型帮助应用程序以异步方式在一个或多个套接字上管理I/O. 这样的I/O模型有六种:阻塞(blocking)模型,选择(select)模型,WSAAsyncSelect ...

  9. PHP 统计数据合并

    将不同的统计结果整合在一起,如图,根据年级统计出不同成绩段人数(此处只为举例),然后写了一个方法来处理这些统计数组 <?php /** * 合并统计数据 * @param $key_column ...

  10. Ubuntu 17.04 搭建 NodeJS

    可以在云主机上执行以下的命令: apt-get update apt-get install -y python-software-properties software-properties-com ...