तो एमएफसी विज़ार्ड का उपयोग करके, आउटपुट फलक टैब में एक संदर्भ मेनू होता है जो इसे "कॉपी" और "क्लियर" और छुपाने के लिए बनाता है। मेरे पास स्पष्ट रूप से हल हो गया है, लेकिन जो मुझे अपना सिर नहीं मिल रहा है वह यह है कि एमएस से विजुअल स्टूडियो के बाहर दिए गए कोड का उपयोग कैसे करें क्लिपबोर्ड पर डेटा कॉपी करने के तरीके पर।

https://docs.microsoft.com/en-us/cpp/mfc/clipboard-using-the-windows-clipboard?view=msvc-160

आउटपुट फलक में दो टैब होते हैं: स्थिति/डीबग। एमएस द्वारा प्रदान किए गए कोड में केवल 1 मुद्दा है और मैं समस्या को हल नहीं कर सकता, अज्ञात पहचानकर्ता कहता रहता है (जो मुझे पता है कि इसका क्या अर्थ है, लेकिन यह सुनिश्चित नहीं है कि यह कह रहा है कि चूंकि यह आउटपुट डब्ल्यूएनडी.एच फ़ाइल में एक वस्तु है) , लेकिन उसी चर का उपयोग उसी .cpp फ़ाइल में कहीं और किया जाता है।

मेरा लक्ष्य यहां है: यदि मैं "स्थिति" या "डीबग" टैब में एक पंक्ति पर क्लिक करता हूं, तो राइट क्लिक करें, पॉपअप मेनू कॉपी/क्लियर दिखाता है ..... मैं चयनित लाइन को क्लिपबोर्ड पर कॉपी करना चाहता हूं। उदाहरण कोड का उपयोग करता है:

//strcpy_s((char*)hGlob, 64, "Current selection\r\n");

और अगर मैं इसे असम्बद्ध करता हूं, और प्रोग्राम चलाता हूं, तो यह "वर्तमान चयन" को एक नोटपैड दस्तावेज़ में चिपकाएगा .....

तो जब मैं इसे बदलता हूं:

strcpy_s((char*)hGlob, 64, m_wndOutputBuild); // <<< Keeps coming up as unknown identifier????

मैं "अज्ञात पहचानकर्ता" प्राप्त करता रहता हूं, भले ही इसका उपयोग COutputWnd कक्षा में किया जाता है। मैं "सोचता हूं" इसे डेटा के साथ COutputlist क्लास में होना है लेकिन ऑब्जेक्ट को प्रोटेक्टेड से पब्लिक में ले जाना काम नहीं करता है।

अगर मैं संपूर्ण शून्य COutputList::OnEditCopyD1() पर टिप्पणी करता हूं तो मेरा प्रोजेक्ट पूरी तरह से संकलित करता है और स्थिति/डीबग के आउटपुट पैन को चलाने के लिए m_wndOutputBuild का उपयोग करके 100% काम करता है .... यह कॉपी चीज है ... मैं अभी पता नहीं लगा सकता क्या मैं गलत हूं।

इन फ़ाइलों को मेरा विजुअल स्टूडियो 2017 एमएफसी विज़ार्ड बनाया गया था, इसलिए इस संबंध में, उन्हें ठोस होना चाहिए ... उन्होंने केवल संदेशबॉक्स पहलू प्रदान किया और मैं इसे काम करने की कोशिश कर रहा हूं ... बस किसी भी चयनित एकल पंक्ति की प्रतिलिपि बनाना टैब और फलक में फ़ोकस टैब से टेक्स्ट की प्रतिलिपि बनाना।

मुझे क्या याद आ रही है पर कोई विचार?

धन्यवाद।

यहां दो फाइलें हैं।

आउटपुटWnd.cpp

#include "StdAfx.h"
#include "pch.h"
#include "framework.h"

#include "OutputWnd.h"
#include "Resource.h"
#include "MainFrame.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COutputBar

COutputWnd::COutputWnd() noexcept
{
}

COutputWnd::~COutputWnd()
{
}

BEGIN_MESSAGE_MAP(COutputWnd, CDockablePane)
    ON_WM_CREATE()
    ON_WM_SIZE()
END_MESSAGE_MAP()

int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDockablePane::OnCreate(lpCreateStruct) == -1)
        return -1;

    CRect rectDummy;
    rectDummy.SetRectEmpty();

    // Create tabs window:
    if (!m_wndTabs.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, 1))
    {
        TRACE0("Failed to create output tab window\n");
        return -1;      // fail to create
    }

    // Create output panes:
    const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;

    if (!m_wndOutputBuild.Create(dwStyle, rectDummy, &m_wndTabs, 2) ||
        !m_wndOutputDebug.Create(dwStyle, rectDummy, &m_wndTabs, 3))
    {
        TRACE0("Failed to create output windows\n");
        return -1;      // fail to create
    }   

    UpdateFonts();

    CString strTabName;
    BOOL bNameValid;

    // Attach list windows to tab:
    bNameValid = strTabName.LoadString(IDS_STATUS_TAB);
    ASSERT(bNameValid);
    m_wndTabs.AddTab(&m_wndOutputBuild, strTabName, (UINT)0);
    bNameValid = strTabName.LoadString(IDS_DEBUG_TAB);
    ASSERT(bNameValid);
    m_wndTabs.AddTab(&m_wndOutputDebug, strTabName, (UINT)1);

    return 0;
}

void COutputWnd::OnSize(UINT nType, int cx, int cy)
{
    CDockablePane::OnSize(nType, cx, cy);

    // Tab control should cover the whole client area:
    m_wndTabs.SetWindowPos (nullptr, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}

void COutputWnd::AdjustHorzScroll(CListBox& wndListBox)
{
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
    pMainFrame->m_wndOutput.AddStringDebugTab(_T("Debug: OutputWnd--OutputWnd::AdjustHorzScroll(CListBox& wndListBox)"));
    
    CClientDC dc(this);
    CFont* pOldFont = dc.SelectObject(&afxGlobalData.fontRegular);

    int cxExtentMax = 0;

    for (int i = 0; i < wndListBox.GetCount(); i ++)
    {
        CString strItem;
        wndListBox.GetText(i, strItem);

        cxExtentMax = max(cxExtentMax, (int)dc.GetTextExtent(strItem).cx);
    }

    wndListBox.SetHorizontalExtent(cxExtentMax);
    dc.SelectObject(pOldFont);
}

void  COutputWnd::AddStringStatusTab(CString  message)
{
    m_wndOutputBuild.AddString(message);
    m_wndOutputBuild.SetCurSel(m_wndOutputBuild.GetCount() - 1);
}

void  COutputWnd::AddStringDebugTab(CString  message)
{
    m_wndOutputDebug.AddString(message);
    m_wndOutputDebug.SetCurSel(m_wndOutputDebug.GetCount() - 1);
}

void COutputWnd::UpdateFonts()
{   
    m_wndOutputBuild.SetFont(&afxGlobalData.fontRegular);
    m_wndOutputDebug.SetFont(&afxGlobalData.fontRegular);   
}

/////////////////////////////////////////////////////////////////////////////
// COutputList1

COutputList::COutputList() noexcept
{
}

COutputList::~COutputList()
{
}

BEGIN_MESSAGE_MAP(COutputList, CListBox)
    ON_WM_CONTEXTMENU()
    ON_COMMAND(ID_EDIT_COPY_D1, OnEditCopyD1)
    ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
    ON_COMMAND(ID_VIEW_OUTPUTWND, OnViewOutput)
    ON_WM_WINDOWPOSCHANGING()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COutputList message handlers

void COutputList::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
    CMenu menu;
    menu.LoadMenu(IDR_OUTPUT_POPUP);

    CMenu* pSumMenu = menu.GetSubMenu(0);

    if (AfxGetMainWnd()->IsKindOf(RUNTIME_CLASS(CMDIFrameWndEx)))
    {
        CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;

        if (!pPopupMenu->Create(this, point.x, point.y, (HMENU)pSumMenu->m_hMenu, FALSE, TRUE))
            return;

        ((CMDIFrameWndEx*)AfxGetMainWnd())->OnShowPopupMenu(pPopupMenu);
        UpdateDialogControls(this, FALSE);
    }

    SetFocus();
}

