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

델파이 팁&트릭
Delphi Programming Tip&Tricks
[158] 팁! 강제로 힌트윈도우 만들기
박지훈.임프 [cbuilder] 15796 읽음    1999-06-04 00:00
임펠리테리입니다.
얼마전에 플뱅 빌더모임에 임의의 순간에, 특히 포커스가 왔을때 힌트 윈도우를 디
스플레이하는 방법에 대한 질문이 올라왔었죠. 저는 이 방법을 vcl에서 지원하는
원래의 힌트 윈도우를 추적하여 해결하려고 했었는데.. 뜻밖에도 엉뚱한 곳에서 답
이 나왔군요.

제가 해결한 것은 아니구요, 제가 하이텔 비파툴에 자주 가는데 거기서 다른분이
질문하신 데 대해서 방태윤님(하이텔 아이디:ba1004)께서 답변을 해주셨습니다.
정말 엉뚱하게도... THintWindow라는 클래스가 있더군요. 여기에 메모리를 할당하고
적당한 좌표를 TRect형으로, 그리고 문자열을 AnsiString형으로 넘겨주고 ActivateH
int 멤버함수를 호출하면 힌트 윈도우가 팍~ 뜨더군요. (쩝... 힌트 클래스가 있을
줄은 생각도 못했습니다.)

어쨌든 방태윤님께 감사드리구요, 아래 소스는 방태윤님의 소스를 참고하여 만든겁
니다. 먼저 준비작업으로, 폼에 에디트 세개를 또독독 떨어뜨려놓고, 각각 힌트문자
열을 임의로 집어넣습니다. ShowHint 프로퍼티는 값이 어떻든 관계없습니다. 그냥
힌트 문자열만 읽어올거니까요. 그런후에 다음과 같이 코딩합니다.

(델파이 소스는 아래에 있습니다)

헤더 파일
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
    TEdit *Edit1;
    TEdit *Edit2;
    TEdit *Edit3;
    void __fastcall Edit1Enter(TObject *Sender);
    void __fastcall Edit1Exit(TObject *Sender);
private: // User declarations
public:  // User declarations
    THintWindow *MyHint;
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


C++ 파일
//---------------------------------------------------------------------------
// Thanks to 방태윤(하이텔:ba1004)
//---------------------------------------------------------------------------
 
#include 
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
    TControl *SenderControl = dynamic_cast(Sender);
    MyHint = new THintWindow(this);
    MyHint->Brush->Color = RGB(255, 255, 224);    //  :0x00E0FFFF
    AnsiString HintString = SenderControl->Hint;
    RECT r = MyHint->CalcHintRect(200, HintString, 0);
    TPoint pt = ClientToScreen(Point(SenderControl->Left, SenderControl->Top+S
enderControl->Height));
    OffsetRect(&r, pt.x, pt.y);
    MyHint->ActivateHint(r, HintString);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
    if(MyHint)
    {
        MyHint->ReleaseHandle();
        delete MyHint;
        MyHint = NULL;
    }
}
//---------------------------------------------------------------------------


델파이에서는, 먼저 폼의 멤버로 아래와 같이 추가한 후,
MyHint: THintWindow;

에디트의 OnEnter와 OnExit 이벤트 핸들러를 다음과 같이 만듭니다.

procedure TForm1.Edit1Enter(Sender: TObject);
var
  SenderControl: TControl;
  HintString: string;
  r: TRect;
  pt: TPoint;
begin
  SenderControl := Sender as TControl;
  MyHint := THintWindow.Create(self);
  MyHint.Brush.Color := RGB(255, 255, 224);    //  :0x00E0FFFF
  HintString := SenderControl.Hint;
  r := MyHint.CalcHintRect(200, HintString, 0);
  pt := ClientToScreen(Point(SenderControl.Left, SenderControl.Top+SenderControl.Height));
  OffsetRect(r, pt.x, pt.y);
  MyHint.ActivateHint(r, HintString);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Assigned(MyHint) then
  begin
    MyHint.ReleaseHandle;
    FreeAndNil(MyHint);
  end;
end;


이렇게 해서 컴파일해서 실행해보면, 포커스가 있는 에디트의 바로 아래에 힌트윈도
우가 뜹니다. 하지만 이렇게 나오는 힌트윈도우는 두가지 문제가 있습니다. 원래
디폴트로 나오는 힌트와는 별개이기 때문에 각 에디트들의 ShowHint가 true로 잡혀
있을때 두개의 힌트가 중첩되어 나올수 있습니다. 또 한가지 문제는, 어플리케이션
자체가 디액티베이트되었을때, 즉 다른 프로그램이 활성화되었을때도 힌트 윈도우가
그대로 남아있습니다. 이 문제를 해결하려면 어플리케이션의 OnActivate와 OnDeacti
vate의 코드를 만들어줘서 그때 힌트를 숨겨주도록 해야겠죠.

그럼 도움되시길 바라면서, 이만...


독립문에서 임펠리테리였습니다.

+ -

관련 글 리스트
158 팁! 강제로 힌트윈도우 만들기 박지훈.임프 15796 1999/06/04
(링크)     C++Builder Tip'N Tricks > 팁! 강제로 힌트윈도우 만들기
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.