代码改变世界

Abiword页面布局

2011-04-26 14:50  netwy  阅读(571)  评论(0编辑  收藏  举报

          

  • AP_Win32FrameImpl::_DocumentWndProc 文档窗口过程函数

 在WM_SIZE消息中设置FV_View对象的整体尺寸,跟窗体的:设备单位 转换成:布局单位。m_iWindowWidth = 19695,m_iWindowHeight= 8520

设备单位和布局单位的比例是:1:15。

    在设置尺寸是会根据文档窗体的实际尺寸利用下面的公式转换:

    m_iWindowWidth = 实际窗体尺寸*1440*100/96*100

         1440 是:#define UT_LAYOUT_RESOLUTION    1440,是版面设计的分辨率,在ut_units.cpp的单位转换函数中用到。

         100 是固定的值;

         96 是:利用GetDeviceCaps函数得到 LOGPIXELSX:沿屏幕宽度每逻辑英寸的像素数;

         100是:视图的显示比例

在WM_PAINT中绘制FV_View,FV_View::_draw

         #define fl_PAGEVIEW_PAGE_SEP m_pG->tlu(20)  // must be <= MARGIN_Y 页面之间的边距
         #define fl_PAGEVIEW_MARGIN_X m_pG->tlu(100) //左外边距 1500

         #define fl_PAGEVIEW_MARGIN_Y m_pG->tlu(25)   //上外边距 375

         右外边距(6290) = m_iWindowWidth - fp_Page.Width

  • 对于fp_Page类利用fp_PageSize类设置页面的尺寸。默认是A4纸(210,297),转换后的尺寸是(11905,16837)

    对每个Page调用fp_Page::draw绘制各个页。在fp_Page::_reformatColumns函数中计算每页的列宽。每个页得左右内边距是:1440 ,上下内边距是:1440,

    列宽是:9025

页边距在fl_DocSectionLayout::_lookupProperties函数中设置。默认边距是:2.54cm。

1 Inch = 2.54 Centimeters1 cm = 0.4 in

    fp_Line::setContainer设置每一行的宽等属性

 

  •  fp_Line,fp_Line::recalcHeight函数计算每一行的高度

iNewHeight = static_cast<UT_sint32>(iNewHeight * dLineSpace +50);// wfw edit 0.5 改为 50

dLineSpace 段落设置的中的行距,系统默认是单倍行距,现在改为1.5倍行距

 

  • fp_TextRun::_draw

UT_sint32 yTopOfRun = pDA->yoff - getAscent() + (getDescent()/2);// wfw edit,加上 getDescent()/2

  •  fb_LineBreaker类

 fb_LineBreaker encapsulates knowledge of how to break runs across lines. 
 It also breaks them between words, to help with later justification.

其中针对行尾是空格的情况做了改动,原来的程序存在bug会将空格一直输出到超过每个行最大行宽的位置