none
Кнопка-картинка RRS feed

  • Вопрос

  • Здравствуйте, а есть ли в net 4.0 компонент кнопка-картинка, что бы можно было указывать картинку при нажатии при наведении и тп, или это только самому делать, если самому, то не подскажите как правильно узнать папку, откуда стартовало приложение
    • Перемещено Abolmasov Dmitry 26 января 2011 г. 13:53 (От:Разное)
    26 января 2011 г. 12:54

Ответы

  • Вот пример класса для такого элемента управления. По-хорошему там следовало бы перекрыть ненужные свойства (например, Image и BackgroundImage), но для примера, думаю, сойдет:

    public partial class MyImage : PictureBox
    {
      private bool mouseOverControl;
      private Image normalImage;
    
      public MyImage()
      {
        InitializeComponent();
        mouseOverControl = false;
        normalImage = null;
        MouseEnter += new EventHandler(MyImage_MouseEnter);
        MouseLeave += new EventHandler(MyImage_MouseLeave);
        MouseDown += new MouseEventHandler(MyImage_MouseDown);
        MouseUp += new MouseEventHandler(MyImage_MouseUp);
      }
    
      public Image NormalImage
      {
        get
        {
          return normalImage;
        }
        set
        {
          normalImage = value;
          if (!mouseOverControl)
            Image = NormalImage;
        }
      }
      public Image HoverImage { get; set; }
      public Image PressedImage { get; set; }
        
      protected virtual void MyImage_MouseEnter(object sender, EventArgs e)
      {
        Image = HoverImage;
      }
    
      protected virtual void MyImage_MouseLeave(object sender, EventArgs e)
      {
        Image = NormalImage;
      }
    
      protected virtual void MyImage_MouseDown(object sender, MouseEventArgs e)
      {
        Image = PressedImage;
      }
    
      protected virtual void MyImage_MouseUp(object sender, MouseEventArgs e)
      {
        Image = HoverImage;
      }
    }
    
    

    • Помечено в качестве ответа Ruzik 26 января 2011 г. 13:48
    26 января 2011 г. 13:44

