Изображение из файла на кнопку

Тема в разделе "MS Visual C++", создана пользователем -, 18 янв 2008.

  1. Гость

    Доброго времени суток всем! Не могли бы вы мне помочь? У меня возникла следующая проблема: Я пишу в Visual Studio 2005 под C++ и загружаю кнопку в WndProc в WM_CREATE старым дедовским
    Код (Text):
    CreateWindow("button","Надпись",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
    x,y,width,heigth,hWnd,(HMENU)ID_BUTTON40001,NULL,NULL);
    Ну и соответственно потом обрабатываю её...

    Вот, а само окно естественно не загружаю из формы а сам ручками прописываю, просто так удобнее(т.к. я вообщето пишу прогу с использованием OpenGL), а мне нужно на кнопочку, которую я создаю вручную, натянуть картинку, которую я загружаю следущим образом:
    Код (Text):
    Image[0] = auxDIBImageLoad(Filename);
    , где Image[0], объявляется следующим образом:
    AUX_RGBImageRec *Image[2]; Image - массив, в котором просто несколько картинок хранится
    AUX_RGBImageRec - структура следующего типа:
    Код (Text):
    typedef struct _AUX_RGBImageRec {
    GLint sizeX, sizeY;
    unsigned char *data;
    } AUX_RGBImageRec;
    Причем, желательно, чтобы размер изображения изменялся.

    Не мог бы кто-нибудь подсказать мне, как это сделать?
     
  2. Izverg

    Izverg Гость

    Если используешь OpenGL, то лучше им же кнопку и рисовать. Вообще я бы тебе посоветовал создать свою либу gui. Например:

    Код (Text):
    class cGUIControl
    {
    private:

    bool    mActive;  // если наш контрол активен (т.е. нужно обрабатывать его состояния)
    bool    mVisible; // если наш контрол виден (т.е. его нужно отображать)
    bool    mFocus;  // если наш контрол выбран (т.е. имеет фокус ввода)
    bool    mPress;  // если наш контрол находится в нажатом состоянии
    rect    mBounds; // границы нашего контрола (прямоугольник)
    color  mBColor; // цвет фона контрола
    image *mBimg; // картинка фона (если есть)

    public:

    cGUIControl(){ //инициализация }

    bool IsActive() const { return mActive; }
    bool IsVisible() const { return mVisible; }
    bool IsCaptured() const { return mFocus; }
    bool IsPressed() const { return mPress; }

    // setters / getters
    void SetBColor(color& c){ mBColor = c; }
    void SetBounds(rect& b){ mBounds = b; }
    ....

    void Press(){ mPress = true; OnPress(); }
    void UnPress(){ mPress = false; OnUnPress(); }
    void Enable() { mActive = true; OnEnable(); }
    void Disable(){ mActive = false; OnDisable(); }
    void Show() { mVisible = true; OnShow(); }
    void Hide(){ mVisible = false; OnHide(); }
    void Capture() { mFocus = true; OnFocusGain(); }
    void Release(){ mFocus = false; OnFocusLost(); }
    void Scroll(int pos){ if(mFocus) OnScroll(pos); }

    virtual void OnDraw(){} // здесь рисуем что-то
    virtual void OnUpdate(float delta_time){} // здесь обновляем анимацию контрола (например если у нас мигающий текст и т.д.)

    private:

    virtual void OnPress(){}         // делаем что-то, если контрол нажат
    virtual void OnUnPress(){}   // делаем что-то, если контрол отпущен
    virtual void OnEnable(){}     // делаем что-то, если контрол стал активен
    virtual void OnDisable(){}   // делаем что-то, если контрол стал не активен
    virtual void OnShow(){}      // делаем что-то, если контрол стал видимым
    virtual void OnHide(){}      // делаем что-то, если контрол стал невидимым
    virtual void OnFocusGain(){}      // делаем что-то, если контрол приобрел фокус (выбран)
    virtual void OnFocusLost(){}      // делаем что-то, если контрол потерял фокус (не выбран)
    virtual void OnScroll(int pos){} // делаем что-то, если контрол прокручивается колесом мыши (нужно для ScrollBar)
    };

    class cGUIButton : virtual public cGUIControl
    {
    private:

    string mCaption; // название кнопки
    color mTColot; // цвет надписи на кнопке
    font  *mFont; // шрифт

    public:

    cGUIButton() : cGUIControl() {...}

    // other methods
    ...
    };
     
  3. Гость

    Izverg, слушай, я че-то туплю. Такой вопрос, ну добавил я это в код, а как теперь с этим кнопку создать, и как обработать? Можешь пример использования написать, чтобы я понял?
     
  4. Izverg

    Izverg Гость

    Сегодня уже не успею в понедельник пример выложу
     
  5. Гость

    Для: Izverg
    Я еще хотел попросить, чтобы то что ты мне порекомендуешь было попроще в реализации, поскольку у меня очень мало времени на доделку. У меня уже прописаны реакции на кнопки и сами они созданы, но мне нужно сделать, чтобы они покрасивее выглядели.
     
  6. Izverg

    Izverg Гость

    Вот, к сожалению в реалезации оно достаточно сложновато было, я думаю, что если нужно попроще, то тогда лучше использовать средства WINAPI (тогда рисовать изображение на кнопке можно с помощью StretchBlt, также нужно задать кнопке стиль BS_OWNERDRAW). Есть еще один подход - менее объектно-риентированный, чем тот, который я показал в примере, но более простой (вместо виртуальных методов для каждого события у каждого контрола есть обработчик событий наподобие WndProc в WINAPI, тогда вместо того, чтобы для каждой кнопки создавать отдельный класс, можно иметь единый класс для всех контролов, а перешружать только обработчик событий (указатель на функцию обработки)
     

    Вложения:

    • GUISample.zip
      Размер файла:
      18,6 КБ
      Просмотров:
      31
  7. Гость

    Я разобрался как сделать. Следующим образом:
    При создании кнопки:
    Код (Text):
    hbttn = CreateWindow("button","",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE|BS_BITMAP,
    8,0,106,106,hWnd,(HMENU)ID_BUTTON,NULL,NULL);
    hBitmap=(HBITMAP)LoadImage(hInstance,path,IMAGE_BITMAP,100,100,LR_LOADFROMFILE);
    SendMessage((HWND) hbttn, (UINT) BM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hBitmap);
    здесь, char path[260] - путь к файлу
    HWND hbttn - хвндешник кнопки
    HBITMAP hBitmap - указатель на загружаемый файл(если не ошибаюсь с названием)

    Если кто захочет посмотреть остальные параметры данных функций, то залезте на msdn, я нашел все там и дополнительно полазил по форумам.
    Izverg, огромное спасибо за помощь!
     
Загрузка...

Поделиться этой страницей