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를 기록해 줘야 할것이다.
그럼..