LRESULT CALLBACK WndProcAbout(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { const TCHAR * url; POINT pt; switch (message) { case WM_CREATE: assert(!gHwndAbout); break; case WM_ERASEBKGND: // do nothing, helps to avoid flicker return TRUE; case WM_PAINT: OnPaintAbout(hwnd); break; case WM_SETCURSOR: if (GetCursorPos(&pt) && ScreenToClient(hwnd, &pt)) { if (AboutGetLink(NULL, pt.x, pt.y)) { SetCursor(gCursorHand); return TRUE; } } return DefWindowProc(hwnd, message, wParam, lParam); case WM_LBUTTONDOWN: url = AboutGetLink(NULL, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); SetWindowLong(hwnd, GWL_USERDATA, (LONG)url); break; case WM_LBUTTONUP: url = AboutGetLink(NULL, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (url && url == (const TCHAR *)GetWindowLong(hwnd, GWL_USERDATA)) LaunchBrowser(url); SetWindowLong(hwnd, GWL_USERDATA, 0); break; case WM_CHAR: if (VK_ESCAPE == wParam) DestroyWindow(hwnd); break; case WM_DESTROY: assert(gHwndAbout); gHwndAbout = NULL; break; /* TODO: handle mouse move/down/up so that links work */ default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
LRESULT CALLBACK WndProcAbout(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { const WCHAR * url; POINT pt; switch (message) { case WM_CREATE: assert(!gHwndAbout); break; case WM_ERASEBKGND: // do nothing, helps to avoid flicker return TRUE; case WM_PAINT: OnPaintAbout(hwnd); break; case WM_SETCURSOR: if (GetCursorPosInHwnd(hwnd, pt)) { StaticLinkInfo linkInfo; if (GetStaticLink(gLinkInfo, pt.x, pt.y, &linkInfo)) { CreateInfotipForLink(linkInfo); SetCursor(gCursorHand); return TRUE; } } ClearInfotip(); return DefWindowProc(hwnd, message, wParam, lParam); case WM_LBUTTONDOWN: gClickedURL = GetStaticLink(gLinkInfo, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); break; case WM_LBUTTONUP: url = GetStaticLink(gLinkInfo, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (url && url == gClickedURL) LaunchBrowser(url); break; case WM_CHAR: if (VK_ESCAPE == wParam) DestroyWindow(hwnd); break; case WM_DESTROY: ClearInfotip(); assert(gHwndAbout); gHwndAbout = NULL; break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
const TCHAR *AboutGetLink(WindowInfo *win, int x, int y, AboutLayoutInfoEl **el) { if (gRestrictedUse) return NULL; // Update the link location information if (win) UpdateAboutLayoutInfo(win->hwndCanvas, win->hdcToDraw, NULL); else OnPaintAbout(gHwndAbout); for (int i = 0; gAboutLayoutInfo[i].leftTxt; i++) { if ((x < gAboutLayoutInfo[i].rightTxtPosX) || (x > gAboutLayoutInfo[i].rightTxtPosX + gAboutLayoutInfo[i].rightTxtDx)) continue; if ((y < gAboutLayoutInfo[i].rightTxtPosY) || (y > gAboutLayoutInfo[i].rightTxtPosY + gAboutLayoutInfo[i].rightTxtDy)) continue; if (el) *el = &gAboutLayoutInfo[i]; return gAboutLayoutInfo[i].url; } return NULL; }