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

  • Автор темы -
  • Дата начала

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

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

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

Izverg

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

Код:
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, слушай, я че-то туплю. Такой вопрос, ну добавил я это в код, а как теперь с этим кнопку создать, и как обработать? Можешь пример использования написать, чтобы я понял?
 
I

Izverg

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

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

Izverg

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

Вложения

Гость
#7
Я разобрался как сделать. Следующим образом:
При создании кнопки:
Код:
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, огромное спасибо за помощь!