C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[124] [팁] 메모 콤포넌트와 메세지
박지훈.임프 [cbuilder] 9256 읽음    2001-07-26 15:07
이 팁은 담비님(천리안 FREKBS)님이 99년 4월 1일에 천리안 프로그래머포럼에 올리신 것입니다.
담비님으로부터는 전제하여 올리는 데 대해 허락을 받았습니다.
좋은 정보를 공유하도록 허락해주신 담비님께 감사드립니다.

-----------------------------------------------------------------------
안녕하세요! 담비입니다.

출처 : http://www.inprise.co.jp/tips/cbuilder/cb010/index.html

메모 콤포넌트는 윈도우 클래스의 "EDIT"를 사용하고있지만, 모든 메세지를 커버
하는것은 아니다. 메모 콤포넌트가 제공하고 있지 않는 주요한 메세지들에 관하여
소개한다.

메모 콤포넌트와 메세지
----------------------

Memo Component는 복수행에 걸쳐 문자열을 편집할 수 있는 기본적인 component이다.
이것은, Windows가 제공하는 Window Class인 "EDIT"를 사용하여 실현하고 있다.
Memo Component는, "EDIT" 클래스가 메세지에 의해 제공하고 있는 기능을 많은
method나 property를 사용해 이용할 수 있도록 하고 있다. 그러나, 그다지 사용되지
않는 일부의 메세지에는 대응하는 property와 method가 존재하지 않는다. 아래는,
Memo Component를 사용하여 제공되지 않는 주요한 메세지와 그 사용 예를
나타낸것이다. 다시말하자면 , 콤포넌트에 메세지를 보내기위해 Perform method를
사용할 수 있다. Perform의 첫번째 인수에는 메세지를 두번째 인수에는
WParam(int형), 세번째 인수에는 LParam(int형)을 건네준다. WParam과 LParam은
메세지마다의 역할이 다르다. 이들 인수가 사용되지 않는 경우에는 0을 건네준다.

EM_GETRECT, EM_SETRECT, EM_SETRECTNP
──────────────────
Memo 컴포넌트중에서 편지영역으로 사용할 영역을 취득, 설정한다.
Perform의 LParam에는, 지정하는 범위를 나타내는 RECT형 변수의 주소를 건내준다.
예를 들자면, 다음의 프로그램은, Memo1 컴포넌트의 편집 영역을 Memo1 전체로부터
10 dot 이내로 한다. EM_SETRECTNP는, 메모 컴포넌트의 내용을 다시 그리지는
않는다는 점을 제외하고, EM_SETRECT와 동일하다.
    RECT R := Memo1->ClientRect;
    InflateRect(&R, -10, -10);
    Memo1->Perform(EM_SETRECT, 0, (int)&R);

다음의 프로그램은, Memo1 컴포넌트에 실제로 표시되어지는 행수를 계산한다.
    RECT R;
    Memo1->Perform(EM_GETRECT, 0, (int)&R);
    int N = (R.bottom - R.top) / Canvas->TextHeight("H");


EM_SCROLL
─────
Memo 컴포넌트의 내용을 상하 스크롤시키는 메세지이다. WParam에는 4종류의
스크롤 방법을 지정할수 있다.

SB_LINEDOWN     1줄 아래로 스크롤
SB_LINEUP       1줄 위로 스크롤
SB_PAGEDOWN     1페이지 아래로 스크롤
SB_PAGEUP       1페이지 위로 스크롤

다음의 프로그램은, Memo1의 내용을 1줄 아래로 보이게(전체를 1줄 위로하여)
스크롤 한다.
    Memo1->Perform(EM_SCROLL, SB_LINEDOWN, 0);

EM_LINESCROLL
───────
Memo 컴포넌트의 내용을 상하좌우로 스크롤하는 메세지이다.
WParam에는 수평방향의 문자수를, LParam에는 수직방향의 행수를 건제준다.
스크롤되어지는 의미가 없는 경우는 무효이다. 예를들자면, WordWrap property가
true인 때는 수평스크롤은 할수없다.
다음의 프로그램은 Memo1의 내용을 2문자와 2행의 좌상으로 스크롤한다.
    Memo1->Perform(EM_LINESCROLL, 2, 2);


EM_CANUNDO, EM_UNDO, EM_EMPTYUNDOBUFFER
────────────────────

