读书软件做自己的

    技术2022-05-11  147

     

    读书软件做自己的


       不知各位对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中编译通过


    最新回复(0)