Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Text in CWnd markierbar machen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.06.2006, 15:00 Uhr
~GastDC
Gast


Hi Leute !

Ich hab hier ne fremde CTitleTip Klasse (die glaub ich irgendwo frei
verfügbar ist im web) und möchte den Text im Titletip Fenster
markierbar und kopierbar machen.

Aber ich hab keinen Schimmer wie man da macht, weiß jemand
von Euch wie das geht ?

Falls es hilfreich ist hab ich mal die dafür wahrscheinlich
wichtigstens Methoden angehängt. Eventuell reicht es schon
irgendwo spezielle Flags zu setzen um den Text markierbar
zu machen ? =/

Danke für jede Hilfe !
GastDC



C++:
// CTitleTip message handlers

BOOL CTitleTip::Create(CWnd * pParentWnd)
{
    ASSERT_VALID(pParentWnd);

    DWORD dwStyle = WS_BORDER | WS_POPUP;
    DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
    m_pParentWnd = pParentWnd;

    return CreateEx(dwExStyle, TITLETIP_CLASSNAME, "WLAN Titletip", dwStyle,
                    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                    NULL, NULL, NULL );
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.06.2006, 15:01 Uhr
~GastDC
Gast



C++:
// Show          - Show the titletip if needed
// rectTitle     - The rectangle within which the original
//                    title is constrained - in client coordinates
// lpszTitleText - The text to be displayed
// xoffset         - Number of pixel that the text is offset from
//                   left border of the cell
void CTitleTip::Show(CRect rectTitle, LPCTSTR lpszTitleText,
                     int xoffset /*=0*/, int nMaxChars /*=-1*/,
                     LPRECT lpHoverRect /*=NULL*/,
                     LPLOGFONT lpLogFont /*=NULL*/)
{
    ASSERT( ::IsWindow( GetSafeHwnd() ) );

    if (rectTitle.IsRectEmpty())
        return;

    // If titletip is already displayed, don't do anything.
    if( IsWindowVisible() )
        return;

    m_rectHover = (lpHoverRect != NULL)? lpHoverRect : rectTitle;
    m_rectHover.right++; m_rectHover.bottom++;

    m_pParentWnd->ClientToScreen( m_rectHover );
    ScreenToClient( m_rectHover );


    // Do not display the titletip is app does not have focus
     if( GetFocus() == NULL )    return;

    // Define the rectangle outside which the titletip will be hidden.
    // We add a buffer of one pixel around the rectangle
    m_rectTitle.top    = -1;
    m_rectTitle.left   = -xoffset-1;
    m_rectTitle.right  = rectTitle.Width()-xoffset;
    m_rectTitle.bottom = rectTitle.Height()+1;

    // Determine the width of the text
    m_pParentWnd->ClientToScreen( rectTitle );

    CClientDC dc(this);
    m_strTitle = _T("");
    // m_strTitle += _T(" ");
    m_strTitle += lpszTitleText;
    m_strTitle += _T(" ");

    CFont font, *pOldFont = NULL;
    if (lpLogFont)
    {
        font.CreateFontIndirect(lpLogFont);
        pOldFont = dc.SelectObject( &font );
    }
    else
    {
        // use same font as ctrl
        pOldFont = dc.SelectObject( m_pParentWnd->GetFont() );
    }

    CSize size = dc.GetTextExtent( m_strTitle );

    TEXTMETRIC tm;
    dc.GetTextMetrics(&tm);
    size.cx += tm.tmOverhang;

    dc.SelectObject( pOldFont );

    m_rectDisplay = rectTitle;
    m_rectDisplay.left += xoffset-1;
    m_rectDisplay.top  += 2;
    m_rectDisplay.right = m_rectDisplay.left + size.cx + xoffset;
    m_rectDisplay.bottom = m_rectDisplay.top + size.cy;
    
    // Do not display if the text fits within available space
    //if ( m_rectDisplay.right <= rectTitle.right-xoffset )
   //     return;

    // We will use avg char width to set max tooltip width
    int nMaxTooltipWidth = -1;
    if (nMaxChars > 0)
    {
        int nMaxTooltipWidth = (tm.tmAveCharWidth * nMaxChars);
        if (nMaxTooltipWidth < 0)
            nMaxTooltipWidth *= -1;

        // Rect display to be set to max chars
        if (m_rectDisplay.Width() > nMaxTooltipWidth)
            m_rectDisplay.right = m_rectDisplay.left + nMaxTooltipWidth;
    }

    //***************************************************************************************
    //Adjust the dimensions of the rect to fit within the client

    // Get the coordinates of the parents client area. (In this case the ListView's client
    // area) and convert coordinates to those of the tooltip.
    CRect rectClient;
    m_pParentWnd->GetClientRect( rectClient );
    m_pParentWnd->ClientToScreen( rectClient );


    // ------------------------------------------------------------------------------
    // Use the screen's right edge as the right hand border, not the right edge of the client.
    // You can comment this out to use the right client as the border.
    CWindowDC wdc(NULL);
    rectClient.right = GetDeviceCaps(wdc, HORZRES) - 8;
    rectClient.bottom = GetDeviceCaps(wdc, VERTRES) - 8;
    //---------------------------------------------------------------------------------------


    //If the right edge exceeds the right edge of the client:
    //          see how much room there is to move the display to the left and adjust the
    //          rectangle that far to the left. If the rect still exceeds the right edge, clip
    //          the right edge to match the client right edge.
    //
    // Does the right display edge exceed the right client edge?
    if (m_rectDisplay.right > rectClient.right)
    {
        // establish what is available left shift wise and what is needed
        int nAvail = 0;
        int nNeeded = m_rectDisplay.right - rectClient.right;

        if (m_rectDisplay.left > rectClient.left)
            nAvail = m_rectDisplay.left - rectClient.left;

        // is there room to move left?
        if (nAvail >= nNeeded)
        {
            m_rectDisplay.OffsetRect(-nNeeded,0);  // yes, move all that is needed
            // increase the size of the window that will be inspected to see if the
            // cursor has gone outside of the tooltip area by the number of units we
            // offset our display rect.
            m_rectTitle.right += nNeeded;
        }
        else
        {
            m_rectDisplay.OffsetRect(-nAvail,0);   // no, at least move to left edge of client
            // increase the size of the window that will be inspected to see if the
            // cursor has gone outside of the tooltip area by the number of units we
            // offset our display rect.
            m_rectTitle.right += nAvail;
        }

        // Did we move enough? If not, clip right edge to match client right edge
        if (m_rectDisplay.right > rectClient.right)
            m_rectDisplay.right = rectClient.right;
    }


    //If the left edge exceeds the left edge of the client:
    //          see how much room there is to move the display to the right and adjust the
    //          rectangle that far to the right. If the rect still exceeds the left edge, clip
    //          the left edge to match the client left edge.
    //
    // Does the left display edge exceed the left client edge?
    if (m_rectDisplay.left < rectClient.left)
    {
        // establish what is available right shift wise and what is needed
        int nAvail = 0;
        int nNeeded = rectClient.left - m_rectDisplay.left;

        if (m_rectDisplay.right < rectClient.right)
            nAvail = rectClient.right - m_rectDisplay.right;

        // is there room to move left?
        if (nAvail >= nNeeded)
        {
            m_rectDisplay.OffsetRect(+nNeeded,0);  // yes, move all that is needed
            // increase the size of the window that will be inspected to see if the
            // cursor has gone outside of the tooltip area by the number of units we
            // offset our display rect.
            m_rectTitle.left -= nNeeded;
        }
        else
        {
            m_rectDisplay.OffsetRect(+nAvail,0);   // no, at least move to left edge of client
            // increase the size of the window that will be inspected to see if the
            // cursor has gone outside of the tooltip area by the number of units we
            // offset our display rect.
            m_rectTitle.left -= nAvail;
        }

        // Did we move enough? If not, clip left edge to match client left edge
        if (m_rectDisplay.left < rectClient.left)
            m_rectDisplay.left = rectClient.left;        
    }


    // if the calculated width > maxwidth set above then truncate
    if (nMaxTooltipWidth > 0 && m_rectDisplay.Width() > nMaxTooltipWidth)
        m_rectDisplay.right = m_rectDisplay.left + nMaxTooltipWidth;

    //***************************************************************************************
    
    // Use a "work" rect to calculate the bottom. This work rect will be inset
    // slightly from the rect we have just created so the tooltip does not touch
    // the sides.
    CRect rectCalc = m_rectDisplay;

    rectCalc.top += 1;
    

    /*int nHeight = dc.DrawText(m_strTitle,&rectCalc,0
        | DT_CALCRECT
        | DT_LEFT
        | DT_NOCLIP
        | DT_EDITCONTROL
        | DT_NOPREFIX
        | DT_WORDBREAK
        );*/




    if (lpLogFont)
        pOldFont = dc.SelectObject( &font );
    else
        pOldFont = dc.SelectObject( m_pParentWnd->GetFont() );

    int nHeight = dc.DrawText(m_strTitle,&rectCalc,0
        | DT_CALCRECT
        | DT_LEFT
        | DT_NOCLIP
        | DT_EDITCONTROL
        | DT_NOPREFIX
        | DT_WORDBREAK
        );
    
    pOldFont = dc.SelectObject( pOldFont );
    
    
      
    
    // If this is a single line, shorten the display to get rid of any excess blank space
    if (nHeight == tm.tmHeight)
        rectCalc.right = rectCalc.left + size.cx + 3;

    m_rectDisplay.bottom = m_rectDisplay.top + nHeight;

    // ensure the tooltip does not exceed the bottom of the screen
    if (m_rectDisplay.bottom > rectClient.bottom)
    {
        m_rectDisplay.bottom = rectClient.bottom;
        rectCalc.bottom = rectClient.bottom;
    }

    SetWindowPos( &wndTop,
        m_rectDisplay.left-3,
        m_rectDisplay.top-1,
        m_rectDisplay.Width()+3,
        m_rectDisplay.Height(),
        SWP_SHOWWINDOW|SWP_NOACTIVATE );
    SetCapture();
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: