C++ -> Link in einem Dialog
Ein paar Hinweise zu GUI. Im Dialog befindet sich ein Static-Control IDC_LINK, die als Inhalt den kompletten Link hat, z.B. https://plastes.de. Dieser Text wird in OnCallLink ausgelesen und via DisplayWebpage dann an den Browser übergeben.
Der globale Part des Codes, der am Anfang der CPP Datei liegen sollte.
// Ist die Maus über dem Link = TRUE, sonst FALSE. static BOOL bMouseInWindow = FALSE; // Die MausOver Proc. static WNDPROC wpMouseOverProc = NULL; // Die Daten zum Mauszeiger. TRACKMOUSEEVENT MouseEvent; LRESULT CALLBACK MouseOverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { // Sorgt dafür, dass der Mauszeiger beim Verlassen der // Funktion bestehen bleibt. case WM_SETCURSOR: { // Aktion nur wenn der Link betroffen ist. if ((HWND)wParam == GetDlgItem(hWnd, IDC_LINK)) { SetCursor(LoadCursor(NULL, IDC_HAND)); SetWindowLongPtr(hWnd, DWLP_MSGRESULT, TRUE); return TRUE; } return FALSE; } // Ändert den Mauszeiger in die Hand. case WM_MOUSEMOVE: { if (!bMouseInWindow) { bMouseInWindow = true; SetCursor(LoadCursor(NULL, IDC_HAND)); MouseEvent.dwFlags = TME_LEAVE | TME_HOVER; TrackMouseEvent(&MouseEvent); } break; } // Mauszeiger ist nun wieder Standard. case WM_MOUSELEAVE: { bMouseInWindow = false; SetCursor(LoadCursor(NULL, IDC_ARROW)); MouseEvent.dwFlags = TME_HOVER; TrackMouseEvent(&MouseEvent); break; } default: return CallWindowProc(wpMouseOverProc, hWnd, uMsg, wParam, lParam); } // switch (uMsg) return true; } // MouseOverProc
Und nun die Anpassungen in der Klasse. Als Einstieg der Auszug aus der Header Datei.
class CMyDlg : CDialog { // Operations public: void DisplayWebpage(LPSTR lpLink); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyDlg) public: virtual void OnInitialUpdate(); protected: void OnCallLink(); //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CMyDlg) HBRUSH OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor); //}}AFX_MSG DECLARE_MESSAGE_MAP() } // CMyDlg
Und nun der spannendere Teil aus der CPP-Datei.
void CMyDlg::OnInitialUpdate() { CDialog::OnInitialUpdate(); HWND hWndLabel = GetDlgItem(IDC_LINK)->m_hWnd; wpMouseOverProc = (WNDPROC)SetWindowLongPtr(hWndLabel, GWLP_WNDPROC, (LONG)MouseOverProc); MouseEvent.cbSize = sizeof(TRACKMOUSEEVENT); MouseEvent.dwFlags = TME_HOVER | TME_LEAVE; MouseEvent.dwHoverTime = 1; MouseEvent.hwndTrack = hWndLabel; TrackMouseEvent(&MouseEvent); } // OnInitialUpdate() HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor) { switch (nCtlColor) { case CTLCOLOR_STATIC: { if (pWnd->GetDlgCtrlID() == IDC_LINK) { pDC->SetTextColor(RGB(0, 0, 255)); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)GetStockObject(NULL_BRUSH); } } } // switch (nCtlColor) } // OnCtlColor() void CMyDlg::DisplayWebpage(LPSTR lpLink) { CString anURL = _T(lpLink); // ShellExecute will start the default-browser with the given url. ShellExecute(NULL, "open", anURL, NULL, NULL, SW_SHOW); } // DisplayWebpage() void CMyDlg::OnCallLink() { char szstring[400]; GetDlgItemText(IDC_LINK, szstring, sizeof(szstring)); this->DisplayWebpage((LPSTR)szstring); } // OnCallLink()
Viel Spaß beim Einbau.
— Kai Neugebauer 2020/04/11 14:12 → 381