📄 20001121001.htm
字号:
<HTML>
<HEAD>
<TITLE>读书软件做自己的</TITLE>
<META content="MSHTML 5.00.2314.1000" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p align=center><strong><font size="3"><br>
读书软件做自己的<br>
</font></strong></p>
不知各位对E_book的读书效果是否感兴趣,它是用vb做的,其实在c++builder中也可以很轻松的实现类似效果。现在让我们step
by step 吧!<br>
<br>
1)新建工程。单元存盘为"read.cpp"<br>
<br>
加入一个popupmenu; 窗体属性设置如下<br>
<br>
Name: MainForm;<br>
<br>
AutoScroll:false;<br>
<br>
BorderStyle:bsNone;<br>
<br>
Font:宋体,Fontsize:9;<br>
<br>
Position:poScreenCenter;<br>
<br>
PopupMenu:PopupMenu1;<br>
<br>
2)添加一panel,设置为:<br>
<br>
BevelOuter:bvNone;<br>
<br>
BorderStyle:bsSingle;<br>
<br>
Ctl3D:false;<br>
<br>
Name:Panel_1;<br>
<br>
Caption(置空);<br>
<br>
color:0x00CE9600; (淡蓝色)可自定<br>
<br>
3)a:把panel_1拉大(任意),在里面添加两个Panel,命名为Le_Pan,Ri_Pan;<br>
<br>
Le_Pan:<br>
<br>
Color:clBlack<br>
<br>
Align:alLeft;<br>
<br>
Width:20;<br>
<br>
其余同Panel_1;<br>
<br>
Ri_Pan:<br>
<br>
Align:alRight;<br>
<br>
其余同Le_Pan;<br>
<br>
b:<br>
<br>
在Panel_1内添加1个Label,设置属性为 <br>
<br>
Transparent:true;<br>
<br>
Visible:false;<br>
<br>
选取Label1,敲Ctrl+c一次,再敲Ctrl+V 69次,(选70个Label)<br>
<br>
c:<br>
<br>
在Panel_1内添加两个Image控件,命名Back_Image,Face_Image;<br>
<br>
Back_Image的stretch 属性为true;<br>
<br>
Back_Image可以载入你想要的背景图片;<br>
<br>
4)添加一个Memo控件,属性为<br>
<br>
Name:Buf_Memo;<br>
<br>
Width:310;<br>
<br>
Visible:false;<br>
<br>
Enabled:false;<br>
<br>
Ctl3D:false;<br>
<br>
5)添加OpenDialog,OpenPictureDialog各一个;<br>
<br>
PopMenu1中建立3个按纽。<br>
<br>
1) caption:打开 Name:OpenN<br>
<br>
2) caption:背景 Name:BackN<br>
<br>
3) caption:退出 Name:CloseN;<br>
<br>
OpenDialog1的filter属性为:文本文件|*.txt|所有文件|*.*<br>
<br>
原理:先将文本文件内容装入memo中,再通过遍历label控件的办法把它显示出来。<br>
<br>
以下是单元文件:<br>
<br>
//<br>
<br>
#include <br>
<br>
#pragma hdrstop<br>
<br>
#include "Read.h"<br>
<br>
//<br>
<br>
#pragma package(smart_init)<br>
<br>
#pragma resource "*.dfm"<br>
<br>
TMainForm *MainForm;<br>
<br>
const int Page_Nums = 34; // 每页的行数<br>
<br>
int Now_Line; // 当前行<br>
<br>
bool End; //文章是否结束<br>
<br>
//<br>
<br>
__fastcall TMainForm::TMainForm(TComponent* Owner)<br>
<br>
: TForm(Owner)<br>
<br>
{<br>
<br>
Inin_face();<br>
<br>
}<br>
<br>
//<br>
<br>
void __fastcall TMainForm::Face_ImageMouseDown(TObject *Sender, <br>
<br>
TMouseButton Button, TShiftState Shift, int X, int Y)<br>
<br>
{<br>
<br>
//拖动窗口,这个技巧比较有用<br>
<br>
if(Button == mbLeft)<br>
<br>
{ int SC_DragMove = 61458; <br>
<br>
ReleaseCapture();<br>
<br>
MainForm->Perform(WM-SYSCOMMAND,SC-DragMove, 0);<br>
<br>
}<br>
<br>
}<br>
<br>
//<br>
<br>
void __fastcall TMainForm::OpenNClick(TObject *Sender)<br>
<br>
{<br>
<br>
if(OpenDialog1->Execute())<br>
<br>
{ Buf_Memo->Lines->LoadFromFile(OpenDialog1->FileName);<br>
<br>
Inin();<br>
<br>
}<br>
<br>
}<br>
<br>
//<br>
<br>
void__fastcall TMainForm::BackNClick(TObject *Sender)<br>
<br>
{<br>
<br>
if(OpenPictureDialog1->Execute())<br>
<br>
Back_Image->Picture->LoadFromFile(OpenPictureDialog1->FileName);<br>
<br>
}<br>
<br>
//<br>
<br>
void __fastcallTMainForm::CloseNClick(TObject *Sender)<br>
<br>
{<br>
<br>
Application->Terminate();<br>
<br>
}<br>
<br>
//<br>
<br>
void TMain Form::Print Page(int line_cou) <br>
<br>
//执行print书本内容<br>
<br>
{<br>
<br>
const int L-TOP = Label1->Height;<br>
<br>
//该参数用来设置行距<br>
<br>
const int TitleLineCount = Buf-Memo->Lines->Count; //memo总行数<br>
<br>
int LabelLeft = 40;<br>
<br>
int LabelTop = 38;<br>
<br>
if(line_cou < 0) <br>
<br>
//line_cou是标记现在的行位置<br>
<br>
line_cou = 0;<br>
<br>
int lineInx=0; <br>
<br>
//当前行数指针<br>
<br>
int i=0;<br>
<br>
bool vis=1;<br>
<br>
int c=Panel_1->ControlCount; <br>
<br>
// 得到Panel_1上的控件数<br>
<br>
TLabel *pLa; <br>
<br>
//定义TLabel类的指针<br>
<br>
while(i {<br>
<br>
//遍历panel_1上的所有控件,这个方法很有用,<br>
<br>
if(Panel-1->Controls[i]->ClassNameIs("TLabel")) <br>
<br>
//判断控件类名<br>
<br>
{ pLa=dynamic_cast< TLabel* >(Panel_1->Controls[i]); //强行转换指针类型<br>
<br>
pLa->Visible= vis;<br>
<br>
if(!vis) {i ++; continue;} <br>
<br>
//设置多余label为不可视<br>
<br>
pLa->Top= LabelTop;<br>
<br>
pLa->Left= LabelLeft;<br>
<br>
pLa->Caption=Buf_Memo->Lines->Strings[lineInx+line_cou];<br>
<br>
//用 label 显示行内容<br>
<br>
LabelTop+=L_TOP;<br>
<br>
}<br>
<br>
else <br>
<br>
//若不是想要的(label)类,继续判断下一个控件<br>
<br>
{i++; continue;}<br>
<br>
i++;<br>
<br>
lineInx++;<br>
<br>
if(LabelLeft < 300)<br>
<br>
if(lineInx+1 == Page_Nums)<br>
<br>
{ LabelTop = 38;<br>
<br>
LabelLeft = 410;<br>
<br>
}<br>
<br>
if(lineInx+1 == 2*Page_Nums) //如果已经显示一页<br>
<br>
vis = 0;<br>
<br>
if(lineInx + line_cou == TitleLineCount-1) //如果全文结束<br>
<br>
vis = 0;<br>
<br>
}<br>
<br>
if(lineInx + line_cou < TitleLineCount-1)<br>
<br>
{<br>
<br>
Now_Line = line_cou + lineInx; //记录当前行数<br>
<br>
End = 0;<br>
<br>
}<br>
<br>
else<br>
<br>
End = 1;<br>
<br>
}<br>
<br>
//<br>
<br>
void TMainForm::Inin()<br>
<br>
{<br>
<br>
End = 0;<br>
<br>
PrintPage(0);<br>
<br>
}<br>
<br>
//<br>
<br>
void TMainForm::Inin_face() <br>
<br>
//初始化界面<br>
<br>
{<br>
<br>
Width = 740; <br>
<br>
//这里设置窗体大小<br>
<br>
Height = 495;<br>
<br>
Back_Image->SendToBack();<br>
<br>
Face_Image->BringToFront();<br>
<br>
Panel_1->Align = alClient;<br>
<br>
ack_Image->Align = alClient;<br>
<br>
Face_Image->Align = alClient;<br>
<br>
//这些初始化设置,虽然有违“所见即所得”的本意,但却使得在编辑时更方便<br>
<br>
}<br>
<br>
//<br>
<br>
void __fastcall TMainForm::Ri_PanClick(TObject *Sender)<br>
<br>
{ <br>
<br>
//向前翻页<br>
<br>
if(!End)<br>
<br>
PrintPage(Now_Line);<br>
<br>
}<br>
<br>
//<br>
<br>
void __fastcall TMainForm::Le_PanClick(TObject *Sender)<br>
<br>
{ <br>
<br>
//向后翻页<br>
<br>
if(End)<br>
<br>
PrintPage(Now_Line - 2*Page_Nums + 1);<br>
<br>
else<br>
<br>
PrintPage(Now_Line - 4*Page_Nums + 2);<br>
<br>
}<br>
<br>
//<br>
<br>
在最顶部加上<br>
<br>
头文件 <br>
<br>
#include <br>
<br>
生成的文件就可以导入jpg图片文件作为背景颜色<br>
<br>
另外在头文件的public中,加上:<br>
<br>
public: // User declarations<br>
<br>
void PrintPage(int line_cou); <br>
<br>
// 主执行函数<br>
<br>
void Inin(void); <br>
<br>
// 初始化打开的文件<br>
<br>
void Inin_face(void); <br>
<br>
// 初始化界面<br>
<br>
对于初学者,需要指出的是,除了上面三个函数之外,其它的都在各自的Events(事件)页双击生成,然后写入函数主体。<br>
<br>
注意:由于TMemo类只能支持小于大约30k的文件,所以打开较大的文件也会报错,但用TRichedit类来代替TMemo即可。因为TRichedit类涉及到很多不确定因素(比如如果装vc,把某些dll换成旧版则可能会严重出错),这里还是用TMemo
做个例子。该代码在k6-2-350,win98,c++builder4中编译通过。 </td>
</tr>
</table>
</div>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -