|
걍 편법 입니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "WrapTest.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/* soft line break문자(열:\r\r\n)을 라인에 삽입해서 wordwrap을
구현 한다고 나와있긴한데...
EM_GETHANDLE메시지에 의해서 반환되는 버퍼에만 영향을 끼치고,
실제 텍스트 출력에는 영향을 끼치지 않는다고 나와있네요...
실제로 "\r\r\n"을 WordWrap모드에서 삽입하면 한 라인만 다운(?:아래로 이동)
되지만 WordWrap모두를 해제하면 2라인... 다운. hard line break는 "\r\n"
이라는 군요...
*/
// RichEdit1->SelText = "\r\r\n";
static bool bInsert = true;
::SendMessage(RichEdit1->Handle, EM_FMTLINES, bInsert, 0);
bInsert != bInsert;
RichEdit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
RichEdit1->WordWrap = !RichEdit1->WordWrap;
if(RichEdit1->WordWrap) {
Button2->Caption ="Off WordWrap";
Button3Click(NULL);
}
else {
Button2->Caption ="On WordWrap";
TRect RT;
SendMessage(RichEdit1->Handle, EM_GETRECT, 0, (long)(&RT));
RT.Left = 10;
RT.Right = RichEdit1->Left+ RichEdit1->Width;
SendMessage(RichEdit1->Handle, EM_SETRECT, 0, (long)(&RT));
}
// WordWrap구현도 soft line-break문자와 EM_SETRECT로 구현 했는지
//( 아시는분...왜이렇게 돼죠? )
// WordWrap을 호출하면... 기존에 설정해 놓은 Rect이 무효화 되더군요..
// TRichEdit구현 소스를 보니, DT_LINEBREAK문자등과 어떤 연산을해서
// DrawText로 출력 하는것 같더군요...소스가 pascal이라...잘 이해는
// 못했지만...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key)
{
if( Key == '\r')
RichEdit1->SelText="@";
}
//---------------------------------------------------------------------------
/*문자열이 출력되는 영역을 설정하더군요... WordWrap과 조합해서
사용하면... 80컬럼 wordwrap구현도 가능할 듯.
물론 80컬럼 워드랩을 해제하면 원래대로 영역을 복구해 줘야 할꺼구요...
*/
void __fastcall TForm1::Button3Click(TObject *Sender)
{
#define COLUMN_WIDTH(col) (iCharWidth*col)
static const int iLeftMargin = 10;
int iCharWidth = 7;
TRect RT;
SendMessage(RichEdit1->Handle, EM_GETRECT, 0, (long)(&RT));
RT.Left += iLeftMargin;
RT.Right = RT.Left + COLUMN_WIDTH(80);
SendMessage(RichEdit1->Handle, EM_SETRECT, 0, (long)(&RT));
}
//---------------------------------------------------------------------------
/*
실제는 soft linebreak문자를 사용해서 wordwrap을 구현 하는것 같은데...
건 잘 모르겠습다..
걍 작성하는데 참고만 하세요..
참 혹시 에디터 구현 중이라면... 매크로 기능 구현 해 보셨나요??? 구현법???
* 이 글을 읽는 모든분께:글구... 틀린부분 있으면 지적바랍니다.
*/
|