Q&A

  • Edit박스를 투명하게 하는 방법이 있을까요?
Edit박스를 투명하게 하는 방법이 있을까요?

그림판에서처럼 TImage위에 글자를 입력받아서 텍스트를 출력하고자 하는데요,
Edit박스를 투명하게 처리하면 될 것 같은데, 쉽지 않네요...

고수분들의 조언 부탁드립니다.
6  COMMENTS
  • Profile
    구창민 2004.09.07 22:32
    안녕하세요..

    아래에 투명 에디트 컴포넌트 소스를 올려드릴께요..

    물론 Free 이구요 .. 원하시는 대로 동작할겁니다.

    즐거운 프로그래밍 하세요..

    unit RbsWiredEdit;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;

    const
    TWM_RbsInvalidate=WM_USER+1;

    type
    TRbsWiredEdit = class(TEdit)
    private
       { Private declarations }
       procedure RbsInvalidate(var Message:TMessage); message
                 TWM_RbsInvalidate;
       procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message
                 CN_CTLCOLOREDIT;
       procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
       procedure WMMove(var Message: TMessage); message WM_MOVE;

    protected
       { Protected declarations }
       FTransparent: boolean;
       procedure CreateWnd; override;
       procedure CreateParams(var Params: TCreateParams); override;
       procedure DoExit; override;
       procedure DoEnter; override;
    public
       { Public declarations }
       constructor Create(AOwner: TComponent); override;
       procedure Invalidate; override;

    published
       { Published declarations }
    end;

    procedure Register;

    implementation

    constructor TRbsWiredEdit.Create(AOwner:TComponent);
    begin
    inherited create(AOwner);
      ftransparent:=true;
    end;

    procedure TRbsWiredEdit.CreateWnd;
    begin
    inherited CreateWnd;
      if fTransparent then
         begin
          SetWindowLong(Parent.Handle, GWL_STYLE,
          GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
          end;
    end;

    procedure TRbsWiredEdit.RbsInvalidate(var Message:TMessage);
    var r:TRect;
    begin
    if (Parent<>nil) and FTransparent then
       begin
         r:=ClientRect;
         r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
         r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));
         RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE);
       end;
    end;

    procedure TRbsWiredEdit.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);
    begin
    if FTransparent then
      with Message do
       begin
         SetBkMode(ChildDC,Windows.TRANSPARENT);
         Result:=GetStockObject(HOLLOW_BRUSH)
       end
      else inherited;
    end;



    procedure TRbsWiredEdit.WMEraseBkgnd(var Message:TWMERASEBKGND);
    begin
    if FTransparent and not (csDesigning in ComponentState) then
         PostMessage(Handle,TWM_RbsInvalidate,0,0)
    else inherited;
    end;

    procedure TRbsWiredEdit.WMMove(var message:TMessage);
    begin
    inherited;
    if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)
    else Invalidate;
    end;

    procedure TRbsWiredEdit.CreateParams(var Params:TCreateParams);
    begin
    inherited CreateParams(Params);
    if (CsDesigning in ComponentState) then exit;
       with Params do
         begin
      ExStyle:=ExStyle or WS_EX_TRANSPARENT;
         end;
    end;

    procedure TRbsWiredEdit.DoExit;
    begin
    inherited;
      FTransparent:=true;
      SetCursor(0);
      RecreateWnd;
    end;

    procedure TRbsWiredEdit.DoEnter;
    var exstyle,stdstyle:longint;
    begin
    inherited;
    Ftransparent:=false;
    StdStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);
    exStyle:= StdStyle and not WS_EX_TRANSPARENT;
    Windows.SetWindowLong(handle, GWL_EXSTYLE, exStyle);
    invalidate;
    end;

    procedure TRbsWiredEdit.Invalidate;
    begin
    if FTransparent then SendMessage(Handle,TWM_RbsInvalidate,0,0)
    else inherited;
    end;

    procedure Register;
    begin
    RegisterComponents('Rombest', [TRbsWiredEdit]);
    end;

    end.  
  • Profile
    이성수 2004.09.07 23:06
    안녕하세요?
    답변에 정말 감사드립니다.

    정확하게 원하던 방법은 아니지만, 그런대로 괜찮네요..

    제가 원하던 것은 Edit박스에 글씨를 쓸때부터 배경흰색이 투명하게 되어서 그 뒤에 있는 이미지가 보이도록 하고자 한 것이었는데, 암튼 큰 도움이 되었네요...고맙습니다.   꾸~~~~~뻑.


    즐프 하시구요..
    행복하시고, 늘 건강하세요 ^^


  • Profile
    타락천사 2004.09.07 18:03
    안녕하세여. 타락임다..

    그림판에서 텍스트를 클릭하면,

    클릭한 영역을 검사해서 텍스트가 있는 부분이면

    해당 텍스트위 Edit만 있는 폼을 띄웁니다.

    폼은 캡션과 border 가 없어서 Edit 창만 보여야하겠지요.

    그리고 폼은 항상 가장 상위에 위치하고 있어야 하고요, Not Activate 시 종료시켜야 합니다.

    Edit 에 텍스트를 입력하면, 해당 텍스트를 변경하고, Edit폼은 사라지고..

    위와 같이 하면 될겁니다.

    즐푸하세요..

    타락천사..
  • Profile
    이성수 2004.09.07 18:27
    답변 감사드립니다.
    그림판에 각종 그림을 그린 후에, 글씨도 입력받아 쓰게 할려는 거거든요.

    근데, 말씀하신 내용을 보면 새로운 폼을 만들고 그 위에 Edit박스를 두라는 이야기인데요.

    저는 Edit박스 자체를 투명하게 해서 경계선만 나오게 하고,
    글씨를 입력하는데, 그림판의 그림배경은 보이도록 하고 싶은 거거든요..

    좀 어렵나~~ 말뜻이...

    암튼 그렀습니다.
    말씀하신 대로 한번 해봐야 겠군요...


  • Profile
    석주현 2004.09.07 08:17


    예전에 저도 지금 하시는 것과 비슷한걸 했었는데요..
    전 그냥 Label1 를 놓고 Label1 에 마우스가 눌리면
    그 위치에 Edit1 콘트롤을 옮기고 Visible을 true 시켜서 사용했습니다.

    그리고 Edit 콘트롤에 Change 이벤트에서

    Label1.Caption := Edit1.Text 이런식으로 해주면
    Edit1에서 입력된게 레이블에 바로 적용되잖아요.

    그리고 Edit1에서 OnExit 이벤트가 발생하면 다시 Visible을 false 시키면
    레이블만 보이니깐 비슷한 작업이 가능할 겁니다.

    근데 정작 바라시는게 이게 아닌 것 같은데. -_-;;
  • Profile
    이성수 2004.09.07 18:29
    답변 감사드립니다.
    그림판에 각종 그림을 그린 후에, 글씨도 입력받아 쓰게 할려는 거거든요.

    라벨을 이용하는 방법도 좋은 방법이네요.

    저는 Edit박스 자체를 투명하게 해서 경계선만 나오게 하고,
    글씨를 입력하는데, 그림판의 그림배경은 보이도록 하고 싶은 거거든요..

    말씀하신 대로
    Label를 적극 활용해야 겠네요...

    고맙습니다.

    • 김재영
    • 2004.09.07 19:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2004.09.07 19:59
      "컴포넌트 저장" 으로 검색을 해보세요. 그걸 보시면 아마도 해결이 가능할꺼 같은데요.. ^^
    • 황성욱
      2004.09.07 20:48
      DataSnap 사용하셔서 해보세요. TClientDataSet에 보면 FehchOnDemand, Packetrecords, GetNextPacket등을...
    • 초보지만 델사랑
      2004.09.07 19:04
      짧은 소견으로는 query로 해결 하시면 될 듯한데요... Mysql은 limt명령어가 있고. Oracle은 써 본지...
    • ㉳㉥ㅗ㉣ㅐ㉧ㅛ
      2004.09.07 19:09
      답변 고맙습니다.... 그럼 컴포넌트로 제한할수 있는 방법은?
    • nilriri™
      2004.09.07 19:31
      콤포넌트(디비그리드)에서 제한 한다면.. 전체 자료중 일부만 보여주는 의미가 없어 보입니다. 제 ...
    • 이재욱
    • 2004.09.07 14:19
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박상윤
      2004.09.16 02:41
      음.. 이런식으로 연결 하시면 됩니다. 스마트티를 써서 분리한뒤 화면에 랜더하고 파일에 압축하여 저...
    • 박상윤
      2004.09.10 00:52
      음.. 방법이 전혀 틀리셨군요. DirectShow 프로그램 하시면. 다 해결됩니다. wmv 인코딩해서. 파일로 저...
    • 타락천사
      2004.09.07 18:09
      안녕하세여. 타락임다. 질문을 보면, 어플에서 인코딩하면서 캡춰도 같이 하려고 하는것이 문제 입니다....
    • 구창민
      2004.09.07 22:27
      안녕하세요.. 아마도 이렇게 Result := CallNextHookEx(HKbHook, Code, myW, myL); case 문을 수...
    • 파멸의슬픔
      2004.09.07 18:06
      원하시는 자료가 이게 맞는지 모르겠네요... procedure TForm1.Edit1KeyPress(Sender: TObject; var Key...
    • 정찬희
      2004.09.08 00:26
    • 놀부
      2004.09.08 02:55
    • 정찬희
      2004.09.08 07:07
    • 정찬희
      2004.09.08 07:15
    • 놀부
      2004.09.08 08:08
    • 정찬희
      2004.09.08 08:52
    • 놀부
      2004.09.08 09:09
    • • • •
    • 이성수
    • 2004.09.07 04:46
    • 6 COMMENTS
    • /
    • 2 LIKES
    • 구창민
      2004.09.07 22:32
      안녕하세요.. 아래에 투명 에디트 컴포넌트 소스를 올려드릴께요.. 물론 Free 이구요 .. 원하시는 대...
    • 이성수
      2004.09.07 23:06
      안녕하세요? 답변에 정말 감사드립니다. 정확하게 원하던 방법은 아니지만, 그런대로 괜찮네요.. 제...
    • 타락천사
      2004.09.07 18:03
      안녕하세여. 타락임다.. 그림판에서 텍스트를 클릭하면, 클릭한 영역을 검사해서 텍스트가 있는 부분...
    • 이성수
      2004.09.07 18:27
      답변 감사드립니다. 그림판에 각종 그림을 그린 후에, 글씨도 입력받아 쓰게 할려는 거거든요. 근데, ...
    • 석주현
      2004.09.07 08:17
      예전에 저도 지금 하시는 것과 비슷한걸 했었는데요.. 전 그냥 Label1 를 놓고 Label1 에 마우스가 눌...
    • 이성수
      2004.09.07 18:29
      답변 감사드립니다. 그림판에 각종 그림을 그린 후에, 글씨도 입력받아 쓰게 할려는 거거든요. 라벨을 ...
    • 이진기
    • 2004.09.07 01:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박상윤
      2004.09.10 00:57
      글세여.아마도 SDK에 있는 예제를 참고하셔야 할듯 direct SDK 9.0 에 amcap 이나 BDA 샘플을 참고하십...
    • 윤용섭
    • 2004.09.07 01:08
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2004.09.07 03:07
      안녕하세요. 최용일입니다. 공개입니다. Open Source Project죠... 9버전이 최신거구요... 델파이 4...
    • 윤용섭
      2004.09.07 04:48
      감사합니다. 오늘 궁금한거 다 찾아가네요. 앞으로도 잘 부탁드려요 ^^
    • 고락춘
    • 2004.09.06 22:34
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 고락춘
      2004.09.07 01:01
      우선 답변주신 닐리리님, 소나기님... 답변 감사드립니다. 제가 자바하다 델파이를 시작한지 몇일 되...
    • 석주현
      2004.09.07 00:50
      비슷한 코드를 만들어서 테스트 해봤는데 문제가 없었습니다. 다른 문제가 아닐런지. -_-;; 코드상 문...
    • nilriri™
      2004.09.06 23:04
      Access violation.. 에러는 존재하지 않는 것을 참조할때 발생하는 에러입니다. i = 1 일때 발생하는 ...
    • 최동열
    • 2004.09.06 19:49
    • 5 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2004.09.06 22:49
      25만건이나 되는 자료가 없어 직접 테스트 해보진 못했습니다. 레지스트리 겁색을 해본바로는.. HK...
    • 최동열
      2004.09.06 23:03
      답변해주셔서 감사합니다. 알려주신데로 설정해보았습니다만..... 똑같은 메시지가 발생합니다. 제 컴레...
    • nilriri™
      2004.09.07 00:16
      기존 25만건 테이블의 이름을 다른걸로 임시로 바꿔 놓습니다. 이름을 바꾼 파일을 복사하여 붙여넣기를...
    • nilriri™
      2004.09.06 23:54
      이 오류는 테이블에 사용할 수 있는 최대 열 수 또는 단일 파일에 대한 최대 잠금 수를 초과할 때 나타납니...
    • 최동열
      2004.09.07 01:53
      저 또한 대책이 없기에 자료를 다시 생성했습니다. 시간이 많이 걸리는 관계로 쉽게 해볼까... 했는데 ...
    • 신석기
    • 2004.09.06 18:04
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2004.09.06 18:22
      안녕하세요. 최용일입니다. 델파이 7 버그입니다... 프로젝트에 빈폼하나 추가한뒤 다시 제거하시면 ...
    • 신석기
      2004.09.07 20:53
      않되는데요... 큰일이네... 꼭 해결해야 하는 문젠데... 다변 감사합니다.^^
    • 이광수
      2004.09.07 23:38
      http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdlec&mode=read&num=1858&page=1&backdepth=1
    • 신석기
      2004.09.08 06:01
      음... 임시로 해결했습니다.^^ 하지만 다시열면 아직도 비활성화되고... 저장하지 않아도 tlb화일에 해...
    • 석주현
      2004.09.07 21:01
      파레트 옵티마이징 데모네요. 인터넷에서 찾았구요. 컨버팅은 이거 보시면 가능할꺼 같네요.. ^^
    • 석주현
      2004.09.07 20:11
      시샵님께서 해주신 데로 하면 무조건 바뀝니다. 그런데 아시지만 그림이 거의 색이 죽어 버립니다. ...
    • 최용일
      2004.09.06 18:21
      안녕하세요. 최용일입니다. 간단합니다. 비트맵파일 열어서 픽셀포멧만 바꾸어서 저장하시면 됩니다... ...
    • 백록화
      2004.09.05 05:17
      yo` 와~ 많네여 ^^ 자료실에 보시면 함수레퍼런스나 오브젝트 파스칼 문법에 관한 문서 있습니다. 한...
    • 이지은
      2004.09.06 10:51
      답변 감사드려요~ 근데 한가지 질문이 더 생겨서요~ str=copy(row,j*8+1,8) 예를 들어 이런 문장이 ...
    • 최용일
      2004.09.06 18:32
      안녕하세요. 최용일입니다. 흠... 다른 형태로의 표현이라는게 뭔지는 잘 모르겠지만... Copy함수...
    • 김춘경
      2004.09.07 05:41
      파일 형태로 출력은 LPT 포트만 가능합니다. COM 포트는 컴포넌트를 사용하시면 됩니다. 한델 자료실에...
    • 백록화
      2004.09.05 05:23
      yo` 흠...소스상으로는 별문제 없어 보입니다만....전 Comport 관련 콤포넌트로 작업했었거든요 ^^;; ...
    • 박영준
    • 2004.09.04 23:19
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이광수
      2004.09.04 23:44
              ret := M_ReadData(PChar(romData)); 해야됩니다. ...
    • 박영준
      2004.09.06 21:20
      답변 감사합니다   설명하신대로   ret := M_ReadData(PChar(romData)); 로 작성...
    • srookie
      2004.09.07 00:10
      안녕하세요. dll의 함수 정의를 var로 하셨네요. var인 경우에는 string을 PChar로 형변환하여 넘기지 못...
    • 유정헌
    • 2004.09.04 19:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 파멸의슬픔
      2004.09.05 03:06
      우선 Indy 버전이 Indy8.009 이상 이여야 하구요... 델파이 디렉토리 밑에 source/toolsapi/dsgnIntf.pas...
    • 김춘경
      2004.09.07 05:13
      먼저 시스템설정의 해당 COM포트 속도와 프린터 출력용 컴포넌트의 속도가 동일해야 합니다. 또한 흐름제...
    • 백록화
      2004.09.05 01:21
      STP131 이라면..커터날이 달린 아담사이즈의 그 프린터 같은데.. 작년인가? 두세개 연결 해본거 같은...
    • 박재용
      2004.09.05 01:38
      흑... 제가 컴포트로 출력하는 방법을 모르는거 같아요 ㅠㅠ 출력방법도 아르켜 주세요... LPT1으...
    • 백 진욱
      2004.09.05 20:56
      우선 포트관련 컴포넌트를 사용하시나 모르겠네요! Com 포트를 통해서 출력하려면 이컴포넌트를 사용하...
    • Mountain
    • 2004.09.04 05:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정찬희
      2004.09.06 04:35
      일단 델파이에서 에디터기능만 쓰길 원하신다고 하셨는데 그건 좀 힘들듯 싶구요.. 다른 좋은 에디터를 골...
    • 박미숙
    • 2004.09.04 02:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 파멸의슬픔
      2004.09.04 03:17
      Borland Database Engine(error $2501)이 에러는 간단히 말해서 BDE Memory 에러입니다... 가장 간단한 해...