void COutputList::OnEditCopyD1()
{
    //CString source;
    //HGLOBAL clipbuffer;
    //char * buffer;
    //EmptyClipboard();
    //clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength() + 1);
    //buffer = (char*)GlobalLock(clipbuffer);
    //strcpy(buffer, LPCSTR(source));
    //GlobalUnlock(clipbuffer);
    //SetClipboardData(CF_TEXT, clipbuffer);
    //CloseClipboard();
    


    if (!OpenClipboard())
    {
        AfxMessageBox(_T("Cannot open the Clipboard"));
        return;
    }
    // Remove the current Clipboard contents
    if (!EmptyClipboard())
    {
        AfxMessageBox(_T("Cannot empty the Clipboard"));
        return;
    }
    // Get the currently selected data
    HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64);
    //strcpy_s((char*)hGlob, 64, "Current selection\r\n"); //m_strCurrentEntry
    strcpy_s((char*)hGlob, 64, m_wndOutputBuild); // <<< Keeps coming up as unknown identifier????
    // For the appropriate data formats...
    if (::SetClipboardData(CF_TEXT, hGlob) == NULL)
    {
        CString msg;
        msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError());
        AfxMessageBox(msg);
        CloseClipboard();
        GlobalFree(hGlob);
        return;
    }
    CloseClipboard();

    MessageBox(_T("TODO: Copy output")); //<< This fires normally so I know it is working!

    //CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
    //m_wndOutput.AddStringStatusTab(_T("Item Copied"));
}

void COutputList::OnEditClear()
{
    CListBox::ResetContent();
    //MessageBox(_T("Clear output"));
}

void COutputList::OnViewOutput()
{
    CDockablePane* pParentBar = DYNAMIC_DOWNCAST(CDockablePane, GetOwner());
    CMDIFrameWndEx* pMainFrame = DYNAMIC_DOWNCAST(CMDIFrameWndEx, GetTopLevelFrame());

    if (pMainFrame != nullptr && pParentBar != nullptr)
    {
        pMainFrame->SetFocus();
        pMainFrame->ShowPane(pParentBar, FALSE, FALSE, FALSE);
        pMainFrame->RecalcLayout();

    }
}

आउटपुट डब्ल्यूएनडी.एच

#pragma once

/////////////////////////////////////////////////////////////////////////////
// COutputList window

class COutputList : public CListBox
{
// Construction
public:
    COutputList() noexcept;

// Implementation
public:
    virtual ~COutputList();

protected:
    afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
    afx_msg void OnEditCopyD1();
    afx_msg void OnEditClear();
    afx_msg void OnViewOutput();

    DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// COutputWnd window

class COutputWnd : public CDockablePane
{
// Construction
public:
    COutputWnd() noexcept;

    void UpdateFonts();
    void AddStringStatusTab(CString message);
    void AddStringDebugTab(CString message);

// Attributes
protected:
    CMFCTabCtrl m_wndTabs;

    COutputList m_wndOutputBuild;
    COutputList m_wndOutputDebug;
    COutputList m_wndOutputFind;

protected:

    void AdjustHorzScroll(CListBox& wndListBox);

// Implementation
public:
    virtual ~COutputWnd();

protected:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);

    DECLARE_MESSAGE_MAP()
};
1
Kittmaster 18 मार्च 2021, 21:17

1 उत्तर

सबसे बढ़िया उत्तर

यहां उन आउटपुट विंडो का उपयोग कर प्रोजेक्ट से कुछ कोड दिया गया है। हां, मुझे "कॉपी सेलेक्शन" ऑपरेशन लागू करना था।

void COutputList::OnEditCopy()
{
    while (TRUE)
    {
        if (OpenClipboard())
        {
            if (EmptyClipboard())
            {
                CString s, si;
                for (int i = 0, n = GetCount(); i < n; i++)
                    if (GetSel(i)>0)
                    {
                        GetText(i, si);
                        s += si + _T("\r\n");
                    }
                if (!s.IsEmpty())
                {
                    HGLOBAL hMem = GlobalAlloc(GHND, (s.GetLength() + 1)*sizeof(TCHAR));
                    if (hMem)
                    {
                        LPTSTR p = (LPTSTR)GlobalLock(hMem);
                        if (p)
                        {
                            lstrcpy(p, s);
                            GlobalUnlock(hMem);
                            if (!SetClipboardData(sizeof(TCHAR) == sizeof(WCHAR) ? CF_UNICODETEXT : CF_TEXT, hMem))
                            {
                                GlobalFree(hMem);
                                AfxMessageBox(_T("Could not copy the Selection to the Clipboard!"));
                            }
                        }
                        else
                        {
                            GlobalFree(hMem);
                            AfxMessageBox(_T("Memory Allocation Error!"));
                        }
                    }
                    else AfxMessageBox(_T("Memory Allocation Error!"));
                }
            }
            else AfxMessageBox(_T("The Clipboard could not be emptied!"));
            CloseClipboard();
            break;
        }
        else
            if (AfxMessageBox(_T("The Selection cannot be copied because the Clipboard is currently unavailable"),
                MB_RETRYCANCEL | MB_ICONQUESTION) != IDRETRY)
                break;
    }
}
2
Constantine Georgiou 19 मार्च 2021, 01:50