मुझे MFC एप्लिकेशन में टूलबार में बटन का IMAGE (प्रकार का कोई फर्क नहीं पड़ता) कैसे बदलना चाहिए?

Nov 29 2020

मुझे पता है कि यह मूर्खतापूर्ण समस्या है लेकिन मैं इसके साथ पिछले 4 दिनों से अटका हुआ हूं। केवल MFC ऐप्स में टूलबार को संशोधित करना इतना जटिल क्यों है?

मैं नया विज़ुअल स्टूडियो MFC एप्लिकेशन बनाता हूं जो संवाद आधारित है । मैं नया टूलबार संसाधन बनाता हूं । और फिर मैं कैसे छवियों (png, बिटमैप, jpeg ...) को सेट करूं या मेरे टूलबार में किस प्रकार का उपयोग किया जाए?

मेरे पास w50 और h50 के आकार हैं और मैं बटन के अंदर आकर्षित कर सकता हूं। लेकिन मुझे छवि का उपयोग करने का तरीका नहीं मिला।

इस 2 बटन के बजाय जो मैंने अभी-अभी कोशिश की है अगर उसका काम कर रहा हूं, तो मैं 8 छवियों का उपयोग करना चाहता हूं जो बिटमैप प्रारूप में और पीएनजी में हैं। मैंने कहीं पढ़ा है कि PNG MFC अनुप्रयोगों द्वारा समर्थित नहीं है इसलिए मैंने बिटमैप में परिवर्तित किया।

मैं अपने टूलबार को संवाद ऐप में इस तरह लोड करता हूं OnInitDialog():

    DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC;
    DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE;
    CMFCToolBar::m_dblLargeImageRatio = 1;

    if (m_ToolBar.CreateEx(this, dwCtrlStyle, dwStyle, CRect(1, 1, 1, 1), IDR_TOOLBAR1))
    {
        dwStyle = CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC;
        m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() | dwStyle);
        CMFCToolBarInfo info;
        m_ToolBar.LoadToolBarEx(IDR_TOOLBAR1, info, FALSE);
        CSize   sizeToolBar = m_ToolBar.CalcFixedLayout(TRUE, TRUE);
        m_ToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy, SWP_NOACTIVATE | 
        SWP_NOZORDER);
        CPoint ptOffset(0, sizeToolBar.cy);
    }

कृपया अगर कोई मेरी मदद कर सकता है तो मैं वास्तव में आभारी रहूंगा। छवि प्रारूप कोई फर्क नहीं पड़ता। मैं सिर्फ टूलबार में छवि रखना चाहता हूं।

यह वर्तमान में मेरा ऐप है:

अद्यतन: मैंने इस तरह से कोशिश की है। ID_BUTTON_1अगर टूलबार में पहला बटन और मैंने इसकी छवि बदलने की कोशिश की। लेकिन इसके साथ पहले बटन के लिए जगह पर टूलबार में कोई बटन नहीं है। क्या मैं गलत हूं?

VERIFY(m_toolbar.LoadBitmap(IDB_BITMAP1));
CMFCToolBarButton mbutton;
mbutton.SetImage(m_toolbar.GetImages()->GetCount() - 1);
m_toolbar.ReplaceButton(ID_BUTTON_1, CMFCToolBarButton(ID_BUTTON_1, 0));

जवाब

3 AndrewTruckle Nov 29 2020 at 19:00

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

उदाहरण के लिए, मैं अपने OnInitDialogफ़ंक्शन में इसे कॉल करता हूं :

void CMeetingScheduleAssistantDlg::CreateToolbar()
{
    DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC;
    DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE;

    CMFCToolBar::m_dblLargeImageRatio = 1; // AJT v20.1.7 Bug fix
    if (m_ToolBar.CreateEx(this, dwCtrlStyle,
        dwStyle, CRect(1, 1, 1, 1), IDR_TOOLBAR))
    {
        dwStyle = CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC;
        m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() | dwStyle);

        CMFCToolBarInfo info;

        info.m_uiColdResID = IDB_PNG_MAIN_TOOLBAR;
        info.m_uiHotResID = IDB_PNG_MAIN_TOOLBAR;
        info.m_uiLargeColdResID = IDB_PNG_MAIN_TOOLBAR;
        info.m_uiLargeHotResID = IDB_PNG_MAIN_TOOLBAR;

        m_ToolBar.LoadToolBarEx(IDR_TOOLBAR, info, FALSE);

        CSize   sizeToolBar = m_ToolBar.CalcFixedLayout(TRUE, TRUE);
        m_ToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy,
            SWP_NOACTIVATE | SWP_NOZORDER);

        // Move all controls down
        CPoint ptOffset(0, sizeToolBar.cy);

        CRect  rcChild;
        CWnd* pwndChild = GetWindow(GW_CHILD);
        while (pwndChild)
        {
            if (pwndChild->GetSafeHwnd() != m_ToolBar.GetSafeHwnd())
            {
                pwndChild->GetWindowRect(rcChild);
                ScreenToClient(rcChild);
                rcChild.OffsetRect(ptOffset);
                pwndChild->MoveWindow(rcChild, FALSE);
            }
            pwndChild = pwndChild->GetNextWindow();
        }

        // Resize the window
        CRect rcWindow;
        GetWindowRect(rcWindow);
        rcWindow.bottom += sizeToolBar.cy;
        MoveWindow(rcWindow, FALSE);

    }
}

मुझे नहीं पता कि मेरा पिछला उत्तर कहां गया है, अन्यथा मैंने इसे डुप्लिकेट के रूप में चिह्नित किया होगा। #confused।