From 92f2ef5fa1b80c6491ce46eab0ab0908eb9be9cc Mon Sep 17 00:00:00 2001 From: Wilrik de Loose Date: Mon, 21 Apr 2008 12:01:00 +0000 Subject: Radio buttons toegevoegd. --- menu_demo/Debug/BuildLog.htm | Bin 7078 -> 7086 bytes menu_demo/Debug/main.obj | Bin 13527 -> 13555 bytes menu_demo/Debug/menu.obj | Bin 12620 -> 13547 bytes menu_demo/Debug/menu_demo.exe | Bin 520192 -> 520192 bytes menu_demo/Debug/menu_demo.ilk | Bin 1223132 -> 1217312 bytes menu_demo/Debug/menu_demo.pdb | Bin 2100224 -> 2083840 bytes menu_demo/Debug/mt.dep | 2 +- menu_demo/Debug/vc80.idb | Bin 125952 -> 125952 bytes menu_demo/Debug/vc80.pdb | Bin 69632 -> 61440 bytes menu_demo/bitmap.c | 32 +++-- menu_demo/button.c | 210 +++++++++++++++++++++++----- menu_demo/button.h | 24 ++-- menu_demo/img/button01.bmp | Bin 162230 -> 0 bytes menu_demo/img/button_click_center.bmp | Bin 250 -> 488 bytes menu_demo/img/button_click_center_hover.bmp | Bin 250 -> 488 bytes menu_demo/img/button_click_left.bmp | Bin 3778 -> 21656 bytes menu_demo/img/button_click_left_hover.bmp | Bin 3778 -> 21656 bytes menu_demo/img/button_click_right.bmp | Bin 3778 -> 21656 bytes menu_demo/img/button_click_right_hover.bmp | Bin 3778 -> 21656 bytes menu_demo/img/button_radio.bmp | Bin 0 -> 129656 bytes menu_demo/img/button_radio_hover.bmp | Bin 0 -> 129656 bytes menu_demo/img/button_radio_pressed.bmp | Bin 0 -> 129656 bytes menu_demo/img/images/photoshop/button01.psd | Bin 133709 -> 188279 bytes menu_demo/main.c | 9 +- menu_demo/menu.c | 53 +++++-- menu_demo/menu_demo.ncb | Bin 7891968 -> 7891968 bytes menu_demo/menu_demo.suo | Bin 20992 -> 24576 bytes 27 files changed, 259 insertions(+), 71 deletions(-) delete mode 100644 menu_demo/img/button01.bmp create mode 100644 menu_demo/img/button_radio.bmp create mode 100644 menu_demo/img/button_radio_hover.bmp create mode 100644 menu_demo/img/button_radio_pressed.bmp diff --git a/menu_demo/Debug/BuildLog.htm b/menu_demo/Debug/BuildLog.htm index d51a82d..e8fdbeb 100644 Binary files a/menu_demo/Debug/BuildLog.htm and b/menu_demo/Debug/BuildLog.htm differ diff --git a/menu_demo/Debug/main.obj b/menu_demo/Debug/main.obj index 3c8ba3d..f85d870 100644 Binary files a/menu_demo/Debug/main.obj and b/menu_demo/Debug/main.obj differ diff --git a/menu_demo/Debug/menu.obj b/menu_demo/Debug/menu.obj index 6efb995..f352396 100644 Binary files a/menu_demo/Debug/menu.obj and b/menu_demo/Debug/menu.obj differ diff --git a/menu_demo/Debug/menu_demo.exe b/menu_demo/Debug/menu_demo.exe index 2b07479..57aaeac 100644 Binary files a/menu_demo/Debug/menu_demo.exe and b/menu_demo/Debug/menu_demo.exe differ diff --git a/menu_demo/Debug/menu_demo.ilk b/menu_demo/Debug/menu_demo.ilk index 4293966..b17d0ca 100644 Binary files a/menu_demo/Debug/menu_demo.ilk and b/menu_demo/Debug/menu_demo.ilk differ diff --git a/menu_demo/Debug/menu_demo.pdb b/menu_demo/Debug/menu_demo.pdb index c394ffd..2a06f6d 100644 Binary files a/menu_demo/Debug/menu_demo.pdb and b/menu_demo/Debug/menu_demo.pdb 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 Binary files a/menu_demo/Debug/vc80.idb and b/menu_demo/Debug/vc80.idb differ diff --git a/menu_demo/Debug/vc80.pdb b/menu_demo/Debug/vc80.pdb index d4df68e..6ade11b 100644 Binary files a/menu_demo/Debug/vc80.pdb and b/menu_demo/Debug/vc80.pdb 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 - #define GL_BGR 0x80E0 + #define GL_BGR 0x80E0 + #define GL_BGRA 0x80E1 #endif #include @@ -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 Binary files a/menu_demo/img/button01.bmp and /dev/null differ diff --git a/menu_demo/img/button_click_center.bmp b/menu_demo/img/button_click_center.bmp index e8a9474..cc9b3d4 100644 Binary files a/menu_demo/img/button_click_center.bmp and b/menu_demo/img/button_click_center.bmp 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 Binary files a/menu_demo/img/button_click_center_hover.bmp and b/menu_demo/img/button_click_center_hover.bmp differ diff --git a/menu_demo/img/button_click_left.bmp b/menu_demo/img/button_click_left.bmp index 16e00d2..689d2ee 100644 Binary files a/menu_demo/img/button_click_left.bmp and b/menu_demo/img/button_click_left.bmp 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 Binary files a/menu_demo/img/button_click_left_hover.bmp and b/menu_demo/img/button_click_left_hover.bmp differ diff --git a/menu_demo/img/button_click_right.bmp b/menu_demo/img/button_click_right.bmp index 9db52b9..bad3788 100644 Binary files a/menu_demo/img/button_click_right.bmp and b/menu_demo/img/button_click_right.bmp 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 Binary files a/menu_demo/img/button_click_right_hover.bmp and b/menu_demo/img/button_click_right_hover.bmp differ diff --git a/menu_demo/img/button_radio.bmp b/menu_demo/img/button_radio.bmp new file mode 100644 index 0000000..5ae06d4 Binary files /dev/null and b/menu_demo/img/button_radio.bmp 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 Binary files /dev/null and b/menu_demo/img/button_radio_hover.bmp 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 Binary files /dev/null and b/menu_demo/img/button_radio_pressed.bmp differ diff --git a/menu_demo/img/images/photoshop/button01.psd b/menu_demo/img/images/photoshop/button01.psd index cfb7aba..882d77b 100644 Binary files a/menu_demo/img/images/photoshop/button01.psd and b/menu_demo/img/images/photoshop/button01.psd 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 + #define WIN32_LEAN_AND_MEAN 1 + #include #endif #include @@ -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 #endif -#include - #include +#include +#include #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 Binary files a/menu_demo/menu_demo.ncb and b/menu_demo/menu_demo.ncb differ diff --git a/menu_demo/menu_demo.suo b/menu_demo/menu_demo.suo index 692ce8c..e89ac06 100644 Binary files a/menu_demo/menu_demo.suo and b/menu_demo/menu_demo.suo differ -- cgit v0.12