讀書軟體做自己的 (轉)

gugu99發表於2008-03-20
讀書軟體做自己的 (轉)[@more@] 

讀書做自己的


   不知各位對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 re "*.dfm"
  TMainFo*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(T *Sender,
  TMouseButton Button, TShiftState Shift, int X, int Y)
  {
  //拖動視窗,這個技巧比較有用
   if(Button == mbLeft)
  { int SC_DragMove = 61458;
  ReleaseCapture();
  MainForm->Perform(WM-SYMMAND,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->Tenate();
  }
  //
  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,,c++builder4中編譯透過


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001211/,如需轉載,請註明出處,否則將追究法律責任。

相關文章