#include #include "link_control.h" static HCURSOR link_hand_cursor; static LRESULT link_handlecursor(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT ret = CallWindowProcW((WNDPROC)GetPropW(hwndDlg, L"link_proc"), hwndDlg, uMsg, wParam, lParam); // override the normal cursor behaviour so we have a hand to show it is a link if(uMsg == WM_SETCURSOR) { if((HWND)wParam == hwndDlg) { if(!link_hand_cursor) { link_hand_cursor = LoadCursor(NULL, IDC_HAND); } SetCursor(link_hand_cursor); return TRUE; } } return ret; } void link_startsubclass(HWND hwndDlg, UINT id){ HWND ctrl = GetDlgItem(hwndDlg, id); SetPropW(ctrl, L"link_proc", (HANDLE)(LONG_PTR)SetWindowLongPtrW(ctrl, GWLP_WNDPROC, (LONG_PTR)link_handlecursor)); } void link_handledraw(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_DRAWITEM) { DRAWITEMSTRUCT *di = (DRAWITEMSTRUCT *)lParam; if (di->CtlType == ODT_BUTTON) { wchar_t wt[123] = {0}; int y; RECT r; HPEN hPen, hOldPen; GetDlgItemTextW(hwndDlg, (INT)wParam, wt, 123); // draw text SetTextColor(di->hDC, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); r = di->rcItem; r.left += 2; DrawTextW(di->hDC, wt, -1, &r, DT_VCENTER | DT_SINGLELINE); memset(&r, 0, sizeof(r)); DrawTextW(di->hDC, wt, -1, &r, DT_SINGLELINE | DT_CALCRECT); // draw underline y = di->rcItem.bottom - ((di->rcItem.bottom - di->rcItem.top) - (r.bottom - r.top)) / 2 - 1; hPen = CreatePen(PS_SOLID, 0, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220)); hOldPen = (HPEN) SelectObject(di->hDC, hPen); MoveToEx(di->hDC, di->rcItem.left + 2, y, NULL); LineTo(di->hDC, di->rcItem.right + 2 - ((di->rcItem.right - di->rcItem.left) - (r.right - r.left)), y); SelectObject(di->hDC, hOldPen); DeleteObject(hPen); } } }