Картинка на кнопке

0 голосов
спросил 20 Авг, 07 от new_sergei (2,660 баллов) в категории Программные продукты Esri
Суть проблемы: в VC++ создаётся dll - для обработки нажатия кнопки на тулбаре. Необходимо, чтобы на кнопке было какое-то изображение. Сам bmp-файл создал в Paint. Далее импортировал его в редактор ресурсов. Но вот когда пробую добавлять dll на тулбар, то сама кнопка получается прозрачной - серой. Т.е. экспорт самого ресурса прошёл некорректно. Кстати, это же касается и название команды - почему-то забивается стандартное ZoomIn x 0.5 Cpp.

P.S. Картинку я сохранял как содержащую не более 256 оттенков.

8 Ответы

0 голосов
ответил 20 Авг, 07 от new_sergei (2,660 баллов)
С названием немного погорячился - надо просто изменить get_Caption(), а вот вопрос про изображение остаётся в силе.
0 голосов
ответил 21 Авг, 07 от new_sergei (2,660 баллов)
Похоже, картина проясняется. Заметил, что чёрный цвет не передаётся на кнопку вообще. Красный - виден, но достаточно плохо. Посему, изображение на кнопках должны быть только светлых цветов.
0 голосов
ответил 21 Авг, 07 от -3A- (5,220 баллов)
а 16-цветный битмап не пробовал?
скорей всего ArcMap просто некорректно работает с 256-цветными картинками в тулбарах
0 голосов
ответил 21 Авг, 07 от new_sergei (2,660 баллов)
а 16-цветный битмап не пробовал?
скорей всего ArcMap просто некорректно работает с 256-цветными картинками в тулбарах

    
В том то всё и дело, что пробовал. Мне кажется, что дело тут даже не в цветности, а в размере самой картинки.
    
0 голосов
ответил 22 Авг, 07 от filippov70 (5,320 баллов)
да, только 16*16

private
: HBITMAP m_hBitmap;

CFoo()
{
    m_hBitmap = ::LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BMP16*16));
}
~CFoo()
{
    DeleteObject(m_hBitmap);
}


0 голосов
ответил 22 Авг, 07 от new_sergei (2,660 баллов)
   <code id="k">да, только 16*16private</code>:
    HBITMAP    m_hBitmap;
<code> CFoo()
{
        m_hBitmap = ::LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_BMP16*16));
}

~CFoo()
{
        DeleteObject(m_hBitmap);
}</code>

    

Сделал так, как ты написал - вообще картинка не отображается - вместо картинки просто идёт подпись, заданная в get_Caption().
0 голосов
ответил 23 Авг, 07 от filippov70 (5,320 баллов)
К сожалению, я пока плохо разбираюсь в том, как работает VC++ с ресурсами.
Вот точно работающий код на C#, вернее часть

namespace Gis
{

    [Guid("08D0FCF4-E712-48af-8F00-A12A2817F356")]

    public sealed class GIScmdVedCoord:ICommand
........

        private Bitmap m_bitmap;
        private IntPtr m_hBitmap;

.................

        public GIScmdVedCoord()// конструктор
        {

            try
            {

               
                m_bitmap = new Bitmap(GetType().Assembly.GetManifestResourceStream("Gis.Vedomost.bmp"));
                m_bitmap.MakeTransparent(m_bitmap.GetPixel(1, 1));
                m_hBitmap = m_bitmap.GetHbitmap();


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        ~GIScmdVedCoord()
        {

            if (m_hBitmap.ToInt32() != 0)
            {
                DeleteObject(m_hBitmap);
            }

        }
..................

    #region ICommand Members
public int  Bitmap
{
    get { return m_hBitmap.ToInt32(); }
}

public string  Caption
{
    get { return "Ведомость координат"; }
}
а у тебя есть ArcGIS Developer Help? там все оч хорошо написано
0 голосов
ответил 23 Авг, 07 от new_sergei (2,660 баллов)
Спасибо за пример, но C# - это хоть и близкое, но всё-таки другое "измерение", поэтому многое в VC++ будет выглядеть по-другому.

а у тебя есть ArcGIS Developer Help? там все оч хорошо написано

    
Есть. В том то всё и дело, что я делаю всё как там написно. Разница в том, что они говорят, что надо взять готовую иконку, а я хочу создать новую.


Add a member variable to hold a bitmap resource used by the Command button; this involves changes to the ZoomIn header file and the creation of a Bitmap resource in the resource editor. From the main menu, click Insert, click Resource, then click Import. Navigate to the .bmp file you wish to use as the ZoomIn icon. There is a suitable file in the \Bin\Icons directory of your ArcGIS install called Zoom_in_tool_2.bmp. Click OK when finished. Using the properties for the resource, set the name of the resource to "IDB_ZOOMIN". Add the following member variable to the ZoomIn.h header file.


private:
    HBITMAP    m_hBitmap;

This member variable is initialized in the class constructor and released in the class destructor. Notice the use of the _Module for access to the application instance handle. The IDB_ZOOMIN is a bitmap resource defined in the resource editor.


CZoomIn()
{
    m_hBitmap = ::LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_ZOOMIN));
}

~CZoomIn()
{
    DeleteObject(m_hBitmap);
}
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...