用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧C++ Builder

读书软件diy

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:44:06

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

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:22,171.88000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号