敬业的IT人 >> 编程开发 >> C++Builder >> 读书软件做自己的

读书软件做自己的

敬业的IT人 互联网 佚名 2008-1-3 22:27:00

  不知各位对E_book的读书效果是否感兴趣,它是用vb做的,其实在c++builder中也可以很轻松的实现类似效果。现在让我们step by step 吧!

  1)新建工程。单元存盘为"read.cpp"

  加入一个popupmenu; 窗体属性设置如下

    Name: MainForm;

    AutoScroll:false;

    BorderStyle:bsNone;

    Font:宋体,Fontsize:9;

    Position:poScreenCenter;

    PopupMenu:PopupMenu1;

   2)添加一panel,设置为:

    BevelOuter:bvNone;

    BorderStyle:bsSingle;

    Ctl3D:false;

    Name:Panel_1;

    Caption(置空);

    color:0x00CE9600; (淡蓝色)可自定

  3)a:把panel_1拉大(任意),在里面添加两个Panel,命名为Le_Pan,Ri_Pan;

    Le_Pan:

    Color:clBlack

    Align:alLeft;

    Width:20;

    其余同Panel_1;

    Ri_Pan:

    Align:alRight;

    其余同Le_Pan;

    b:

  在Panel_1内添加1个Label,设置属性为

    Transparent:true;

    Visible:false;

    选取Label1,敲Ctrl+c一次,再敲Ctrl+V 69次,(选70个Label)

    c:

    在Panel_1内添加两个Image控件,命名Back_Image,Face_Image;

    Back_Image的stretch 属性为true;

    Back_Image可以载入你想要的背景图片;

  4)添加一个Memo控件,属性为

    Name:Buf_Memo;

    Width:310;

    Visible:false;

    Enabled:false;

    Ctl3D:false;
  5)添加OpenDialog,OpenPictureDialog各一个;

  PopMenu1中建立3个按纽。

  1) caption:打开 Name:OpenN

  2) caption:背景 Name:BackN

  3) caption:退出 Name:CloseN;

  OpenDialog1的filter属性为:文本文件 *.txt 所有文件 *.*

  原理:先将文本文件内容装入memo中,再通过遍历label控件的办法把它显示出来。

  以下是单元文件:

    //

    #include

    #pragma hdrstop

    #include "Read.h"

    //

    #pragma package(smart_init)

    #pragma resource "*.dfm"

    TMainForm *MainForm;

    const int Page_Nums = 34; // 每页的行数

    int Now_Line; // 当前行

    bool End; //文章是否结束

    //

    __fastcall TMainForm::TMainForm(TComponent* Owner)

     : TForm(Owner)

    {

     Inin_face();

    }

    //

    void __fastcall TMainForm::Face_ImageMouseDown(TObject *Sender,

    TMouseButton Button, TShiftState Shift, int X, int Y)

    {

    //拖动窗口,这个技巧比较有用

     if(Button == mbLeft)

    { int SC_DragMove = 61458;

    ReleaseCapture();

    MainForm->Perform(WM-SYSCOMMAND,SC-DragMove, 0);

    }

    }

    //

    void __fastcall TMainForm::OpenNClick(TObject *Sender)

    {

    if(OpenDialog1->Execute())

    { Buf_Memo->Lines->LoadFromFile(OpenDialog1->FileName);

    Inin();

    }

    }

    //

    void__fastcall TMainForm::BackNClick(TObject *Sender)

    {

    if(OpenPictureDialog1->Execute())

    Back_Image->Picture->LoadFromFile(OpenPictureDialog1->FileName);

    }

    //

    void __fastcallTMainForm::CloseNClick(TObject *Sender)

    {

    Application->Terminate();

    }

    //

    void TMain Form::Print Page(int line_cou)

    //执行print书本内容

    {

    const int L-TOP = Label1->Height;

    //该参数用来设置行距
  const int TitleLineCount = Buf-Memo->Lines->Count; //memo总行数

    int LabelLeft = 40;

    int LabelTop = 38;

    if(line_cou < 0)

     //line_cou是标记现在的行位置

    line_cou = 0;

    int lineInx=0;

    //当前行数指针

    int i=0;

    bool vis=1;

    int c=Panel_1->ControlCount;

     // 得到Panel_1上的控件数

    TLabel *pLa;

     //定义TLabel类的指针

    while(i   {

    //遍历panel_1上的所有控件,这个方法很有用,

    if(Panel-1->Controls[i]->ClassNameIs("TLabel"))

    //判断控件类名

    { pLa=dynamic_cast< TLabel* >(Panel_1->Controls[i]); //强行转换指针类型

    pLa->Visible= vis;

    if(!vis) {i ++; continue;}

    //设置多余label为不可视

    pLa->Top= LabelTop;

    pLa->Left= LabelLeft;

    pLa->Caption=Buf_Memo->Lines->Strings[lineInx+line_cou];

     //用 label 显示行内容

    LabelTop+=L_TOP;

    }

    else

    //若不是想要的(label)类,继续判断下一个控件

    {i++; continue;}

    i++;

    lineInx++;

    if(LabelLeft < 300)

    if(lineInx+1 == Page_Nums)

    { LabelTop = 38;

    LabelLeft = 410;

    }

    if(lineInx+1 == 2*Page_Nums) //如果已经显示一页

    vis = 0;

    if(lineInx + line_cou == TitleLineCount-1) //如果全文结束

    vis = 0;

    }

    if(lineInx + line_cou < TitleLineCount-1)

    {

    Now_Line = line_cou + lineInx; //记录当前行数

    End = 0;

    }

    else

    End = 1;

    }

    //

    void TMainForm::Inin()

    {

    End = 0;

    PrintPage(0);

    }

    //

    void TMainForm::Inin_face()

    //初始化界面

    {

    Width = 740;

    //这里设置窗体大小

    Height = 495;

    Back_Image->SendToBack();

    Face_Image->BringToFront();

    Panel_1->Align = alClient;

    ack_Image->Align = alClient;

    Face_Image->Align = alClient;

    //这些初始化设置,虽然有违“所见即所得”的本意,但却使得在编辑时更方便

    }

    //
  void __fastcall TMainForm::Ri_PanClick(TObject *Sender)

    {

    //向前翻页

    if(!End)

    PrintPage(Now_Line);

    }

    //

    void __fastcall TMainForm::Le_PanClick(TObject *Sender)

    {

    //向后翻页

     if(End)

    PrintPage(Now_Line - 2*Page_Nums + 1);

    else

    PrintPage(Now_Line - 4*Page_Nums + 2);

    }

    //

    在最顶部加上

    头文件

    #include

    生成的文件就可以导入jpg图片文件作为背景颜色

    另外在头文件的public中,加上:

    public: // User declarations

    void PrintPage(int line_cou);

    // 主执行函数

    void Inin(void);

    // 初始化打开的文件

    void Inin_face(void);

    // 初始化界面

  对于初学者,需要指出的是,除了上面三个函数之外,其它的都在各自的Events(事件)页双击生成,然后写入函数主体。

  注意:由于TMemo类只能支持小于大约30k的文件,所以打开较大的文件也会报错,但用TRichedit类来代替TMemo即可。因为TRichedit类涉及到很多不确定因素(比如如果装vc,把某些dll换成旧版则可能会严重出错),这里还是用TMemo 做个例子。该代码在k6-2-350,win98,c++builder4中编译通过。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com