2011-10-16 66 views
7

我想向我的Win32應用程序(使用C++開發)添加一個關於對話框。我怎樣才能添加一個超鏈接到對話框?我從資源文件(.rc)加載對話框。是否可以從.rc文件中定義此功能?C++ win32將超鏈接添加到對話框

我的rc文件現在看起來是這樣的:

IDD_ABOUTBOX DIALOGEX 0, 0, 218, 118 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER 
CAPTION "About My App" 
FONT 8, "MS Shell Dlg" 
BEGIN 
    ICON   IDI_APP_ICON,IDC_STATIC,13,88,15,15 
    LTEXT   "MY url http://www.myurl.com",IDC_STATIC,15,6,194,24,SS_NOPREFIX 
    DEFPUSHBUTTON "OK",IDOK,95,98,50,14,WS_GROUP 
END  

回答

10

您可以在Windows XP或以上使用SysLink Control

您可以從rc文件是這樣定義它:

在RESOURCE.RC:

CONTROL   "<a>Link</a>",IDC_SYSLINK1,"SysLink",WS_TABSTOP,7,7,53,12 

resource.h中:

#define IDC_SYSLINK1     1001 
+0

SYSLINK和MFCLink既控制使整個對話框窗口變成空白的任何其他控件,就像它使所有的控件不可見一樣..不知道爲什麼.. – SSpoke

+0

@SSpoke:只要好奇,如果空白的對話框是用[CreateDialogIndirect](http s://msdn.microsoft.com/en-us/library/windows/desktop/ms645436(v = vs.85).aspx)function –

+0

@LaurieStearn No我用過'tab1_hwnd = CreateDialog(hDLLModule,MAKEINTRESOURCE(IDD_TAB_1), hDlg,DialogPage);'它默認隱藏我可以通過'ShowWindow' ShowWindow(tab1_hwnd,(Current_Visible_Selected_Tab == 0)? SW_SHOW:SW_HIDE);'找到一個很好的解決方案,如果任何人需要我可以發佈它..它需要子類化,但它仍然相當小和便攜。當你把鼠標放在標籤上時,只要改變顏色,並且如果你點擊它,ShellExecute(NULL,「open」,「http://blah.com」,NULL,NULL,SW_SHOWNORMAL);' – SSpoke

2

做高亮最好的方法沒有任何外部庫,仍然看起來和感覺與任何控制都會做同樣的事情,甚至使鼠標光標變成指狀圖標。

/* Start of HyperLink URL */ 
#define PROP_ORIGINAL_FONT  TEXT("_Hyperlink_Original_Font_") 
#define PROP_ORIGINAL_PROC  TEXT("_Hyperlink_Original_Proc_") 
#define PROP_STATIC_HYPERLINK TEXT("_Hyperlink_From_Static_") 
#define PROP_UNDERLINE_FONT  TEXT("_Hyperlink_Underline_Font_") 
LRESULT CALLBACK _HyperlinkParentProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 
LRESULT CALLBACK _HyperlinkProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 
static void CreateHyperLink(HWND hwndControl); 
/* End of HyperLink URL */ 



static void CreateHyperLink(HWND hwndControl) 
{ 
    // Subclass the parent so we can color the controls as we desire. 
    HWND hwndParent = GetParent(hwndControl); 
    if (NULL != hwndParent) 
    { 
     WNDPROC pfnOrigProc = (WNDPROC)GetWindowLong(hwndParent, GWL_WNDPROC); 
     if (pfnOrigProc != _HyperlinkParentProc) 
     { 
      SetProp(hwndParent, PROP_ORIGINAL_PROC, (HANDLE)pfnOrigProc); 
      SetWindowLong(hwndParent, GWL_WNDPROC, (LONG)(WNDPROC)_HyperlinkParentProc); 
     } 
    } 

    // Make sure the control will send notifications. 
    DWORD dwStyle = GetWindowLong(hwndControl, GWL_STYLE); 
    SetWindowLong(hwndControl, GWL_STYLE, dwStyle | SS_NOTIFY); 

    // Subclass the existing control. 
    WNDPROC pfnOrigProc = (WNDPROC)GetWindowLong(hwndControl, GWL_WNDPROC); 
    SetProp(hwndControl, PROP_ORIGINAL_PROC, (HANDLE)pfnOrigProc); 
    SetWindowLong(hwndControl, GWL_WNDPROC, (LONG)(WNDPROC)_HyperlinkProc); 

    // Create an updated font by adding an underline. 
    HFONT hOrigFont = (HFONT)SendMessage(hwndControl, WM_GETFONT, 0, 0); 
    SetProp(hwndControl, PROP_ORIGINAL_FONT, (HANDLE)hOrigFont); 

    LOGFONT lf; 
    GetObject(hOrigFont, sizeof(lf), &lf); 
    lf.lfUnderline = TRUE; 

    HFONT hFont = CreateFontIndirect(&lf); 
    SetProp(hwndControl, PROP_UNDERLINE_FONT, (HANDLE)hFont); 

    // Set a flag on the control so we know what color it should be. 
    SetProp(hwndControl, PROP_STATIC_HYPERLINK, (HANDLE)1); 
} 

LRESULT CALLBACK _HyperlinkParentProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    WNDPROC pfnOrigProc = (WNDPROC)GetProp(hwnd, PROP_ORIGINAL_PROC); 

    switch (message) 
    { 
    case WM_CTLCOLORSTATIC: 
    { 
     HDC hdc = (HDC)wParam; 
     HWND hwndCtl = (HWND)lParam; 

     BOOL fHyperlink = (NULL != GetProp(hwndCtl, PROP_STATIC_HYPERLINK)); 
     if (fHyperlink) 
     { 
      LRESULT lr = CallWindowProc(pfnOrigProc, hwnd, message, wParam, lParam); 
      SetTextColor(hdc, RGB(0, 0, 192)); 
      return lr; 
     } 

     break; 
    } 
    case WM_DESTROY: 
    { 
     SetWindowLong(hwnd, GWL_WNDPROC, (LONG)pfnOrigProc); 
     RemoveProp(hwnd, PROP_ORIGINAL_PROC); 
     break; 
    } 
    } 
    return CallWindowProc(pfnOrigProc, hwnd, message, wParam, lParam); 
} 

