From 00926155b9ce6c0c67214a03f1c5ee2f4427a5b9 Mon Sep 17 00:00:00 2001 From: ramon18 Date: Mon, 7 Jul 2003 21:08:26 +0000 Subject: [PATCH] Fixed LINK control problem on Win9X and improved tabstop handling git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2703 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/InstallOptions/InstallerOptions.cpp | 157 ++++++++++---------- Contrib/InstallOptions/testlink.ini | 10 +- Plugins/InstallOptions.dll | Bin 13312 -> 13824 bytes 3 files changed, 84 insertions(+), 83 deletions(-) diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index 8d7ebb67..9a150eb5 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -63,8 +63,13 @@ char *STRDUP(const char *c) #define FIELD_GROUPBOX (12) #define FIELD_LINK (13) +//--------------------------------------------------------------------- // settings // crashes on windows 98 - #define IO_ENABLE_LINK +#define IO_ENABLE_LINK + +//#define IO_LINK_UNDERLINED // Uncomment to show links text underlined +//--------------------------------------------------------------------- // general flags #define FLAG_RIGHT 0x00000001 @@ -671,10 +676,9 @@ LRESULT WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) { case BN_CLICKED: { for (int nIdx = 0; nIdx < nNumFields; nIdx++) { - if (pFields[nIdx].nType == FIELD_BROWSEBUTTON) { - if (id == pFields[nIdx].nControlID) { + if (id == pFields[nIdx].nControlID) { + if (pFields[nIdx].nType == FIELD_BROWSEBUTTON) { int nParentIdx = pFields[nIdx].nParentIdx; - switch(pFields[nParentIdx].nType) { case FIELD_FILEREQUEST: BrowseForFile(nParentIdx); @@ -684,6 +688,8 @@ LRESULT WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) { break; } break; + } else if (pFields[nIdx].nType == FIELD_LINK) { + ShellExecute(hMainWindow, NULL, pFields[nIdx].pszState, NULL, NULL, SW_SHOWDEFAULT); } } } @@ -728,6 +734,58 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, switch (uMsg) { HANDLE_MSG(hwndDlg, WM_COMMAND, WMCommandProc); + case WM_DRAWITEM: + { + DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; + for (int nIdx = 0; nIdx < nNumFields; nIdx++) + { + if (pFields[nIdx].nControlID == lpdis->CtlID ) + { +#ifdef IO_LINK_UNDERLINED + HFONT OldFont; + LOGFONT lf; +#endif + if ( ( lpdis->itemState & ODS_FOCUS && lpdis->itemAction & ODA_DRAWENTIRE) || (lpdis->itemAction & ODA_FOCUS) || + (lpdis->itemAction & ODA_SELECT)) + DrawFocusRect(lpdis->hDC, &pFields[nIdx].rect); + +#ifdef IO_LINK_UNDERLINED + GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf); + lf.lfUnderline = TRUE; + OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf)); +#endif + // Set up tranparent background + SetBkMode(lpdis->hDC, TRANSPARENT); + + if ( GetSysColorBrush(COLOR_HOTLIGHT) ) + SetTextColor(lpdis->hDC, GetSysColor(COLOR_HOTLIGHT)); + else + SetTextColor(lpdis->hDC, RGB(0,0,255)); // Win95/NT4 arrggg!!! + + GetClientRect(lpdis->hwndItem, &pFields[nIdx].rect); + // Calculate needed size of the control + DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &pFields[nIdx].rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); + pFields[nIdx].rect.right += 4; + pFields[nIdx].rect.bottom = lpdis->rcItem.bottom; + // Resize but don't move + SetWindowPos(lpdis->hwndItem, NULL, 0, 0, pFields[nIdx].rect.right - pFields[nIdx].rect.left, + pFields[nIdx].rect.bottom - pFields[nIdx].rect.top, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + // Draw the text + lpdis->rcItem = pFields[nIdx].rect; + // Add little margin to avoid focus rect over text + lpdis->rcItem.right += 2; lpdis->rcItem.left += 2; + + if ( lpdis->itemState & ODS_HOTLIGHT ) + OutputDebugString("Hot"); + + DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); +#ifdef IO_LINK_UNDERLINED + DeleteObject(SelectObject(lpdis->hDC, OldFont)); +#endif + } + } + break; + } case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: case WM_CTLCOLORDLG: @@ -747,90 +805,33 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, #ifdef IO_ENABLE_LINK // pFields[nIdx].nParentIdx is used to store original windowproc -int StaticLINKWindowProc(HWND hWin, UINT uMsg, LPARAM wParam, WPARAM lParam) +int WINAPI StaticLINKWindowProc(HWND hWin, UINT uMsg, LPARAM wParam, WPARAM lParam) { - int StaticField = -1; - for (int nIdx = 0; nIdx < nNumFields; nIdx++) { - if (pFields[nIdx].nType == FIELD_LINK && hWin == pFields[nIdx].hwnd ) { - StaticField = nIdx; - break; - } - } - - if ( StaticField >= 0 ) + for (int StaticField = 0; StaticField < nNumFields; StaticField++) { - switch(uMsg) + if (pFields[StaticField].nType == FIELD_LINK && hWin == pFields[StaticField].hwnd ) { - case WM_PAINT: + switch(uMsg) { - PAINTSTRUCT ps; - HFONT hOldFont; - HDC pDC = BeginPaint(hWin, &ps); - HFONT hFont = (HFONT)SendMessage(hMainWindow, WM_GETFONT, 0, 0); - int OldMode = SetBkMode(pDC, TRANSPARENT); - int OldTextColor; - - if ( GetSysColorBrush(COLOR_HOTLIGHT) ) - OldTextColor = SetTextColor(pDC, GetSysColor(COLOR_HOTLIGHT)); - else - OldTextColor = SetTextColor(pDC, RGB(0,0,255)); // Win95/NT4 arrggg!!! - - hOldFont = (HFONT)SelectObject(pDC, hFont); - GetClientRect(hWin, &pFields[StaticField].rect); - - DrawText( pDC, pFields[StaticField].pszText, -1, &pFields[StaticField].rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); - - DrawText( pDC, pFields[StaticField].pszText, -1, &pFields[StaticField].rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); - - SetTextColor(pDC, OldTextColor); - SetBkMode(pDC, OldMode); - SelectObject(pDC, hOldFont); - EndPaint(hWin, &ps); - return 0; - } - case WM_NCHITTEST: - { - POINT pt; - pt.x = GET_X_LPARAM(lParam); - pt.y = GET_Y_LPARAM(lParam); - ScreenToClient(hWin, &pt); - - if ( PtInRect(&pFields[StaticField].rect, pt) ) + case WM_ERASEBKGND: + return 0; + case WM_SETCURSOR: { - return HTCLIENT; - } - break; - } - case WM_SETCURSOR: - { - if ( (HWND)wParam == hWin && LOWORD(lParam) == HTCLIENT ) - { - HCURSOR hCur = LoadCursor(NULL, IDC_HAND); - if ( hCur ) + if ( (HWND)wParam == hWin && LOWORD(lParam) == HTCLIENT ) { - SetCursor(hCur); - return 1; // halt further processing + HCURSOR hCur = LoadCursor(NULL, IDC_HAND); + if ( hCur ) + { + SetCursor(hCur); + return 1; // halt further processing + } } } - break; - } - case WM_LBUTTONUP: - { - POINT pt; - pt.x = GET_X_LPARAM(lParam); - pt.y = GET_Y_LPARAM(lParam); - - if ( PtInRect(&pFields[StaticField].rect, pt) ) - { - ShellExecute(hMainWindow, NULL, pFields[StaticField].pszState, NULL, NULL, SW_SHOWDEFAULT); - } - return 0; } + return CallWindowProc((WNDPROC)pFields[StaticField].nParentIdx, hWin, uMsg, wParam, lParam); } - return CallWindowProc((WNDPROC)pFields[StaticField].nParentIdx, hWin, uMsg, wParam, lParam);; } - else - return 0; + return 0; } #endif @@ -973,8 +974,8 @@ int createCfgDlg() { "BUTTON", // FIELD_GROUPBOX DEFAULT_STYLES | BS_GROUPBOX, WS_EX_TRANSPARENT }, - { "STATIC", // FIELD_LINK - DEFAULT_STYLES | WS_TABSTOP + { "BUTTON", // FIELD_LINK + DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW }, }; diff --git a/Contrib/InstallOptions/testlink.ini b/Contrib/InstallOptions/testlink.ini index 78dc1c03..9619815d 100644 --- a/Contrib/InstallOptions/testlink.ini +++ b/Contrib/InstallOptions/testlink.ini @@ -14,15 +14,15 @@ Type=Link Left=20 Right=-40 Top=40 -Bottom=48 +Bottom=50 Text=* Run notepad [Field 3] Type=Link Left=20 Right=-40 -Top=50 -Bottom=58 +Top=55 +Bottom=65 State=mailto:someone@anywhere.com Text=* Send E-mail @@ -30,7 +30,7 @@ Text=* Send E-mail Type=Link Left=20 Right=-40 -Top=60 -Bottom=68 +Top=70 +Bottom=80 State=http://nsis.sourceforge.net/ Text=* Homepage http://nsis.sourceforge.net/ diff --git a/Plugins/InstallOptions.dll b/Plugins/InstallOptions.dll index 822e0a2ce3d9d2a2faee0a53a608a1e20548ab1c..c5c2c863cc62e739409757f07a6ce57d76c1e28c 100644 GIT binary patch delta 6746 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

