Значки в меню классов Пакета функций MFC

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

8
задан prakash 1 October 2008 в 10:14
поделиться

5 ответов

Вот как я заставил это работать:

Сначала

, как говорили другие, создайте невидимую панель инструментов рядом с вашей основной панелью инструментов (я использую обычные имена на основе на имена AppWizard):

MainFrm.h:
class CMainFrame
{
    //...    
    CMFCToolBar m_wndToolBar;
    CMFCToolBar m_wndInvisibleToolBar;
    //...
};

MainFrm.cpp:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    //...

    // Normal, visible toolbar
    if(m_wndToolBar.Create(this,
        TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
    {
        VERIFY( m_wndToolBar.LoadToolBar(
            theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME) );

        // Only the docking makes the toolbar visible
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        DockPane(&m_wndToolBar);
    }

    // Invisible toolbar; simply calling Create(this) seems to be enough
    if(m_wndInvisibleToolBar.Create(this))
    {
        // Just load, no docking and stuff
        VERIFY( m_wndInvisibleToolBar.LoadToolBar(IDR_OTHERTOOLBAR) );
    }
}

Второй: изображения и ресурсы панели инструментов

IDR_MAINFRAME и IDR_MAINFRAME_256 были созданы AppWizard. Первая представляет собой уродливую версию с 16 цветами, а вторая - интересную версию с высоким содержанием цветов.
Несмотря на свое название, если я правильно помню, даже изображение, созданное AppWizard, имеет 24-битную глубину цвета. Крутая вещь: просто замените его 32-битным изображением, и это тоже сработает.

Есть невидимая панель инструментов IDR_OTHERTOOLBAR : Я создал панель инструментов с помощью редактора ресурсов. Просто фиктивные значки и идентификаторы команд. Затем VS сгенерировал растровое изображение, которое я заменил своей версией с высоким содержанием цвета. Готово!

Примечание

Не открывайте панели инструментов с помощью редактора ресурсов: ему, возможно, придется преобразовать его в 4-битный, прежде чем он сможет что-либо с ним делать. И даже , если вы позволите ему это сделать (потому что за спиной Visual Studio вы собираетесь снова заменить результат на изображение с высоким содержанием цвета, ха!), Я обнаружил, что это (иногда?) Просто не может редактировать панель инструментов. Очень странно.
В этом случае я советую напрямую отредактировать файл .rc.

4
ответ дан 5 December 2019 в 17:43
поделиться

Я верю (но я могу быть неправым), что эти классы совпадают с классами BCGToolbar, которые были включены в MFC, когда Microsoft купила BCG. Если так, можно создать панель инструментов с и использовать тот же идентификатор на кнопке на панели инструментов как в пунктах меню, для которых Вы хотите создать значки, и они должны появиться автоматически. Конечно, Вы не должны на самом деле отображать панели инструментов.

2
ответ дан 5 December 2019 в 17:43
поделиться

В BCGToolbar достаточно создать панель инструментов на ресурсах и загрузить его (но не отобразить окно), но кнопка на панели инструментов должна иметь тот же идентификатор как пункт меню, с которым Вы хотите связать его.

2
ответ дан 5 December 2019 в 17:43
поделиться

One thing that can catch a person by surprise is that for customizable (ie, non-locked) toolbars, the first toolbar you make, the framework splits up and turns into some sort of palette bitmap of all icons in the program. If you try to add more toolbars later (or different toolbars) that have bitmaps (or pngs) with a different color depth than that first one, they seem to fail because it can't add them to the same palette.

0
ответ дан 5 December 2019 в 17:43
поделиться

Попробуйте использовать эту функцию:

CMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
   UINT uiBmpResID=0,
   UINT uiColdResID=0,
   UINT uiMenuResID=0,
   UINT uiDisabledResID=0,
   UINT uiMenuDisabledResID=0);

Так, например:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

Сработало очень хорошо для меня.

2
ответ дан 5 December 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: