用C++实现翻页效果

| No Comments | No TrackBacks

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

No TrackBacks

TrackBack URL: http://www.wujianrong.com/mt-tb.cgi/1024

Leave a comment

About this Entry

This page contains a single entry by kevinwu published on September 5, 2006 9:38 AM.

DELPHI制作动画 was the previous entry in this blog.

WAP应用有两种基本解决方案 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.