LRESULT CALLBACK _HyperlinkProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    WNDPROC pfnOrigProc = (WNDPROC)GetProp(hwnd, PROP_ORIGINAL_PROC); 

    switch (message) 
    { 
    case WM_DESTROY: 
    { 
     SetWindowLong(hwnd, GWL_WNDPROC, (LONG)pfnOrigProc); 
     RemoveProp(hwnd, PROP_ORIGINAL_PROC); 

     HFONT hOrigFont = (HFONT)GetProp(hwnd, PROP_ORIGINAL_FONT); 
     SendMessage(hwnd, WM_SETFONT, (WPARAM)hOrigFont, 0); 
     RemoveProp(hwnd, PROP_ORIGINAL_FONT); 

     HFONT hFont = (HFONT)GetProp(hwnd, PROP_UNDERLINE_FONT); 
     DeleteObject(hFont); 
     RemoveProp(hwnd, PROP_UNDERLINE_FONT); 

     RemoveProp(hwnd, PROP_STATIC_HYPERLINK); 

     break; 
    } 
    case WM_MOUSEMOVE: 
    { 
     if (GetCapture() != hwnd) 
     { 
      HFONT hFont = (HFONT)GetProp(hwnd, PROP_UNDERLINE_FONT); 
      SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, FALSE); 
      InvalidateRect(hwnd, NULL, FALSE); 
      SetCapture(hwnd); 
     } 
     else 
     { 
      RECT rect; 
      GetWindowRect(hwnd, &rect); 

      POINT pt = { LOWORD(lParam), HIWORD(lParam) }; 
      ClientToScreen(hwnd, &pt); 

      if (!PtInRect(&rect, pt)) 
      { 
       HFONT hFont = (HFONT)GetProp(hwnd, PROP_ORIGINAL_FONT); 
       SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, FALSE); 
       InvalidateRect(hwnd, NULL, FALSE); 
       ReleaseCapture(); 
      } 
     } 
     break; 
    } 
    case WM_SETCURSOR: 
    { 
     // Since IDC_HAND is not available on all operating systems, 
     // we will load the arrow cursor if IDC_HAND is not present. 
     HCURSOR hCursor = LoadCursor(NULL, IDC_HAND); 
     if (NULL == hCursor) 
      hCursor = LoadCursor(NULL, IDC_ARROW); 
     SetCursor(hCursor); 
     return TRUE; 
    } 
    } 

    return CallWindowProc(pfnOrigProc, hwnd, message, wParam, lParam); 
} 

這裏是如何使用它:

CreateHyperLink(GetDlgItem(Dialog_HWND_GOES_HERE, STATIC_TEXT_IDENIFIER_GOES_HERE)); 

凡靜態標籤能獲得點擊主對話框子做這樣的事情..

 if (HIWORD(wParam) == BN_CLICKED) { //Buttons, checkboxs, labels, static labels clicked 
      switch (LOWORD(wParam)) 
      { 
       case STATIC_TEXT_IDENIFIER_GOES_HERE: 
        ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWNORMAL); 
        break; 
      } 
     } 
+0

美麗! (winhlp32.exe在這裏)。還有一個很好的解釋[這裏](http://www.codeguru.com/cpp/controls/staticctrl/article.php/c5803/Transforming-Static-Text-Controls-into-Active-Hyperlinks-Using-the-Win32- API.htm)以及[this](http://www.codeproject.com/Articles/34/Hyperlink-control)中的錯誤代碼加強了它。 –