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