读书软件做自己的 不知各位对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中编译通过。