最近项目需要在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 |