|
void make_text(TPrinter*p,AnsiString src,TStringList*dest)
{
src=StringReplace(src,"\r","",TReplaceFlags()<<rfReplaceAll);
src=StringReplace(src,"\n","",TReplaceFlags()<<rfReplaceAll);
AnsiString temp_line="";
for(int i=1;i<=src.Length();){
AnsiString s;
if(src.IsLeadByte(i)){
s=src.SubString(i,2);
i+=2;
}else{
s=src.SubString(i,1);
i++;
}
if(p->Canvas->TextWidth(temp_line+s)>p->PageWidth){
dest->Add(temp_line);
temp_line=s;
}else{
temp_line+=s;
}
}
dest->Add(temp_line);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TPrinter*Prntr=Printer();
Prntr->Canvas->Font->Name="굴림";
Prntr->Canvas->Font->Size=12;
TStringList*l=new TStringList();
make_text(Prntr,Memo1->Lines->Text.Trim(),l);
int x=0;
int y=0;
int y_int=10; //간격조정
Prntr->BeginDoc();
for(int i=0;i<l->Count;i++){
AnsiString s=l->Strings[i];
if(y+Prntr->Canvas->TextHeight(s)>Prntr->PageHeight){
Prntr->NewPage();
y=0;
}
Prntr->Canvas->TextOut(0,y,s);
y+=Prntr->Canvas->TextHeight(s);
y+=y_int;
}
Prntr->EndDoc();
delete l;
}
해지는 아침 님이 쓰신 글 :
: Memo에 입력된 내용을 용지의 일정 위치에 출력시키는 프로그램 일부입니다.
:
:
: (생략)
:
: int totHeight=160; //출력되는 시작점의 y값
: AnsiString asTemp; //메모의 String길이가 종이와 맞지 않아 SubString()사용하여
: //줄길이에 맞게 잘라 출력하려고
:
: SetTextAlign(c->Handle,TA_LEFT);
:
: c->Font->Size=9;
:
: asTemp=Form1->Memo2->Text;//메모의 내용을 받아
: int slCount=Form1->Memo2->GetTextLen();
:
: for(int i=0;i<slCount;i=i+102)
: {
: totHeight+=(c->TextHeight(Form1->Memo2->Lines->Strings[0]));
: c->TextOut(40, totHeight, asTemp.SubString(i,i+102));//102 간격으로 잘라 출력함
: }
: (생략)
:
: 이렇게 하면 Memo2에 입력된 내용이 (40,160)위치에서 약 62자 정도가 출력되고 라인을 바꿔서
: 다음줄이 출력되고 하옇든 모든 줄이 이어서 출력되기는 하는데....
:
: 문제가 둘째줄 이상의 맨 앞자가 2-3개씩 깨어져 출력되고 맨뒤에 몇자가 덧붙여저 출력되는데
: 누가 문제점을 해결할 수 있는 방법점 알려주세요....
:
: 그리고 102번째가 한글의 두음이 있으면(예를들면 감의 ㄱ부분이면) 그줄에 네모로 인쇄되니까 그 전까지만 인쇄되고 다음줄에 글자로 인쇄되도록 하는 것도 점 첨가해 주셔요......부탁^^
|