读书软件做自己的
不知各位对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);
// 主执行函数