最近项目需要在SmartPhone上实现一个HyperLink的功能,显然win32的控件里没有现成的,只有自己开发一个
首先注册一个窗口类
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
...{
……
if (!HyperLinkRegisterClass(hInstance)
...{
return FALSE;
}
……
}
ATOM HyperLinkRegisterClass(HINSTANCE hInstance)
...{

WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = HyperLinkWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
//wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
//wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TEXT("CtlHyperLink");
return RegisterClass (&wndclass) ;

}
然后处理控件的各种消息达到自己想要的效果
LRESULT CALLBACK HyperLinkWndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
...{
LONG ID;
switch (message)
...{
case WM_PAINT:
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
...{
pszText = HYPERLINK_CAPTION[i];
if(bHyperLinkSelect[i])
RenderHyperLink(hwnd,TRUE);
else
RenderHyperLink(hwnd,FALSE);
}

return 0 ;
case WM_SETFOCUS:
/**//*RenderHyperLink(hwnd,TRUE); */
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
...{
bHyperLinkSelect[i] = TRUE;
}

InvalidateRect(hwnd, NULL, true);
SendMessage(hwnd, WM_PAINT, GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd);
return 0 ;
case WM_KILLFOCUS:
/**//*RenderHyperLink(hwnd,TRUE); */
ID= (LONG)GetWindowLong (hwnd, GWL_ID);
for(int i=0;i<CAPTION_INDEX_LENGTH;i++)
if(HYPERLINK_CAPTION_INDEX[i] == ID)
...{
bHyperLinkSelect[i] = FALSE;
}
InvalidateRect(hwnd, NULL, true);
SendMessage(hwnd, WM_PAINT, GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd);
return 0 ;
case WM_KEYUP:
if (wParam != VK_SPACE)
break ;// fall through

/**//*case WM_KEYUP:
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;
case WM_KEYDOWN:
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;*/
//case WM_KEYDOWN:

// return 0 ;
case WM_LBUTTONUP :
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
int RenderHyperLink(HWND hwnd,BOOL bSelect)
...{
LOGFONT ft;
HFONT hFontNew, hFontOld;
HBRUSH hBrush;
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
GetClientRect (hwnd, &rect);

hdc = BeginPaint (hwnd, &ps);
hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)) ;
hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
FillRect(hdc,&rect,hBrush);
memset(&ft, 0, sizeof(ft));
wcscpy(ft.lfFaceName, TEXT("宋体")); //fonttype
ft.lfHeight = 16; //fontsize
ft.lfUnderline = TRUE;

hFontNew = CreateFontIndirect(&ft);
hFontOld = (HFONT)SelectObject(hdc, hFontNew);
if(bSelect)
...{
SetBkColor (hdc, GetSysColor (COLOR_WINDOW));
SetTextColor (hdc, (COLORREF)0x000000FF);
}
else
...{
SetBkColor (hdc, GetSysColor (COLOR_WINDOW));
SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT));
}

DrawText (hdc, pszText, -1, &rect,
DT_SINGLELINE | DT_LEFT );
//SetWindowLong(hwnd,GWL_STYLE,WS_CAPTION);
SelectObject(hdc, hFontOld);
DeleteObject (SelectObject (hdc, hBrush)) ;
EndPaint (hwnd, &ps) ;
return 0;
}

最后,在RC编辑器里托一个Custom Control到Dialog上,在Class属性里填写CtlHyperLink