2 * PROJECT: ReactOS System Control Panel Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/sysdm/custclicklink.c
5 * PURPOSE: Subclass static control to link to apps
6 * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
12 #define LINK_COLOR RGB(0,0,128)
13 #define MAX_PARAMS 256
15 typedef struct _LINKCTL
19 TCHAR szApp
[MAX_PATH
];
20 TCHAR szParams
[MAX_PARAMS
];
28 DoLButtonUp(PLINKCTL pLink
, LPARAM lParam
)
36 pt
.x
= (short)LOWORD(lParam
);
37 pt
.y
= (short)HIWORD(lParam
);
38 ClientToScreen(pLink
->hSelf
, &pt
);
39 GetWindowRect(pLink
->hSelf
, &rc
);
40 if (PtInRect(&rc
, pt
))
50 pLink
->bClicked
= FALSE
;
56 DoPaint(PLINKCTL pLink
, HDC hdc
)
58 TCHAR szText
[MAX_PATH
];
59 DWORD WinStyle
, DrawStyle
;
63 WinStyle
= GetWindowLongPtr(pLink
->hSelf
, GWL_STYLE
);
64 DrawStyle
= DT_SINGLELINE
;
66 if (WinStyle
& SS_CENTER
)
67 DrawStyle
|= DT_CENTER
;
68 if (WinStyle
& SS_RIGHT
)
69 DrawStyle
|= DT_RIGHT
;
70 if (WinStyle
& SS_CENTERIMAGE
)
71 DrawStyle
|= DT_VCENTER
;
73 SetTextColor(hdc
, LINK_COLOR
);
74 SetBkMode(hdc
, TRANSPARENT
);
75 hOld
= SelectObject(hdc
, pLink
->hFont
);
76 SetBkColor(hdc
, GetSysColor(COLOR_3DFACE
));
78 GetClientRect(pLink
->hSelf
, &rc
);
80 GetWindowText(pLink
->hSelf
, szText
, sizeof(szText
));
81 DrawText(hdc
, szText
, -1, &rc
, DrawStyle
);
86 static LRESULT CALLBACK
87 LinkCtlWndProc(HWND hwnd
,
92 PLINKCTL pLink
= (PLINKCTL
)GetWindowLongPtr(hwnd
, GWL_USERDATA
);
93 WNDPROC oldproc
= pLink
->OldProc
;
102 hdc
= BeginPaint(hwnd
, &ps
);
110 HCURSOR hCur
= LoadCursor(NULL
, IDC_HAND
);
120 hOldFont
= (HFONT
)GetStockObject(DEFAULT_GUI_FONT
);
121 GetObject(hOldFont
, sizeof(LogFont
), &LogFont
);
122 LogFont
.lfUnderline
= TRUE
;
123 if (pLink
->hFont
) DeleteObject(hwnd
);
124 pLink
->hFont
= CreateFontIndirect(&LogFont
);
126 CallWindowProc(pLink
->OldProc
, hwnd
, msg
, wParam
, lParam
);
130 InvalidateRect(hwnd
, NULL
, TRUE
);
143 pLink
->bClicked
= TRUE
;
149 DoLButtonUp(pLink
, lParam
);
155 HeapFree(GetProcessHeap(),
162 return CallWindowProc(oldproc
,
171 TextToLink(HWND hwnd
,
179 if (lstrlen(lpApp
) >= (MAX_PATH
- 1) ||
180 lstrlen(lpParams
) >= (MAX_PARAMS
-1))
185 pLink
= (PLINKCTL
)HeapAlloc(GetProcessHeap(),
192 lstrcpyn(pLink
->szApp
, lpApp
, MAX_PATH
);
193 lstrcpyn(pLink
->szParams
, lpParams
, MAX_PARAMS
);
194 pLink
->bClicked
= FALSE
;
196 hFont
=(HFONT
)SendMessage(hwnd
, WM_GETFONT
, 0, 0);
199 pLink
->OldProc
= (WNDPROC
)SetWindowLongPtr(hwnd
,
201 (LONG_PTR
)LinkCtlWndProc
);
202 SetWindowLongPtr(hwnd
,
206 SendMessage(hwnd
, WM_SETFONT
, (WPARAM
)hFont
, 0);