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
[782] [Controls] TComboBox를 IE닮은 web 주소창으로 만들기
장성호 [nasilso] 7407 읽음    2008-07-21 16:37
Edit 나 ComboBox 등 아무 컨트롤을 사용해서 URL입력창으로 사용하는것 그냥 된다.

하지만 IE의 주소줄 처럼 만들려면  어떠게 해야할까?
TComboBox가 IE의 주소줄처럼 동작하려면 다음과 같은 몇가지 기능을 추가적으로 구현해야 할것이다.
   1. url자동 완성 기능이 지원
   2. 최근입력 URL을 리스트
   3. URL 앞쪽에 ICON 지원
   4. 기타...

위 기능중에 1번 2번 기능을 구현해보려 한다.

1. url 자동완성 기능이 지원
  먼저 1번 기능은 이 게시판에 이미 올려져 있다.
  SHAutoComplete  API를 이용해서 한다.
  http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=667

  그런데 SHAutoComplete 을 호출하기 전에 TComboBox 안에 있는 EDIT를 찾는것을
  EnumChildWindows 를 이용해 구현하였는데..
  간단히  GetDlgItem 함수로 찾을수 있다.


void __fastcall SetComboAutoComplete(TComboBox *Combo)
{
  typedef HRESULT (CALLBACK* LPFNDLLFUNC)(HWND ,DWORD);

  HWND hWndEdit = GetDlgItem(Combo->Handle,1001);
 
  CoInitialize(NULL);
  HINSTANCE hIns = LoadLibrary("shlwapi.dll");
  if(hIns != NULL)
  {
      LPFNDLLFUNC lpfnDllFunc = (LPFNDLLFUNC)GetProcAddress(hIns, (LPCSTR)("SHAutoComplete"));
      if(lpfnDllFunc!=NULL)
      {
          lpfnDllFunc(hWndEdit, 0xe);
      }
      FreeLibrary(hIns);
  }
  CoUninitialize();
}




URL입력후 엔터키를 치면 WebBroswer가 Navigate되도록 해야 하는데..
보통 키 입력은 KeyPress이벤트 핸들러에서 구현하면 되지만
SHAutoComplete 를 적용한 Edit에서는 KeyDown에서 구현해야 한다.


void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if(Key==0x000D)
  {
     WideString wStr=ComboBox1->Text;
     CppWebBrowser1->Navigate(wStr);
  }
}



2. ComboBox의 DropDown버튼 클릭시 최근입력 URL 리스트 하기
 
  IE에서 최근 타이핑으로 입력해서 Navigate한 URL은 
  레지스터리 "Software\\Microsoft\\Internet Explorer\\TypedURLs"에 기록되어있다.
 
  위 레지스터리의 목록을 가져와서 TComboBox의 Items에 추가해주면 된다.

void __fastcall GetTypedURLs(TComboBox *Combo)
{
  TRegistry *Reg;
  TStringList *UrlList;
  bool bOpen;
  Reg=new TRegistry;
  Reg->RootKey=HKEY_CURRENT_USER;
  bOpen=Reg->OpenKey("Software\\Microsoft\\Internet Explorer\\TypedURLs",false);
  UrlList=new TStringList;

  Combo->Items->Clear();
  Reg->GetValueNames(UrlList);
  for ( int idx=0 ; idxCount ; idx++)
  {
    Combo->Items->Add(Reg->ReadString(UrlList->Strings[idx]));
  }

  delete UrlList;
  delete Reg;
}


    그런데 위와같이만 하면  ComboBox에 직접 url을 입력할때 Items에 add된 url과
    자동완성 기능이 돌아갈수 있으므로
    TComboBox의 AutoComplete를 false로 해줘야 한다.

    마지막으로 TComboBox의  Items 중에 하나를 선택했을때 Navigate를 구현하려면
    TComboBox의  OnSelect 이벤트 핸들러에서 Navigate를 구현하면 된다.


void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
  if(ComboBox1->ItemIndex>=0)
  {
    WideString wStr=ComboBox1->Text;
    CppWebBrowser1->Navigate(wStr);
  }
}

 


문론 SHAutoComplete와 GetTypedURLs은
ComboBox가 만들어진후 한번만 호출해주면된다.


void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ComboBox1->AutoComplete=false;
  ComboBox1->AutoDropDown=false;

  SetEditAutoComplete(Edit1);
  SetComboAutoComplete(ComboBox1);
  GetTypedURLs(ComboBox1);
}


  이 기능이 좀더 IE처럼 되려면
  - ComboBox에 직접 타이핑에서 navigate된 url은  ComboBox Items에 Add해야 하구
  - 프로그램 종료시 레지스터리에 TypedUrls를 기록해 줘야 할것이다.

그럼..

+ -

관련 글 리스트
782 [Controls] TComboBox를 IE닮은 web 주소창으로 만들기 장성호 7407 2008/07/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.