Index: src/ch/StaticEx.cpp
===================================================================
diff -u -rd2b121c78f510b5384b8ef0ca80afbfd7f77fef7 -rd5c3edd0d167db9b5d47d04248820fda49499a5e
--- src/ch/StaticEx.cpp	(.../StaticEx.cpp)	(revision d2b121c78f510b5384b8ef0ca80afbfd7f77fef7)
+++ src/ch/StaticEx.cpp	(.../StaticEx.cpp)	(revision d5c3edd0d167db9b5d47d04248820fda49499a5e)
@@ -1,352 +1,352 @@
-/***************************************************************************
-*   Copyright (C) 2001-2008 by J�zef Starosczyk                           *
-*   ixen@copyhandler.com                                                  *
-*                                                                         *
-*   This program is free software; you can redistribute it and/or modify  *
-*   it under the terms of the GNU Library General Public License          *
-*   (version 2) as published by the Free Software Foundation;             *
-*                                                                         *
-*   This program is distributed in the hope that it will be useful,       *
-*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
-*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
-*   GNU General Public License for more details.                          *
-*                                                                         *
-*   You should have received a copy of the GNU Library General Public     *
-*   License along with this program; if not, write to the                 *
-*   Free Software Foundation, Inc.,                                       *
-*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
-***************************************************************************/
-#include "stdafx.h"
-#include "StaticEx.h"
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#endif
-
-#define STATICEX_CLASS _T("STATICEX")
-
-LRESULT CALLBACK StaticExWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
-	STATICEXSETTINGS* pSettings=(STATICEXSETTINGS*)GetWindowLongPtr(hwnd, 0);
-	switch (uMsg)
-	{
-	case WM_NCCREATE:
-		{
-			STATICEXSETTINGS* pSett=new STATICEXSETTINGS;
-			pSett->hFontNormal=NULL;
-			pSett->hFontUnderline=NULL;
-			pSett->pszLink=NULL;
-			pSett->pszText=NULL;
-			pSett->bActive=false;
-			pSett->bDown=false;
-			pSett->hLink=NULL;
-			pSett->hNormal=NULL;
-			pSett->rcText.left=0;
-			pSett->rcText.right=0;
-			pSett->rcText.top=0;
-			pSett->rcText.bottom=0;
-			::SetWindowLongPtr(hwnd, 0, (LONG_PTR)pSett);
-
-			// create cursors
-			pSett->hNormal=::LoadCursor(NULL, IDC_ARROW);
-			pSett->hLink=::LoadCursor(NULL, IDC_HAND);
-
-			break;
-		}
-	case WM_CREATE:
-		{
-			CREATESTRUCT* pcs=(CREATESTRUCT*)lParam;
-
-			const TCHAR* pSep=_tcsrchr(pcs->lpszName, _T('|'));
-
-			if (!(pcs->style & SES_LINK) || pSep == NULL || pSep-pcs->lpszName < 0)
-			{
-				pSettings->pszText=new TCHAR[_tcslen(pcs->lpszName)+1];
-				_tcscpy(pSettings->pszText, pcs->lpszName);
-				pSettings->pszLink=NULL;
-			}
-			else
-			{
-				pSettings->pszText=new TCHAR[pSep-pcs->lpszName+1];
-				_tcsncpy(pSettings->pszText, pcs->lpszName, pSep-pcs->lpszName);
-				pSettings->pszText[pSep-pcs->lpszName]=_T('\0');
-				pSep++;
-				pSettings->pszLink=new TCHAR[_tcslen(pSep)+1];
-				_tcscpy(pSettings->pszLink, pSep);
-			}
-
-			break;
-		}
-	case WM_NCDESTROY:
-		{
-			if (pSettings->hFontNormal)
-				DeleteObject(pSettings->hFontNormal);
-			if (pSettings->hFontUnderline)
-				DeleteObject(pSettings->hFontUnderline);
-			if (pSettings->hLink)
-				DeleteObject(pSettings->hLink);
-			if (pSettings->hNormal)
-				DeleteObject(pSettings->hNormal);
-			delete [] pSettings->pszLink;
-			delete [] pSettings->pszText;
-
-			delete pSettings;
-			break;
-		}
-	case WM_SETFONT:
-		{
-			// delete old fonts
-			if (pSettings->hFontNormal)
-				DeleteObject(pSettings->hFontNormal);
-			if (pSettings->hFontUnderline)
-				DeleteObject(pSettings->hFontUnderline);
-
-			// new font - create a font based on it (the normal and the underlined one)
-			HFONT hfont=(HFONT)wParam;
-			LOGFONT lf;
-			if (GetObject(hfont, sizeof(LOGFONT), &lf) != 0)
-			{
-				// size
-				if (::GetWindowLong(hwnd, GWL_STYLE) & SES_LARGE)
-					lf.lfHeight=(long)(lf.lfHeight*1.25);
-
-				// create a font
-				if (::GetWindowLong(hwnd, GWL_STYLE) & SES_BOLD)
-					lf.lfWeight=FW_BOLD;
-				pSettings->hFontNormal=CreateFontIndirect(&lf);
-				lf.lfUnderline=TRUE;
-				pSettings->hFontUnderline=CreateFontIndirect(&lf);
-			}
-			else
-			{
-				pSettings->hFontNormal=NULL;
-				pSettings->hFontUnderline=NULL;
-			}
-
-			break;
-		}
-	case WM_SETTEXT:
-		{
-			// delete the old font
-			delete [] pSettings->pszText;
-			delete [] pSettings->pszLink;
-
-			// style
-			LONG lStyle=::GetWindowLong(hwnd, GWL_STYLE);
-
-			LPCTSTR psz=(LPCTSTR)lParam;
-			const TCHAR* pSep=_tcsrchr(psz, _T('|'));
-
-			if (!(lStyle & SES_LINK) || pSep == NULL || pSep-psz < 0)
-			{
-				pSettings->pszText=new TCHAR[_tcslen(psz)+1];
-				_tcscpy(pSettings->pszText, psz);
-				pSettings->pszLink=NULL;
-			}
-			else
-			{
-				pSettings->pszText=new TCHAR[pSep-psz+1];
-				_tcsncpy(pSettings->pszText, psz, pSep-psz);
-				pSettings->pszText[pSep-psz]=_T('\0');
-				pSep++;
-				pSettings->pszLink=new TCHAR[_tcslen(pSep)+1];
-				_tcscpy(pSettings->pszLink, pSep);
-			}
-
-			::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
-			break;
-		}
-	case WM_ERASEBKGND:
-		{
-			return (LRESULT)FALSE;
-			break;
-		}
-	case WM_PAINT:
-		{
-			// draw anything
-			PAINTSTRUCT ps;
-			HDC hDC=BeginPaint(hwnd, &ps);
-
-			// flicker-free drawing
-			HDC hdc=::CreateCompatibleDC(hDC);
-			HBITMAP hBmp=::CreateCompatibleBitmap(hDC, ps.rcPaint.right-ps.rcPaint.left+1, ps.rcPaint.bottom-ps.rcPaint.top+1);
-			HBITMAP hOldBitmap=(HBITMAP)::SelectObject(hdc, hBmp);
-			::SetWindowOrgEx(hdc, ps.rcPaint.left, ps.rcPaint.top, NULL);
-
-			// paint the background
-			::FillRect(hdc, &ps.rcPaint, (HBRUSH)::SendMessage((HWND)::GetWindowLong(hwnd, GWLP_HWNDPARENT), WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd));
-
-			// size of the all control
-			RECT rcCtl;
-			::GetClientRect(hwnd, &rcCtl);
-
-			// draw text
-			DWORD dwFlags=DT_LEFT | DT_VCENTER | (::GetWindowLong(hwnd, GWL_STYLE) & SES_PATHELLIPSIS ? DT_PATH_ELLIPSIS : 0)
-				| (::GetWindowLong(hwnd, GWL_STYLE) & SES_ELLIPSIS ? DT_END_ELLIPSIS : 0)
-				| (::GetWindowLong(hwnd, GWL_STYLE) & SES_WORDBREAK ? DT_WORDBREAK : 0);
-
-			pSettings->rcText=rcCtl;
-			if (::GetWindowLong(hwnd, GWL_STYLE) & SES_LINK)
-			{
-				HFONT hOld=(HFONT)::SelectObject(hdc, pSettings->hFontUnderline);
-				::SetBkMode(hdc, TRANSPARENT);
-
-				COLORREF crColor=(pSettings->bActive ? (RGB(255, 0, 0)) : (RGB(0, 0, 255)));
-				::SetTextColor(hdc, crColor);
-
-				if (pSettings->pszText)
-				{
-					DrawText(hdc, pSettings->pszText, -1, &pSettings->rcText, dwFlags | DT_CALCRECT);
-					DrawText(hdc, pSettings->pszText, -1, &rcCtl, dwFlags);
-				}
-				else
-				{
-					pSettings->rcText.left=0;
-					pSettings->rcText.right=0;
-					pSettings->rcText.top=0;
-					pSettings->rcText.bottom=0;
-				}
-
-				::SelectObject(hdc, hOld);
-			}
-			else
-			{
-				// aesthetics
-				rcCtl.left+=3;
-				rcCtl.right-=3;
-
-				// draw
-				HFONT hOld=(HFONT)::SelectObject(hdc, pSettings->hFontNormal);
-				::SetBkMode(hdc, TRANSPARENT);
-				::SetTextColor(hdc, ::GetSysColor(COLOR_BTNTEXT));
-
-				if (pSettings->pszText)
-				{
-					DWORD dwMod=(::GetWindowLong(hwnd, GWL_STYLE) & SES_RALIGN) ? DT_RIGHT : 0;
-					DrawText(hdc, pSettings->pszText, -1, &pSettings->rcText, dwFlags | DT_CALCRECT | dwMod);
-					DrawText(hdc, pSettings->pszText, -1, &rcCtl, dwFlags | dwMod);
-				}
-				else
-				{
-					pSettings->rcText.left=0;
-					pSettings->rcText.right=0;
-					pSettings->rcText.top=0;
-					pSettings->rcText.bottom=0;
-				}
-
-				::SelectObject(hdc, hOld);
-			}
-
-			// free the compatible dc
-			::BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right-ps.rcPaint.left+1, ps.rcPaint.bottom-ps.rcPaint.top+1, 
-				hdc, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
-			::SelectObject(hdc, hOldBitmap);
-			::DeleteObject(hBmp);
-			::DeleteDC(hdc);
-
-			EndPaint(hwnd, &ps);
-
-			break;
-		}
-	case WM_MOUSEMOVE:
-		{
-			if (::GetWindowLong(hwnd, GWL_STYLE) & SES_LINK)
-			{
-				POINT pt = { LOWORD(lParam), HIWORD(lParam) };
-				
-				if (pSettings->bActive)
-				{
-					if (!::PtInRect(&pSettings->rcText, pt))
-					{
-						pSettings->bActive=false;
-						::ReleaseCapture();
-						::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
-						
-						::SetCursor(pSettings->hNormal);
-					}
-				}
-				else
-				{
-					if (::PtInRect(&pSettings->rcText, pt))
-					{
-						pSettings->bActive=true;
-						::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
-						::SetCapture(hwnd);
-						::SetCursor(pSettings->hLink);
-					}
-				}
-			}
-			break;
-		}
-	case WM_LBUTTONDOWN:
-		{
-			pSettings->bDown=true;
-			break;
-		}
-	case WM_LBUTTONUP:
-		{
-			POINT pt={ LOWORD(lParam), HIWORD(lParam) };
-			if (pSettings->bDown && ::GetWindowLong(hwnd, GWL_STYLE) & SES_LINK && ::PtInRect(&pSettings->rcText, pt))
-			{
-				if (::GetWindowLong(hwnd, GWL_STYLE) & SES_NOTIFY)
-				{
-					::SendMessage((HWND)::GetWindowLong(hwnd, GWLP_HWNDPARENT), WM_COMMAND, (WPARAM)(SEN_CLICKED << 16 | ::GetWindowLong(hwnd, GWL_ID)), (LPARAM)hwnd);
-				}
-				else
-				{
-					
-					TRACE("Executing %s...\n", pSettings->pszLink);
-					ShellExecute(NULL, _T("open"), pSettings->pszLink, NULL, NULL, SW_SHOWNORMAL);
-				}
-			}
-			pSettings->bDown=false;
-
-			break;
-		}
-	case WM_CANCELMODE:
-		{
-			pSettings->bActive=false;
-			pSettings->bDown=false;
-			break;
-		}
-	case SEM_GETLINK:
-		{
-			// wParam - count
-			// lParam - addr of a buffer
-			if (pSettings->pszLink)
-				_tcsncpy((PTSTR)lParam, pSettings->pszLink, (int)wParam);
-			else
-				_tcscpy((PTSTR)lParam, _T(""));
-
-			return (LRESULT)TRUE;
-			break;
-		}
-	}
-
-	return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
-}
-
-bool RegisterStaticExControl(HINSTANCE hInstance)
-{
-    WNDCLASS wndcls;
-
-    if (!(::GetClassInfo(hInstance, STATICEX_CLASS, &wndcls)))
-    {
-        // need to register a new class
-        wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
-		wndcls.lpfnWndProc = ::StaticExWndProc;
-        wndcls.cbClsExtra = 0;
-		wndcls.cbWndExtra = sizeof(STATICEXSETTINGS*);
-        wndcls.hInstance = hInstance;
-        wndcls.hIcon = NULL;
-		wndcls.hCursor = NULL;				// will load each time needed
-        wndcls.hbrBackground = NULL;
-        wndcls.lpszMenuName = NULL;
-        wndcls.lpszClassName = STATICEX_CLASS;
-
-        if (!RegisterClass(&wndcls))
-            return false;
-    }
-
-    return true;
-}
+/***************************************************************************
+*   Copyright (C) 2001-2008 by J�zef Starosczyk                           *
+*   ixen@copyhandler.com                                                  *
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU Library General Public License          *
+*   (version 2) as published by the Free Software Foundation;             *
+*                                                                         *
+*   This program is distributed in the hope that it will be useful,       *
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+*   GNU General Public License for more details.                          *
+*                                                                         *
+*   You should have received a copy of the GNU Library General Public     *
+*   License along with this program; if not, write to the                 *
+*   Free Software Foundation, Inc.,                                       *
+*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+***************************************************************************/
+#include "stdafx.h"
+#include "StaticEx.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+#define STATICEX_CLASS _T("STATICEX")
+
+LRESULT CALLBACK StaticExWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+	STATICEXSETTINGS* pSettings=(STATICEXSETTINGS*)GetWindowLongPtr(hwnd, 0);
+	switch (uMsg)
+	{
+	case WM_NCCREATE:
+		{
+			STATICEXSETTINGS* pSett=new STATICEXSETTINGS;
+			pSett->hFontNormal=NULL;
+			pSett->hFontUnderline=NULL;
+			pSett->pszLink=NULL;
+			pSett->pszText=NULL;
+			pSett->bActive=false;
+			pSett->bDown=false;
+			pSett->hLink=NULL;
+			pSett->hNormal=NULL;
+			pSett->rcText.left=0;
+			pSett->rcText.right=0;
+			pSett->rcText.top=0;
+			pSett->rcText.bottom=0;
+			::SetWindowLongPtr(hwnd, 0, (LONG_PTR)pSett);
+
+			// create cursors
+			pSett->hNormal=::LoadCursor(NULL, IDC_ARROW);
+			pSett->hLink=::LoadCursor(NULL, IDC_HAND);
+
+			break;
+		}
+	case WM_CREATE:
+		{
+			CREATESTRUCT* pcs=(CREATESTRUCT*)lParam;
+
+			const TCHAR* pSep=_tcsrchr(pcs->lpszName, _T('|'));
+
+			if (!(pcs->style & SES_LINK) || pSep == NULL || pSep-pcs->lpszName < 0)
+			{
+				pSettings->pszText=new TCHAR[_tcslen(pcs->lpszName)+1];
+				_tcscpy(pSettings->pszText, pcs->lpszName);
+				pSettings->pszLink=NULL;
+			}
+			else
+			{
+				pSettings->pszText=new TCHAR[pSep-pcs->lpszName+1];
+				_tcsncpy(pSettings->pszText, pcs->lpszName, pSep-pcs->lpszName);
+				pSettings->pszText[pSep-pcs->lpszName]=_T('\0');
+				pSep++;
+				pSettings->pszLink=new TCHAR[_tcslen(pSep)+1];
+				_tcscpy(pSettings->pszLink, pSep);
+			}
+
+			break;
+		}
+	case WM_NCDESTROY:
+		{
+			if (pSettings->hFontNormal)
+				DeleteObject(pSettings->hFontNormal);
+			if (pSettings->hFontUnderline)
+				DeleteObject(pSettings->hFontUnderline);
+			if (pSettings->hLink)
+				DeleteObject(pSettings->hLink);
+			if (pSettings->hNormal)
+				DeleteObject(pSettings->hNormal);
+			delete [] pSettings->pszLink;
+			delete [] pSettings->pszText;
+
+			delete pSettings;
+			break;
+		}
+	case WM_SETFONT:
+		{
+			// delete old fonts
+			if (pSettings->hFontNormal)
+				DeleteObject(pSettings->hFontNormal);
+			if (pSettings->hFontUnderline)
+				DeleteObject(pSettings->hFontUnderline);
+
+			// new font - create a font based on it (the normal and the underlined one)
+			HFONT hfont=(HFONT)wParam;
+			LOGFONT lf;
+			if (GetObject(hfont, sizeof(LOGFONT), &lf) != 0)
+			{
+				// size
+				if (::GetWindowLong(hwnd, GWL_STYLE) & SES_LARGE)
+					lf.lfHeight=(long)(lf.lfHeight*1.25);
+
+				// create a font
+				if (::GetWindowLong(hwnd, GWL_STYLE) & SES_BOLD)
+					lf.lfWeight=FW_BOLD;
+				pSettings->hFontNormal=CreateFontIndirect(&lf);
+				lf.lfUnderline=TRUE;
+				pSettings->hFontUnderline=CreateFontIndirect(&lf);
+			}
+			else
+			{
+				pSettings->hFontNormal=NULL;
+				pSettings->hFontUnderline=NULL;
+			}
+
+			break;
+		}
+	case WM_SETTEXT:
+		{
+			// delete the old font
+			delete [] pSettings->pszText;
+			delete [] pSettings->pszLink;
+
+			// style
+			LONG lStyle=::GetWindowLong(hwnd, GWL_STYLE);
+
+			LPCTSTR psz=(LPCTSTR)lParam;
+			const TCHAR* pSep=_tcsrchr(psz, _T('|'));
+
+			if (!(lStyle & SES_LINK) || pSep == NULL || pSep-psz < 0)
+			{
+				pSettings->pszText=new TCHAR[_tcslen(psz)+1];
+				_tcscpy(pSettings->pszText, psz);
+				pSettings->pszLink=NULL;
+			}
+			else
+			{
+				pSettings->pszText=new TCHAR[pSep-psz+1];
+				_tcsncpy(pSettings->pszText, psz, pSep-psz);
+				pSettings->pszText[pSep-psz]=_T('\0');
+				pSep++;
+				pSettings->pszLink=new TCHAR[_tcslen(pSep)+1];
+				_tcscpy(pSettings->pszLink, pSep);
+			}
+
+			::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
+			break;
+		}
+	case WM_ERASEBKGND:
+		{
+			return (LRESULT)FALSE;
+			break;
+		}
+	case WM_PAINT:
+		{
+			// draw anything
+			PAINTSTRUCT ps;
+			HDC hDC=BeginPaint(hwnd, &ps);
+
+			// flicker-free drawing
+			HDC hdc=::CreateCompatibleDC(hDC);
+			HBITMAP hBmp=::CreateCompatibleBitmap(hDC, ps.rcPaint.right-ps.rcPaint.left+1, ps.rcPaint.bottom-ps.rcPaint.top+1);
+			HBITMAP hOldBitmap=(HBITMAP)::SelectObject(hdc, hBmp);
+			::SetWindowOrgEx(hdc, ps.rcPaint.left, ps.rcPaint.top, NULL);
+
+			// paint the background
+			::FillRect(hdc, &ps.rcPaint, (HBRUSH)::SendMessage((HWND)::GetWindowLong(hwnd, GWLP_HWNDPARENT), WM_CTLCOLORSTATIC, (WPARAM)hdc, (LPARAM)hwnd));
+
+			// size of the all control
+			RECT rcCtl;
+			::GetClientRect(hwnd, &rcCtl);
+
+			// draw text
+			DWORD dwFlags=DT_LEFT | DT_VCENTER | (::GetWindowLong(hwnd, GWL_STYLE) & SES_PATHELLIPSIS ? DT_PATH_ELLIPSIS : 0)
+				| (::GetWindowLong(hwnd, GWL_STYLE) & SES_ELLIPSIS ? DT_END_ELLIPSIS : 0)
+				| (::GetWindowLong(hwnd, GWL_STYLE) & SES_WORDBREAK ? DT_WORDBREAK : 0);
+
+			pSettings->rcText=rcCtl;
+			if (::GetWindowLong(hwnd, GWL_STYLE) & SES_LINK)
+			{
+				HFONT hOld=(HFONT)::SelectObject(hdc, pSettings->hFontUnderline);
+				::SetBkMode(hdc, TRANSPARENT);
+
+				COLORREF crColor=(pSettings->bActive ? (RGB(255, 0, 0)) : (RGB(0, 0, 255)));
+				::SetTextColor(hdc, crColor);
+
+				if (pSettings->pszText)
+				{
+					DrawText(hdc, pSettings->pszText, -1, &pSettings->rcText, dwFlags | DT_CALCRECT);
+					DrawText(hdc, pSettings->pszText, -1, &rcCtl, dwFlags);
+				}
+				else
+				{
+					pSettings->rcText.left=0;
+					pSettings->rcText.right=0;
+					pSettings->rcText.top=0;
+					pSettings->rcText.bottom=0;
+				}
+
+				::SelectObject(hdc, hOld);
+			}
+			else
+			{
+				// aesthetics
+				rcCtl.left+=3;
+				rcCtl.right-=3;
+
+				// draw
+				HFONT hOld=(HFONT)::SelectObject(hdc, pSettings->hFontNormal);
+				::SetBkMode(hdc, TRANSPARENT);
+				::SetTextColor(hdc, ::GetSysColor(COLOR_BTNTEXT));
+
+				if (pSettings->pszText)
+				{
+					DWORD dwMod=(::GetWindowLong(hwnd, GWL_STYLE) & SES_RALIGN) ? DT_RIGHT : 0;
+					DrawText(hdc, pSettings->pszText, -1, &pSettings->rcText, dwFlags | DT_CALCRECT | dwMod);
+					DrawText(hdc, pSettings->pszText, -1, &rcCtl, dwFlags | dwMod);
+				}
+				else
+				{
+					pSettings->rcText.left=0;
+					pSettings->rcText.right=0;
+					pSettings->rcText.top=0;
+					pSettings->rcText.bottom=0;
+				}
+
+				::SelectObject(hdc, hOld);
+			}
+
+			// free the compatible dc
+			::BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right-ps.rcPaint.left+1, ps.rcPaint.bottom-ps.rcPaint.top+1, 
+				hdc, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
+			::SelectObject(hdc, hOldBitmap);
+			::DeleteObject(hBmp);
+			::DeleteDC(hdc);
+
+			EndPaint(hwnd, &ps);
+
+			break;
+		}
+	case WM_MOUSEMOVE:
+		{
+			if (::GetWindowLong(hwnd, GWL_STYLE) & SES_LINK)
+			{
+				POINT pt = { LOWORD(lParam), HIWORD(lParam) };
+				
+				if (pSettings->bActive)
+				{
+					if (!::PtInRect(&pSettings->rcText, pt))
+					{
+						pSettings->bActive=false;
+						::ReleaseCapture();
+						::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
+						
+						::SetCursor(pSettings->hNormal);
+					}
+				}
+				else
+				{
+					if (::PtInRect(&pSettings->rcText, pt))
+					{
+						pSettings->bActive=true;
+						::RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
+						::SetCapture(hwnd);
+						::SetCursor(pSettings->hLink);
+					}
+				}
+			}
+			break;
+		}
+	case WM_LBUTTONDOWN:
+		{
+			pSettings->bDown=true;
+			break;
+		}
+	case WM_LBUTTONUP:
+		{
+			POINT pt={ LOWORD(lParam), HIWORD(lParam) };
+			if (pSettings->bDown && ::GetWindowLong(hwnd, GWL_STYLE) & SES_LINK && ::PtInRect(&pSettings->rcText, pt))
+			{
+				if (::GetWindowLong(hwnd, GWL_STYLE) & SES_NOTIFY)
+				{
+					::SendMessage((HWND)::GetWindowLong(hwnd, GWLP_HWNDPARENT), WM_COMMAND, (WPARAM)(SEN_CLICKED << 16 | ::GetWindowLong(hwnd, GWL_ID)), (LPARAM)hwnd);
+				}
+				else
+				{
+					
+					TRACE("Executing %s...\n", pSettings->pszLink);
+					ShellExecute(NULL, _T("open"), pSettings->pszLink, NULL, NULL, SW_SHOWNORMAL);
+				}
+			}
+			pSettings->bDown=false;
+
+			break;
+		}
+	case WM_CANCELMODE:
+		{
+			pSettings->bActive=false;
+			pSettings->bDown=false;
+			break;
+		}
+	case SEM_GETLINK:
+		{
+			// wParam - count
+			// lParam - addr of a buffer
+			if (pSettings->pszLink)
+				_tcsncpy((PTSTR)lParam, pSettings->pszLink, (int)wParam);
+			else
+				_tcscpy((PTSTR)lParam, _T(""));
+
+			return (LRESULT)TRUE;
+			break;
+		}
+	}
+
+	return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+bool RegisterStaticExControl(HINSTANCE hInstance)
+{
+    WNDCLASS wndcls;
+
+    if (!(::GetClassInfo(hInstance, STATICEX_CLASS, &wndcls)))
+    {
+        // need to register a new class
+        wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
+		wndcls.lpfnWndProc = ::StaticExWndProc;
+        wndcls.cbClsExtra = 0;
+		wndcls.cbWndExtra = sizeof(STATICEXSETTINGS*);
+        wndcls.hInstance = hInstance;
+        wndcls.hIcon = NULL;
+		wndcls.hCursor = NULL;				// will load each time needed
+        wndcls.hbrBackground = NULL;
+        wndcls.lpszMenuName = NULL;
+        wndcls.lpszClassName = STATICEX_CLASS;
+
+        if (!RegisterClass(&wndcls))
+            return false;
+    }
+
+    return true;
+}