summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilrik de Loose <wilrik@wilrik.nl>2008-04-21 12:01:00 (GMT)
committerWilrik de Loose <wilrik@wilrik.nl>2008-04-21 12:01:00 (GMT)
commit92f2ef5fa1b80c6491ce46eab0ab0908eb9be9cc (patch)
tree59e88beb00179be262136ab4fd5a03e4ce6c7107
parent1cba012df1d435fd2b4d2277bcc741152a287541 (diff)
download2iv55-92f2ef5fa1b80c6491ce46eab0ab0908eb9be9cc.zip
2iv55-92f2ef5fa1b80c6491ce46eab0ab0908eb9be9cc.tar.gz
2iv55-92f2ef5fa1b80c6491ce46eab0ab0908eb9be9cc.tar.bz2
Radio buttons toegevoegd.
-rw-r--r--menu_demo/Debug/BuildLog.htmbin7078 -> 7086 bytes
-rw-r--r--menu_demo/Debug/main.objbin13527 -> 13555 bytes
-rw-r--r--menu_demo/Debug/menu.objbin12620 -> 13547 bytes
-rw-r--r--menu_demo/Debug/menu_demo.exebin520192 -> 520192 bytes
-rw-r--r--menu_demo/Debug/menu_demo.ilkbin1223132 -> 1217312 bytes
-rw-r--r--menu_demo/Debug/menu_demo.pdbbin2100224 -> 2083840 bytes
-rw-r--r--menu_demo/Debug/mt.dep2
-rw-r--r--menu_demo/Debug/vc80.idbbin125952 -> 125952 bytes
-rw-r--r--menu_demo/Debug/vc80.pdbbin69632 -> 61440 bytes
-rw-r--r--menu_demo/bitmap.c32
-rw-r--r--menu_demo/button.c210
-rw-r--r--menu_demo/button.h24
-rw-r--r--menu_demo/img/button01.bmpbin162230 -> 0 bytes
-rw-r--r--menu_demo/img/button_click_center.bmpbin250 -> 488 bytes
-rw-r--r--menu_demo/img/button_click_center_hover.bmpbin250 -> 488 bytes
-rw-r--r--menu_demo/img/button_click_left.bmpbin3778 -> 21656 bytes
-rw-r--r--menu_demo/img/button_click_left_hover.bmpbin3778 -> 21656 bytes
-rw-r--r--menu_demo/img/button_click_right.bmpbin3778 -> 21656 bytes
-rw-r--r--menu_demo/img/button_click_right_hover.bmpbin3778 -> 21656 bytes
-rw-r--r--menu_demo/img/button_radio.bmpbin0 -> 129656 bytes
-rw-r--r--menu_demo/img/button_radio_hover.bmpbin0 -> 129656 bytes
-rw-r--r--menu_demo/img/button_radio_pressed.bmpbin0 -> 129656 bytes
-rw-r--r--menu_demo/img/images/photoshop/button01.psdbin133709 -> 188279 bytes
-rw-r--r--menu_demo/main.c9
-rw-r--r--menu_demo/menu.c53
-rw-r--r--menu_demo/menu_demo.ncbbin7891968 -> 7891968 bytes
-rw-r--r--menu_demo/menu_demo.suobin20992 -> 24576 bytes
27 files changed, 259 insertions, 71 deletions
diff --git a/menu_demo/Debug/BuildLog.htm b/menu_demo/Debug/BuildLog.htm
index d51a82d..e8fdbeb 100644
--- a/menu_demo/Debug/BuildLog.htm
+++ b/menu_demo/Debug/BuildLog.htm
Binary files differ
diff --git a/menu_demo/Debug/main.obj b/menu_demo/Debug/main.obj
index 3c8ba3d..f85d870 100644
--- a/menu_demo/Debug/main.obj
+++ b/menu_demo/Debug/main.obj
Binary files differ
diff --git a/menu_demo/Debug/menu.obj b/menu_demo/Debug/menu.obj
index 6efb995..f352396 100644
--- a/menu_demo/Debug/menu.obj
+++ b/menu_demo/Debug/menu.obj
Binary files differ
diff --git a/menu_demo/Debug/menu_demo.exe b/menu_demo/Debug/menu_demo.exe
index 2b07479..57aaeac 100644
--- a/menu_demo/Debug/menu_demo.exe
+++ b/menu_demo/Debug/menu_demo.exe
Binary files differ
diff --git a/menu_demo/Debug/menu_demo.ilk b/menu_demo/Debug/menu_demo.ilk
index 4293966..b17d0ca 100644
--- a/menu_demo/Debug/menu_demo.ilk
+++ b/menu_demo/Debug/menu_demo.ilk
Binary files differ
diff --git a/menu_demo/Debug/menu_demo.pdb b/menu_demo/Debug/menu_demo.pdb
index c394ffd..2a06f6d 100644
--- a/menu_demo/Debug/menu_demo.pdb
+++ b/menu_demo/Debug/menu_demo.pdb
Binary files differ
diff --git a/menu_demo/Debug/mt.dep b/menu_demo/Debug/mt.dep
index d002e7a..ec9910a 100644
--- a/menu_demo/Debug/mt.dep
+++ b/menu_demo/Debug/mt.dep
@@ -1 +1 @@
-Manifest resource last updated at 15:54:12,92 on 17-04-2008
+Manifest resource last updated at 13:56:48,94 on 21-04-2008
diff --git a/menu_demo/Debug/vc80.idb b/menu_demo/Debug/vc80.idb
index 21ceed3..7936b0e 100644
--- a/menu_demo/Debug/vc80.idb
+++ b/menu_demo/Debug/vc80.idb
Binary files differ
diff --git a/menu_demo/Debug/vc80.pdb b/menu_demo/Debug/vc80.pdb
index d4df68e..6ade11b 100644
--- a/menu_demo/Debug/vc80.pdb
+++ b/menu_demo/Debug/vc80.pdb
Binary files differ
diff --git a/menu_demo/bitmap.c b/menu_demo/bitmap.c
index edb981d..83aacda 100644
--- a/menu_demo/bitmap.c
+++ b/menu_demo/bitmap.c
@@ -1,7 +1,8 @@
#ifdef G_OS_WIN32
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
- #define GL_BGR 0x80E0
+ #define GL_BGR 0x80E0
+ #define GL_BGRA 0x80E1
#endif
#include <GL/gl.h>
@@ -16,7 +17,8 @@
#define BITMAP_HEADERSIZE 0x0e
#define BITMAP_WIDTH 0x12
#define BITMAP_HEIGHT 0x16
-
+#define BITMAP_DEPTH 0x1c
+#define BITMAP_IMAGE_SIZE 0x22
struct ImageStruct BitmapLoad(char *filename)
@@ -31,7 +33,8 @@ struct ImageStruct BitmapLoad(char *filename)
// does the bitmap exist?
if (bitmap > 0)
{
- unsigned int dataoffset, filesize;
+ unsigned int dataoffset, filesize, imagesize;
+ short depth;
GLsizei width, height;
unsigned char *imagedata;
@@ -42,17 +45,30 @@ struct ImageStruct BitmapLoad(char *filename)
fseek(bitmap, BITMAP_WIDTH, SEEK_SET);
fread(&width, 4, 1, bitmap);
fread(&height, 4, 1, bitmap);
+ fseek(bitmap, BITMAP_DEPTH, SEEK_SET);
+ fread(&depth, 2, 1, bitmap);
+ fseek(bitmap, BITMAP_IMAGE_SIZE, SEEK_SET);
+ fread(&imagesize, 4, 1, bitmap);
- imagedata = (unsigned char *)malloc((size_t)(filesize -dataoffset));
+ imagedata = (unsigned char *)malloc((size_t)imagesize);
fseek(bitmap, dataoffset, SEEK_SET);
- fread(imagedata, (size_t)(filesize -dataoffset), 1, bitmap);
+ fread(imagedata, (size_t)imagesize, 1, bitmap);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
- gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_BGR, GL_UNSIGNED_BYTE, imagedata);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ if (depth == 24) // 24 bits
+ {
+ gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_BGR, GL_UNSIGNED_BYTE, imagedata);
+ }
+ else // depth == 32 bits
+ {
+ gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, width, height, GL_BGRA, GL_UNSIGNED_BYTE, imagedata);
+ }
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
l_sImage.m_iImageId = texture;
l_sImage.m_iWidth = width;
diff --git a/menu_demo/button.c b/menu_demo/button.c
index 365619b..cd5a561 100644
--- a/menu_demo/button.c
+++ b/menu_demo/button.c
@@ -11,15 +11,15 @@
-struct ButtonStruct ButtonCreate(double f_dXPos, double f_dYPos, double f_dWidth, char *f_pcTitle, int f_iType)
+struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, int f_dHeight, char *f_pcTitle, int f_iType)
{
struct ButtonStruct l_sButton;
// copy parameters
- l_sButton.m_dXPos = f_dXPos;
- l_sButton.m_dYPos = f_dYPos;
- l_sButton.m_iType = f_iType;
- l_sButton.m_dWidth = f_dWidth;
+ l_sButton.m_dXPos = f_dXPos;
+ l_sButton.m_dYPos = f_dYPos;
+ l_sButton.m_iType = f_iType;
+ l_sButton.m_dHeight = f_dHeight;
// copy title
memcpy(l_sButton.m_pcTitle, f_pcTitle, sizeof(f_pcTitle));
@@ -27,22 +27,30 @@ struct ButtonStruct ButtonCreate(double f_dXPos, double f_dYPos, double f_dWidth
switch (f_iType)
{
case BUTTON_CLICK:
+ l_sButton.m_dCenterWidth = f_dCenterWidth;
+
l_sButton.m_piImgNormal[0] = BitmapLoad("img/button_click_left.bmp");
l_sButton.m_piImgNormal[1] = BitmapLoad("img/button_click_center.bmp");
l_sButton.m_piImgNormal[2] = BitmapLoad("img/button_click_right.bmp");
- l_sButton.m_piImgPressed[0] = BitmapLoad("img/button_click_left_hover.bmp");
- l_sButton.m_piImgPressed[1] = BitmapLoad("img/button_click_center_hover.bmp");
- l_sButton.m_piImgPressed[2] = BitmapLoad("img/button_click_right_hover.bmp");
+ l_sButton.m_piImgHover[0] = BitmapLoad("img/button_click_left_hover.bmp");
+ l_sButton.m_piImgHover[1] = BitmapLoad("img/button_click_center_hover.bmp");
+ l_sButton.m_piImgHover[2] = BitmapLoad("img/button_click_right_hover.bmp");
// calculate width of center image
- l_sButton.m_dCenterWidth = f_dWidth - l_sButton.m_piImgNormal[0].m_iWidth - l_sButton.m_piImgNormal[2].m_iWidth;
+ l_sButton.m_dWidth = f_dCenterWidth + l_sButton.m_piImgNormal[0].m_iWidth + l_sButton.m_piImgNormal[2].m_iWidth;
+ break;
- // retrieve image height
+ case BUTTON_RADIO:
+ l_sButton.m_piImgNormal[0] = BitmapLoad("img/button_radio.bmp");
+ l_sButton.m_piImgHover[0] = BitmapLoad("img/button_radio_hover.bmp");
+ l_sButton.m_piImgPressed[0] = BitmapLoad("img/button_radio_pressed.bmp");
+
+ l_sButton.m_dCenterWidth = 0;
+ l_sButton.m_dWidth = l_sButton.m_piImgNormal[0].m_iWidth;
l_sButton.m_dHeight = l_sButton.m_piImgNormal[0].m_iHeight;
break;
- case BUTTON_RADIO:
case BUTTON_LABEL:
default:
break;
@@ -57,20 +65,55 @@ struct ButtonStruct ButtonCreate(double f_dXPos, double f_dYPos, double f_dWidth
+int ButtonGetType(struct ButtonStruct *f_sButton)
+{
+ return f_sButton->m_iType;
+
+} // ButtonGetType
+
+
+
void ButtonClickRender(struct ButtonStruct *f_sButton)
{
char l_pcTitle[BUTTON_MAX_TITLE];
+ struct ImageStruct *l_sImgButton;
+ int l_iImgWidth, l_iImageIdLeft, l_iImageIdCenter, l_iImageIdRight;
+ double l_dXOffset, l_dYOffset;
+
+ double l_dYCoordTop = 1;
+ double l_dYCoordBot = 0;
// copy button attributes
- double l_dWidth = f_sButton->m_dCenterWidth;
- double l_dXPos = f_sButton->m_dXPos;
- double l_dYPos = f_sButton->m_dYPos;
- int l_iType = f_sButton->m_iType;
+ double l_dCnWdt = f_sButton->m_dCenterWidth;
+ double l_dHeight = f_sButton->m_dHeight;
+ double l_dXPos = f_sButton->m_dXPos;
+ double l_dYPos = f_sButton->m_dYPos;
+
+ if (f_sButton->m_bPressed)
+ {
+ //l_dYCoordBot += l_dYCoordTop;
+ //l_dYCoordTop -= l_dYCoordTop;
+ glColor3d(0.8, 0.9, 1);
+ }
+ else
+ {
+ glColor3d(1, 1, 1);
+ }
+
+ // get the right image struct
+ if (f_sButton->m_bHover)
+ {
+ l_sImgButton = f_sButton->m_piImgHover;
+ }
+ else
+ {
+ l_sImgButton = f_sButton->m_piImgNormal;
+ }
// copy buttom images
- int l_iImageIdLeft = (!f_sButton->m_bHover) ? f_sButton->m_piImgNormal[0].m_iImageId : f_sButton->m_piImgPressed[0].m_iImageId;
- int l_iImageIdCenter = (!f_sButton->m_bHover) ? f_sButton->m_piImgNormal[1].m_iImageId : f_sButton->m_piImgPressed[1].m_iImageId;
- int l_iImageIdRight = (!f_sButton->m_bHover) ? f_sButton->m_piImgNormal[2].m_iImageId : f_sButton->m_piImgPressed[2].m_iImageId;
+ l_iImageIdLeft = l_sImgButton[0].m_iImageId;
+ l_iImageIdCenter = l_sImgButton[1].m_iImageId;
+ l_iImageIdRight = l_sImgButton[2].m_iImageId;
// copy button title
memset(&l_pcTitle, 0, sizeof(l_pcTitle));
@@ -79,37 +122,106 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
// render left side of button
glBindTexture(GL_TEXTURE_2D, l_iImageIdLeft);
+ l_iImgWidth = l_sImgButton[0].m_iWidth;
+ l_dXOffset = l_dXPos;
+ l_dYOffset = l_dYPos;
+
glBegin(GL_QUADS);
- glTexCoord3d(0, 1, 0); glVertex3d(l_dXPos, l_dYPos, 0);
- glTexCoord3d(1, 1, 0); glVertex3d(l_dXPos + 26, l_dYPos, 0);
- glTexCoord3d(1, 0, 0); glVertex3d(l_dXPos + 26, l_dYPos + BUTTON_CLICK_HEIGHT, 0);
- glTexCoord3d(0, 0, 0); glVertex3d(l_dXPos, l_dYPos + BUTTON_CLICK_HEIGHT, 0);
+ glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset, l_dYOffset, 0);
+ glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
+ glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset, l_dYOffset + l_dHeight, 0);
glEnd();
+ l_dXOffset += l_iImgWidth;
+
+ // render center of button
+ if (l_dCnWdt > 0)
+ {
+ glBindTexture(GL_TEXTURE_2D, l_iImageIdCenter);
+
+ l_iImgWidth = l_sImgButton[2].m_iWidth;
+
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset, l_dYOffset, 0);
+ glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset, 0);
+ glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset, l_dYOffset + l_dHeight, 0);
+ glEnd();
+ }
+
+ l_dXOffset += l_dCnWdt;
+
// render right side of button
glBindTexture(GL_TEXTURE_2D, l_iImageIdRight);
+ l_iImgWidth = l_sImgButton[2].m_iWidth;
+
glBegin(GL_QUADS);
- glTexCoord3d(0, 1, 0); glVertex3d(l_dXPos + 24 + l_dWidth, l_dYPos, 0);
- glTexCoord3d(1, 1, 0); glVertex3d(l_dXPos + 24 + l_dWidth + 25, l_dYPos, 0);
- glTexCoord3d(1, 0, 0); glVertex3d(l_dXPos + 24 + l_dWidth + 25, l_dYPos + BUTTON_CLICK_HEIGHT, 0);
- glTexCoord3d(0, 0, 0); glVertex3d(l_dXPos + 24 + l_dWidth, l_dYPos + BUTTON_CLICK_HEIGHT, 0);
+ glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset, l_dYOffset, 0);
+ glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
+ glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset, l_dYOffset + l_dHeight, 0);
glEnd();
- // render center of button
- if (l_dWidth > 0)
+ if (f_sButton->m_bPressed)
{
- glBindTexture(GL_TEXTURE_2D, l_iImageIdCenter);
+ glColor3d(1, 1, 1);
+ }
+
+} // ButtonClickRender
+
+
+
+void ButtonRadioRender(struct ButtonStruct *f_sButton)
+{
+ struct ImageStruct *l_sImgButton;
+ int l_iImageId;
+
+ // copy button attributes
+ double l_dWidth = f_sButton->m_dWidth;
+ double l_dHeight = f_sButton->m_dHeight;
+ double l_dXPos = f_sButton->m_dXPos;
+ double l_dYPos = f_sButton->m_dYPos;
+
+ // get the right image struct
+ if (f_sButton->m_bHover)
+ {
+ l_sImgButton = f_sButton->m_piImgHover;
+ }
+ else
+ {
+ l_sImgButton = f_sButton->m_piImgNormal;
+ }
+
+ // copy buttom images
+ l_iImageId = l_sImgButton[0].m_iImageId;
+
+ // render left side of button
+ glBindTexture(GL_TEXTURE_2D, l_iImageId);
+
+ glBegin(GL_QUADS);
+ glTexCoord2d(0, 1); glVertex3d(l_dXPos, l_dYPos, 0);
+ glTexCoord2d(1, 1); glVertex3d(l_dXPos + l_dWidth, l_dYPos, 0);
+ glTexCoord2d(1, 0); glVertex3d(l_dXPos + l_dWidth, l_dYPos + l_dHeight, 0);
+ glTexCoord2d(0, 0); glVertex3d(l_dXPos, l_dYPos + l_dHeight, 0);
+ glEnd();
+
+ if (f_sButton->m_bPressed)
+ {
+ l_iImageId = f_sButton->m_piImgPressed[0].m_iImageId;
+ glBindTexture(GL_TEXTURE_2D, l_iImageId);
glBegin(GL_QUADS);
- glTexCoord3d(0, 1, 0); glVertex3d(l_dXPos + 25, l_dYPos, 0);
- glTexCoord3d(1, 1, 0); glVertex3d(l_dXPos + 25 + l_dWidth, l_dYPos, 0);
- glTexCoord3d(1, 0, 0); glVertex3d(l_dXPos + 25 + l_dWidth, l_dYPos + BUTTON_CLICK_HEIGHT, 0);
- glTexCoord3d(0, 0, 0); glVertex3d(l_dXPos + 25, l_dYPos + BUTTON_CLICK_HEIGHT, 0);
+ glTexCoord2d(0, 1); glVertex3d(l_dXPos, l_dYPos, 0);
+ glTexCoord2d(1, 1); glVertex3d(l_dXPos + l_dWidth, l_dYPos, 0);
+ glTexCoord2d(1, 0); glVertex3d(l_dXPos + l_dWidth, l_dYPos + l_dHeight, 0);
+ glTexCoord2d(0, 0); glVertex3d(l_dXPos, l_dYPos + l_dHeight, 0);
glEnd();
}
-} // ButtonClickRender
+} // ButtonRadioRender
+
@@ -124,6 +236,9 @@ void ButtonRender(struct ButtonStruct *f_sButton)
break;
case BUTTON_RADIO:
+ ButtonRadioRender(f_sButton);
+ break;
+
case BUTTON_LABEL:
default:
break;
@@ -133,8 +248,33 @@ void ButtonRender(struct ButtonStruct *f_sButton)
-void ButtonHover(struct ButtonStruct *f_sButton)
+void ButtonEnter(struct ButtonStruct *f_sButton)
{
f_sButton->m_bHover = TRUE;
} // ButtonHover
+
+
+
+void ButtonExit(struct ButtonStruct *f_sButton)
+{
+ f_sButton->m_bHover = FALSE;
+
+} // ButtonHover
+
+
+
+void ButtonPress(struct ButtonStruct *f_sButton)
+{
+// f_sButton->m_bPressed = TRUE;
+ f_sButton->m_bPressed = !f_sButton->m_bPressed;
+
+} // ButtonPress
+
+
+
+void ButtonRelease(struct ButtonStruct *f_sButton)
+{
+ f_sButton->m_bPressed = FALSE;
+
+} // ButtonPress
diff --git a/menu_demo/button.h b/menu_demo/button.h
index 3103a5d..3440092 100644
--- a/menu_demo/button.h
+++ b/menu_demo/button.h
@@ -8,14 +8,14 @@
#define BUTTON_CLICK_HEIGHT 49
struct ButtonStruct {
- double m_dXPos; // x positie
- double m_dYPos; // y positie
- double m_dCenterWidth; // breedte van middenstuk
- double m_dWidth; // totale breedte
- double m_dHeight; // totale hoogte
- int m_bPressed; // pressed or not
- int m_bHover; // mouse hovering or not
- int m_iType; // button type
+ int m_dXPos; // x positie
+ int m_dYPos; // y positie
+ int m_dCenterWidth; // breedte van middenstuk
+ int m_dWidth; // totale breedte
+ int m_dHeight; // totale hoogte
+ int m_bPressed; // pressed or not
+ int m_bHover; // mouse hovering or not
+ int m_iType; // button type
// button caption/title
char m_pcTitle[BUTTON_MAX_TITLE];
@@ -32,8 +32,12 @@ enum ButtonType {
BUTTON_LABEL
};
-struct ButtonStruct ButtonCreate(double f_dXPos, double f_dYPos, double f_dWidth, char *f_pcTitle, int f_iType);
+struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, int f_dHeight, char *f_pcTitle, int f_iType);
+int ButtonGetType(struct ButtonStruct *f_sButton);
void ButtonRender(struct ButtonStruct *f_sButton);
-void ButtonHover(struct ButtonStruct *f_sButton);
+void ButtonEnter(struct ButtonStruct *f_sButton);
+void ButtonExit(struct ButtonStruct *f_sButton);
+void ButtonPress(struct ButtonStruct *f_sButton);
+void ButtonRelease(struct ButtonStruct *f_sButton);
#endif
diff --git a/menu_demo/img/button01.bmp b/menu_demo/img/button01.bmp
deleted file mode 100644
index 5f9a3ba..0000000
--- a/menu_demo/img/button01.bmp
+++ /dev/null
Binary files differ
diff --git a/menu_demo/img/button_click_center.bmp b/menu_demo/img/button_click_center.bmp
index e8a9474..cc9b3d4 100644
--- a/menu_demo/img/button_click_center.bmp
+++ b/menu_demo/img/button_click_center.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_center_hover.bmp b/menu_demo/img/button_click_center_hover.bmp
index 94fe28d..70d8bb0 100644
--- a/menu_demo/img/button_click_center_hover.bmp
+++ b/menu_demo/img/button_click_center_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_left.bmp b/menu_demo/img/button_click_left.bmp
index 16e00d2..689d2ee 100644
--- a/menu_demo/img/button_click_left.bmp
+++ b/menu_demo/img/button_click_left.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_left_hover.bmp b/menu_demo/img/button_click_left_hover.bmp
index 16e00d2..d301a4a 100644
--- a/menu_demo/img/button_click_left_hover.bmp
+++ b/menu_demo/img/button_click_left_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_right.bmp b/menu_demo/img/button_click_right.bmp
index 9db52b9..bad3788 100644
--- a/menu_demo/img/button_click_right.bmp
+++ b/menu_demo/img/button_click_right.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_right_hover.bmp b/menu_demo/img/button_click_right_hover.bmp
index 9db52b9..bcc93aa 100644
--- a/menu_demo/img/button_click_right_hover.bmp
+++ b/menu_demo/img/button_click_right_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_radio.bmp b/menu_demo/img/button_radio.bmp
new file mode 100644
index 0000000..5ae06d4
--- /dev/null
+++ b/menu_demo/img/button_radio.bmp
Binary files differ
diff --git a/menu_demo/img/button_radio_hover.bmp b/menu_demo/img/button_radio_hover.bmp
new file mode 100644
index 0000000..abf0017
--- /dev/null
+++ b/menu_demo/img/button_radio_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_radio_pressed.bmp b/menu_demo/img/button_radio_pressed.bmp
new file mode 100644
index 0000000..6bfa30a
--- /dev/null
+++ b/menu_demo/img/button_radio_pressed.bmp
Binary files differ
diff --git a/menu_demo/img/images/photoshop/button01.psd b/menu_demo/img/images/photoshop/button01.psd
index cfb7aba..882d77b 100644
--- a/menu_demo/img/images/photoshop/button01.psd
+++ b/menu_demo/img/images/photoshop/button01.psd
Binary files differ
diff --git a/menu_demo/main.c b/menu_demo/main.c
index 3903002..37387d5 100644
--- a/menu_demo/main.c
+++ b/menu_demo/main.c
@@ -1,6 +1,6 @@
#ifdef G_OS_WIN32
-#define WIN32_LEAN_AND_MEAN 1
-#include <windows.h>
+ #define WIN32_LEAN_AND_MEAN 1
+ #include <windows.h>
#endif
#include <stdlib.h>
@@ -16,7 +16,6 @@
void init_gl(void)
{
- // do sumting
} // init_gl
@@ -25,7 +24,7 @@ void init_gl(void)
void render_scene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glClearColor(1, 1, 1, 0);
+ glClearColor(0.2, 1, 0.2, 1);
MenuRender();
@@ -65,7 +64,7 @@ void process_mouse(int button, int state, int x, int y)
void process_passive_mouse(int x, int y)
{
- process_mouse(0, 0, x, y);
+ process_mouse(-1, -1, x, y);
} // process_passive_mouse
diff --git a/menu_demo/menu.c b/menu_demo/menu.c
index 9a3c081..c08540e 100644
--- a/menu_demo/menu.c
+++ b/menu_demo/menu.c
@@ -3,9 +3,9 @@
#include <windows.h>
#endif
-#include <GL/gl.h>
-
#include <stdlib.h>
+#include <GL/gl.h>
+#include <GL/glut.h>
#include "menu.h"
#include "button.h"
@@ -34,12 +34,12 @@ int g_iWinHeight;
-void MenuAddButton(double f_dXPos, double f_dYPos, double f_dWidth, char *f_pcTitle, int f_iType)
+void MenuAddButton(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *f_pcTitle, int f_iType)
{
int i;
i = g_sMenuMain.m_iButtonCount;
- g_sMenuMain.m_sButtons[i] = ButtonCreate(f_dXPos, f_dYPos, f_dWidth, f_pcTitle, f_iType);
+ g_sMenuMain.m_sButtons[i] = ButtonCreate(f_dXPos, f_dYPos, f_dWidth, f_dHeight, f_pcTitle, f_iType);
i++;
g_sMenuMain.m_iButtonCount = i;
@@ -56,7 +56,8 @@ void MenuInit(int f_iWinWidth, int f_iWinHeight)
// init main menu
g_sMenuMain.m_eMenuId = MENU_MAIN;
- MenuAddButton(0, 0, 200, "Start", BUTTON_CLICK);
+ MenuAddButton(50, 50, 200, 100, "Start", BUTTON_CLICK);
+ MenuAddButton(200, 200, 180, 180, "Start", BUTTON_RADIO);
// init start menu
g_sMenuStart.m_eMenuId = MENU_START;
@@ -75,27 +76,34 @@ void MenuInit(int f_iWinWidth, int f_iWinHeight)
void MenuRender(void)
{
- int i = 0;
+ int i;
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
- glColor3d(1, 1, 1);
+ glColor4d(1, 1, 1, 1);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
- glOrtho(0, (GLfloat)g_iWinWidth, (GLfloat)g_iWinHeight, 0, 0, 1);
+ glOrtho(1, (GLfloat)g_iWinWidth, (GLfloat)g_iWinHeight, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
- // render the buttons on the current menu
+ glEnable(GL_BLEND);
+ //glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ // render the buttons (mask) on the current menu
+ i = 0;
while (i < g_pCurMenu->m_iButtonCount)
{
ButtonRender(&g_pCurMenu->m_sButtons[i]);
i++;
}
+ glDisable(GL_BLEND);
+
//restore the previous projection matrix
glMatrixMode(GL_PROJECTION);
@@ -120,8 +128,23 @@ void MenuMouseHandle(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYP
// f_iGlutState
// # GLUT_DOWN
// # GLUT_UP
+
+ // button released
+ if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_UP)
+ {
+ i = 0;
+ while (i < g_pCurMenu->m_iButtonCount)
+ {
+ if (ButtonGetType(&g_pCurMenu->m_sButtons[i]) == BUTTON_CLICK)
+ {
+ ButtonRelease(&g_pCurMenu->m_sButtons[i]);
+ }
+ i++;
+ }
+ }
// check if any button needs attention from the mouse
+ i = 0;
while (i < g_pCurMenu->m_iButtonCount)
{
l_dXPos = g_pCurMenu->m_sButtons[i].m_dXPos;
@@ -131,11 +154,17 @@ void MenuMouseHandle(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYP
if (l_dXPos <= f_iXPos && l_dXPos + l_iWidth >= f_iXPos &&l_dYPos <= f_iYPos && l_dYPos + l_iHeight >= f_iYPos)
{
- ButtonHover(&g_pCurMenu->m_sButtons[i]);
+ ButtonEnter(&g_pCurMenu->m_sButtons[i]);
+
+ // button pressed?
+ if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_DOWN)
+ {
+ ButtonPress(&g_pCurMenu->m_sButtons[i]);
+ }
}
- else
+ else // mouse leaves button
{
- g_pCurMenu->m_sButtons[i].m_bHover = FALSE;
+ ButtonExit(&g_pCurMenu->m_sButtons[i]);
}
i++;
}
diff --git a/menu_demo/menu_demo.ncb b/menu_demo/menu_demo.ncb
index 7bbfe19..fa09ce5 100644
--- a/menu_demo/menu_demo.ncb
+++ b/menu_demo/menu_demo.ncb
Binary files differ
diff --git a/menu_demo/menu_demo.suo b/menu_demo/menu_demo.suo
index 692ce8c..e89ac06 100644
--- a/menu_demo/menu_demo.suo
+++ b/menu_demo/menu_demo.suo
Binary files differ