hx3R4+VJp6|&IHl#z%@Vhmf3LDs9se#I+JXPP zvYeke>$8%&@RAj#MGH4KHxuHfHZ(#pj>B_r(#zDjvT&rSxp_%@)20~Hw3uI}pW(*8 zl`{Wk{|U;3Vgf!yL}~}$1=<6;JP&*37D65dJrDj6=oK6Pw7&Jx*^I2mN&U()xy?~v~m-+=G9@3+3wzK?x>@O|pL;zJ@T z2-$_C$P6k&v7y}X1B1ojH24im4J!<*40juv4Q+-l!;cJm3{M#j8h&ed$MBKig5i?k zOT%9cdB$?1-sm&lW(*qF8rzNWUL$XO&iH~cWjty8$oNO&H%7&x-!J;Zq79}tQ^LfX zerkHg^n&S#X~;BeDlktoA29#Ye9nBqe4nM$^01}Ha>{br^1kJQ<aUxNVp1aobb2KHKxQU)o-_y=EJ<{m%BG?N7FAwgUS!d#Qbn-E4Q;Z?)IjZ?~_q zZ?rer@3FVq+wF0CxBXH3&+O0I58D6T{+j)`{gnN*{X_c&`)BrV>~e?NQR2`$T#jXq z)s8KWn1gjZ;n?SJ|EuFA$AIIc<9Ci>$L}4Zj;juZv(P!+Inx<%E_H^Tjm{=#v-5su dkMmLIQ_lU)7o7dh-#FiQoL#{ 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 Z=sfI1HFyTkfS7AmIUe*vS7+vWfO