편집 조작을 취소시키기 위한 메세지이다. Memo 컴포넌트는 상에서 Ctrl-Z을 누르면
현재 텍스트메뉴에서 [취소 (U)]를 실행한것과 동일한 처리를, 프로그램으로부터
실행할수 있다. EM_CANUNDO는, 원래대로 되돌릴 편집조작이 있는가를 판단하기
위한것이다. 예를 들자면, EM_CANUNDO의 결과가 false에 있는 경우 [취소 (U)]이라는
조작을 금지시킬수 있다. 또, EM_EMPTYUNDOBUFFER은 원래대로 되돌릴 조작을 위한
버퍼를 클리어한다. EM_EMPTYUNDOBUFFER 메세지가 보내진 후에는, EM_CANUNDO는
false를 되돌린다. 이들 메세지는 어느것도 Wparam, Lparam을 사용하지 않는다.

EM_LINEFROMCHAR
────────
지정한 문자위치에 있는 행을 되돌린다. 문자의 위치와 행번호는, 각각 0이 시작점
이 된다. 마지막으로, 선두의 문자와 선두의 행은 0의 값에서 나타난다. 문자위치는
WParam에 건네주지만, -1을 건네주면 현재 커서위치의 행번호를 돌려준다. 다음의
프로그램은, Memo1의 OnKeyUp 이벤트를 사용하여, 키입력이 있을때마다의 현재의
행번호를 Caption에 표시한다.
    void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
        Caption = IntToStr(Memo1->Perform(EM_LINEFROMCHAR, -1, 0) + 1);
    }


EM_SETTABSTOPS
───────
Tab Stop의 위치를 지정하는 메세지이다. WParam에는, 지정하는 Tab Stop 배열의
요소수를, LParam은 Tab Stop 배열에 대한 주소값을 건네준다. 그러나, WParam의
값에 따라 LParam의 평가방법이 변하게 된다.           
WParam이 0인 경우, LParam에 관련된 Tab Stop의 위치는 8문자 단위가 되어지다.
WParam이 1인 경우, LParam에 지정하는 배열은 1개의 요소만을 가지지만, Tab Stop은
여기에 지정된 위치가 연속적으로 반복되어진다.
WParma이 2 이상인 경우, LParam이 지정한 배열은 WParam개의 요소를 가지고, 이
범위를 초과한 부분은 Default의 Tab Stop위치를 가지게 된다.
Tab Stop은 DWord형의 배열로 지정하고, 위치는 Dialog 단위로서 나타내진다.
Tab Stop 단위는 문자폭의 평균치의 1/4이 되기때문에, 4문자 단위의 Tab Stop을
지정한 경우에는 16을 지정한다.
다음의 프로그램은, Memo1 컴포넌트의 Tab Stop을 2문자 단위로 한다.
    DWORD TabStops[1] = { 4 * 2 };
    Memo1->Perform(EM_SETTABSTOPS, 1, (int)TabStops);


EM_FIRSTVISIBLELINE
──────────
Memo 컴포넌트상에서, 실제로 눈에 보여지고 있는 최초의 행의 행번호를 되돌려준다.
(최초의 행은 0)

EM_GETMARGINS, EM_SETMARGINS
──────────────
Memo 컴포넌트상에서 좌우의 여백을 설정한다. WParam은 성정한 여백의 종류를
나타내고, LParam은 MAKELONG과 병용하는 여백의 크기를 나타낸다.
다음의 프로그램은, 좌측에 20 dot, 우측에 30 dot의 여백을 설정한다.
    Memo1->Perform(EM_SETMARGINS,
                   EC_LEFTMARGIN : EC_RIGHTMARGIN, MAKELONG(20, 30));


EM_POSFROMCHAR, EM_CHARFROMPOS
───────────────
Memo 컴포넌트상의 좌표와 문자의 위치를 상호 변환시키는 메세지이다.
EM_POSFROMCHAR은, 지정된 문자위치(텍스트의 선두로부터의 바이트 수의 문자의
좌상의 좌표를 되돌려준다. WParam에는, TPoint형의 변수를 사용하는 주소값을
되돌려준다.
EM_CHARFROMPOS에는, 클라이언트 영역의 좌표로부터 그 장소에 있는 문자의 위치
(텍스트의 선두로부터의 위치와 행번을 되돌려준다.
다음의 프로그램은, Memo1의 OnMouseMove 이벤트를 사용하여, 마우스 커서상에
있는 문자의 위치와 행번을 Caption에 표시하는것이다.
    void __fastcall TForm1::Memo1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)  
    {
        DWORD DW = Memo1->Perform(EM_CHARFROMPOS, 0, MAKELONG(X, Y));
        Caption = IntToStr(LOWORD(DW)) + ":" + IntToStr(HIWORD(DW));
    }  

+ -

관련 글 리스트
124 [팁] 메모 콤포넌트와 메세지 박지훈.임프 9256 2001/07/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.