델마당에서 가져왔습니다.
http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=43&indx=197474&keyword1=SHAutoComplete&keyword2=
[SHAutoComplete 함수 사용하기]
SHAutoComplete 함수를 그냥 한번 호출해주면 되더군요
핸들은 넘겨서
SHAutoComplete(Edit1->Handle) ; 이렇게
너무 간단하죠?
그런데 그냥은 안되더군요
CoInitialize(NULL); 해줘야 되더군요
COM 관련함수 인가 봅니다.
그리고 프로젝트 옵션 Conditional defines에 NO_WIN32_LEAN_AND_MEAN 추가해주시구요
[TEdit에 적용]
void __fastcall TForm1::FormCreate(TObject *Sender)
{
typedef HRESULT (CALLBACK* LPFNDLLFUNC1)(HWND ,DWORD);
CoInitialize(NULL);
HINSTANCE hIns = LoadLibrary("shlwapi.dll");
if(hIns != NULL)
{
LPFNDLLFUNC1 lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hIns, (LPCSTR)("SHAutoComplete"));
if(lpfnDllFunc1!=NULL)
{
lpfnDllFunc1(Edit1->Handle, 0xe);
}
FreeLibrary(hIns);
}
CoUninitialize();
}
[TComboBox에 적용]
똑같은 기능을 Combobox에도 적용할수 있습니다.
그런데 SHAutoComplete(ComboBox1->Handle) ; 이렇게 해서는 안됩니다.
SHAutoComplete 함수가 EDIT 형만 가능한가봐요
우리가 알고있는 TComboBox에는 EDIT가 숨어있거든요
그래서 EnumChildWindows 함수로 TComboBox에서 EDIT를 찾아서 SHAutoComplete 해주면 됩니다.
//---------------------------------------------------------------------------
BOOL CALLBACK EnumChildProc_FindEdit( HWND hwnd, LPARAM lParam)
{
TCHAR szClassName[MAX_PATH+1];
::GetClassName(hwnd, szClassName, MAX_PATH);
String sClassName = szClassName;
if(sClassName.UpperCase()=="EDIT")
{
HWND * hWndEdit = (HWND*)lParam;
*hWndEdit = hwnd;
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
void __fastcall MakeSHAutoComplete(HWND hWnd)
{
typedef HRESULT (CALLBACK* LPFNDLLFUNC1)(HWND ,DWORD);
CoInitialize(NULL);
HINSTANCE hIns = LoadLibrary("shlwapi.dll");
if(hIns != NULL)
{
LPFNDLLFUNC1 lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hIns, (LPCSTR)("SHAutoComplete"));
if(lpfnDllFunc1!=NULL)
{
lpfnDllFunc1(hWnd, 0xe);
}
FreeLibrary(hIns);
}
CoUninitialize();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Edit1에 웹히스트로 자동완성 적용
MakeSHAutoComplete(Edit1->Handle);
//ComboBox1에 웹히스트로 자동완성 적용
HWND hWndCombo = ComboBox1->Handle;
HWND hWndEdit = 0;
EnumChildWindows(hWndCombo, (WNDENUMPROC)EnumChildProc_FindEdit, (LPARAM)&hWndEdit);
MakeSHAutoComplete(hWndEdit);
}
//---------------------------------------------------------------------------
그럼 즐거운 하루 되세요...
|
(~_~)