Все ответы

  • Windows Forms или WPF?
    26 января 2011 г. 13:12
  • Для обычных ситуаций (приложение запущено пользователем из исполняемого exe-файла):

    System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
    

    Возвращает путь к исполняемому файлу приложения.

    Для Windows-служб и ASP.NET-приложений по-другому.

    26 января 2011 г. 13:16
  • Windows Forms
    26 января 2011 г. 13:22
  • Впрочем, в любом случае ответ: только самому. Но это несложно.
    26 января 2011 г. 13:22
  • Вот пример класса для такого элемента управления. По-хорошему там следовало бы перекрыть ненужные свойства (например, Image и BackgroundImage), но для примера, думаю, сойдет:

    public partial class MyImage : PictureBox
    {
      private bool mouseOverControl;
      private Image normalImage;
    
      public MyImage()
      {
        InitializeComponent();
        mouseOverControl = false;
        normalImage = null;
        MouseEnter += new EventHandler(MyImage_MouseEnter);
        MouseLeave += new EventHandler(MyImage_MouseLeave);
        MouseDown += new MouseEventHandler(MyImage_MouseDown);
        MouseUp += new MouseEventHandler(MyImage_MouseUp);
      }
    
      public Image NormalImage
      {
        get
        {
          return normalImage;
        }
        set
        {
          normalImage = value;
          if (!mouseOverControl)
            Image = NormalImage;
        }
      }
      public Image HoverImage { get; set; }
      public Image PressedImage { get; set; }
        
      protected virtual void MyImage_MouseEnter(object sender, EventArgs e)
      {
        Image = HoverImage;
      }
    
      protected virtual void MyImage_MouseLeave(object sender, EventArgs e)
      {
        Image = NormalImage;
      }
    
      protected virtual void MyImage_MouseDown(object sender, MouseEventArgs e)
      {
        Image = PressedImage;
      }
    
      protected virtual void MyImage_MouseUp(object sender, MouseEventArgs e)
      {
        Image = HoverImage;
      }
    }
    
    

    • Помечено в качестве ответа Ruzik 26 января 2011 г. 13:48
    26 января 2011 г. 13:44
  • А не подскажите, что означает в public partial class MyImage : PictureBox, слово partial
    30 января 2011 г. 13:59
  • Оно означает, что другая часть этого класса может быть определена в другом файле, а при компиляции все части класса должны быть объединены в один класс. Подробнее — здесь .

    В данном случае оно необязательно, и его можно удалить.

    30 января 2011 г. 14:04
  • +у меня выдает очень много ошибок

    Ошибка 1 error C2143: синтаксическая ошибка: отсутствие ";" перед "<class-head>" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 67 1 Полигон2

    Ошибка 2 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 67 1 Полигон2

    Ошибка 3 error C2814: Полигон2::Form1::MyImage: собственный тип не может быть вложенным в управляемом типе "Полигон2::Form1" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 67 1 Полигон2

    Ошибка 4 error C3625: Полигон2::Form1::MyImage: неуправляемый тип не может быть производным от управляемого типа "System::Windows::Forms::PictureBox" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 68 1 Полигон2

    Ошибка 5 error C2144: синтаксическая ошибка: перед "bool" требуется ":" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 69 1 Полигон2

    Ошибка 6 error C2144: синтаксическая ошибка: перед "System::Drawing::Image" требуется ":" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 70 1 Полигон2

    Ошибка 7 error C3622: System::Drawing::Image: класс, объявленный как "abstract", не предусматривает создание экземпляров c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 70 1 Полигон2

    Ошибка 8 error C3265: нельзя объявлять управляемый "normalImage" в неуправляемом "Полигон2::Form1::MyImage" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 70 1 Полигон2

    Ошибка 9 error C3076: Полигон2::Form1::MyImage::normalImage: нельзя внедрить экземпляр ссылочного типа "System::Drawing::Image" в собственный тип c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 70 1 Полигон2

    Ошибка 10 error C2144: синтаксическая ошибка: перед "Полигон2::Form1::MyImage" требуется ":" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 72 1 Полигон2

    Ошибка 11 error C2144: синтаксическая ошибка: перед "System::Drawing::Image" требуется ":" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 83 1 Полигон2

    Ошибка 12 error C3622: System::Drawing::Image: класс, объявленный как "abstract", не предусматривает создание экземпляров c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 84 1 Полигон2

    Ошибка 13 error C3265: нельзя объявлять управляемый "NormalImage" в неуправляемом "Полигон2::Form1::MyImage" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 84 1 Полигон2

    Ошибка 14 error C3076: Полигон2::Form1::MyImage::NormalImage: нельзя внедрить экземпляр ссылочного типа "System::Drawing::Image" в собственный тип c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 84 1 Полигон2

    Ошибка 15 error C2473: NormalImage: выглядит как определение функции, но без списка параметров. c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 84 1 Полигон2

    Ошибка 16 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 86 1 Полигон2

    Ошибка 17 error C2473: get: выглядит как определение функции, но без списка параметров. c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 86 1 Полигон2

    Ошибка 18 error C2059: синтаксическая ошибка: return c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 87 1 Полигон2

    Ошибка 19 error C2238: непредвиденные лексемы перед ";" c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 87 1 Полигон2

    Ошибка 20 error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции c:\documents and settings\rustam\мои документы\visual studio 2010\projects\полигон2\Form1.h 88 1 Полигон2

    При включении вашего класса, я даже еще объект не создавал

    30 января 2011 г. 14:07
  • Класс Алексея написан на C#. Ты пытаешься скомпилировать его как код на C++. 

    Может быть стоит сначала выучить C# и научиться работать с платформой? IMHO, у отвечающих не может возникнуть и мысли, что человек задает элементарные вопросы по основам .NET, и при этом пишет на хардкорном C++/CLI, даже без допечатки. 


    My blog
    30 января 2011 г. 14:18
  • Вот тот же самый класс на C++/CLI, сгенерированный при помощи Reflector:

    public __gc class MyImage : public PictureBox
    {
      public: MyImage()
      {
        base->MouseEnter += new EventHandler __gc*(this.MyImage_MouseEnter);
        base->MouseLeave += new EventHandler __gc*(this.MyImage_MouseLeave);
        base->MouseDown += new MouseEventHandler __gc*(this.MyImage_MouseDown);
        base->MouseUp += new MouseEventHandler __gc*(this.MyImage_MouseUp);
      }
    
      protected: virtual void __gc* MyImage_MouseDown(Object __gc* sender, MouseEventArgs __gc* e)
      {
        base->Image = this->PressedImage;
      }
    
      protected: virtual void __gc* MyImage_MouseEnter(Object __gc* sender, EventArgs __gc* e)
      {
        base->Image = this->HoverImage;
      }
    
      protected: virtual void __gc* MyImage_MouseLeave(Object __gc* sender, EventArgs __gc* e)
      {
        base->Image = this->NormalImage;
      }
    
      protected: virtual void __gc* MyImage_MouseUp(Object __gc* sender, MouseEventArgs __gc* e)
      {
        base->Image = this->HoverImage;
      }
    
    
      public: __property Image __gc* get_HoverImage()
      {
        return this-><HoverImage>k__BackingField;
      }
    
      public: __property void __gc* set_HoverImage(Image __gc* value)
      {
        this-><HoverImage>k__BackingField = value;
      }
    
      public: __property Image __gc* get_NormalImage()
      {
        return this->normalImage;
      }
    
      public: __property void __gc* set_NormalImage(Image __gc* value)
      {
        this->normalImage = value;
        if (!this->mouseOverControl)
        {
          base->Image = this->NormalImage;
        }
      }
    
      public: __property Image __gc* get_PressedImage()
      {
        return this-><PressedImage>k__BackingField;
      }
    
      public: __property void __gc* set_PressedImage(Image __gc* value)
      {
        this-><PressedImage>k__BackingField = value;
      }
    
      private: Image __gc* <HoverImage>k__BackingField;
      private: Image __gc* <PressedImage>k__BackingField;
      private: Boolean __gc* mouseOverControl = false;
      private: Image __gc* normalImage = 0;
    };
    
    
    Код, конечно, получился не очень аккуратным и может содержать незначительные синтаксические ошибки, но все же хоть что-то.

    30 января 2011 г. 14:28