2011-10-16 11 views
7

मैं अपने Win32 एप्लिकेशन (सी ++ का उपयोग करके विकसित) में एक संवाद को जोड़ना चाहता हूं। मैं संवाद में हाइपरलिंक कैसे जोड़ सकता हूं? मैं संसाधन फ़ाइल (.rc) से संवाद लोड कर रहा हूं। क्या यह कार्यक्षमता .rc फ़ाइल से परिभाषित करना संभव है?सी ++ win32 एक संवाद के लिए एक हाइपरलिंक जोड़ें

मेरे आर सी फ़ाइल अब इस तरह दिखता है:

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 उपयोग कर सकते हैं।

आप इस तरह आर सी फ़ाइल से इसे परिभाषित कर सकते हैं:

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 के साथ रिक्त संवाद बनाए गए थे) एस: //msdn.microsoft.com/en-us/library/windows/desktop/ms645436 (v = vs.85) .aspx) फ़ंक्शन –

+0

@LaurieStearn नहीं, मैंने 'tab1_hwnd = CreateDialog (hDLLModule, MAKEINTRESOURCE (IDD_TAB_1) का उपयोग किया था, एचडीएलजी, डायलॉग पेज); 'यह डिफ़ॉल्ट रूप से छिपा हुआ है, मैं इसे' शोविंडो '' शोविंडो '(टैब 1_एचडब्ल्यूएन, (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), और [इस] से त्रुटि कोड (http://www.codeproject.com/Articles/34/Hyperlink-control) इसे थोड़ा सा गोमांस करें। –

संबंधित मुद्दे