3dPageBackground.cpp
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:9k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // C3dPageBackground.cpp : implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "glOOP.h"
  21. #include "MyColorPaletteWnd.h"
  22. #include "3dObjectDialog.h"
  23. #include "3dBackgroundDialog.h"
  24. #include "EditColorDlg.h"
  25. #include "EditTextureDlg.h"
  26. #ifdef _DEBUG
  27. #undef THIS_FILE
  28. static char BASED_CODE THIS_FILE[] = __FILE__;
  29. #endif
  30. //////////////////////////////////////////////////////////////////
  31. // C3dPageBackground
  32. IMPLEMENT_DYNCREATE(C3dPageBackground, CPropertyPage)
  33. /////////////////////////////////////////////////////////////////////////////
  34. // C3dPageBackground dialog construction
  35. C3dPageBackground::C3dPageBackground()
  36. : CPropertyPage(C3dPageBackground::IDD)
  37. {
  38. //{{AFX_DATA_INIT(C3dPageBackground)
  39. m_szBkgndFileName = _T("<None>");
  40. //}}AFX_DATA_INIT
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. // C3dPageBackground Destructor
  44. C3dPageBackground::~C3dPageBackground()
  45. {
  46. }
  47. void C3dPageBackground::DoDataExchange(CDataExchange* pDX)
  48. {
  49. CPropertyPage::DoDataExchange(pDX);
  50. //{{AFX_DATA_MAP(C3dPageBackground)
  51. DDX_Control(pDX, IDC_COLOR_COMBO, m_ColorCombo);
  52. DDX_Text(pDX, IDC_IMAGE_NAME, m_szBkgndFileName);
  53. //}}AFX_DATA_MAP
  54. }
  55. BEGIN_MESSAGE_MAP(C3dPageBackground, CPropertyPage)
  56. //{{AFX_MSG_MAP(C3dPageBackground)
  57. ON_CBN_SELCHANGE(IDC_COLOR_COMBO, OnSelchangeColorCombo)
  58. ON_BN_CLICKED(IDC_BUTTON_COLOR_WND, OnButtonColorWnd)
  59. ON_WM_DRAWITEM()
  60. ON_BN_CLICKED(IDC_TEXTURE_OPEN, OnTextureOpen)
  61. ON_BN_CLICKED(IDC_TEXTURE_EDIT, OnTextureEdit)
  62. ON_BN_CLICKED(IDC_TEXTURE_REMOVE, OnTextureRemove)
  63. //}}AFX_MSG_MAP
  64. END_MESSAGE_MAP()
  65. /////////////////////////////////////////////////////////////////////////////
  66. // C3dPageBackground message handlers
  67. BOOL C3dPageBackground::OnInitDialog() 
  68. {
  69. // let the base class do the default work
  70. CPropertyPage::OnInitDialog();
  71. // Create the owner drawn button color window
  72. CRect rect;
  73. GetDlgItem(IDC_BUTTON_COLOR_WND)->GetWindowRect(&rect);
  74. ScreenToClient(&rect);
  75. // Create the 'Selected Color' window
  76. m_wndBkgndColor.Create(NULL, // lpszClassName
  77.  NULL, // lpszWindowName
  78.  WS_CHILD | WS_VISIBLE |// dwStyle
  79.  WS_DLGFRAME,
  80.  rect, // rect
  81.  this, // CWnd* pParentWnd
  82.  IDC_BUTTON_COLOR_WND, // UINT  nID
  83.  0); // pContext
  84. // Fill the combo box with all colors in the list
  85. m_pWorld->m_ColorList.LoadComboBox(&m_ColorCombo, &m_pWorld->m_BackgroundColor);
  86. // If our 3dWorld has a background Texture map, copy its name to
  87. // the CEdit box.
  88. if(m_pWorld->m_pBkgndTexture)
  89. {
  90. if(m_pWorld->m_pBkgndTexture->m_szFileName.GetLength())
  91. m_szBkgndFileName = m_pWorld->m_pBkgndTexture->m_szFileName;
  92. }
  93. // Dialog box is being initialized (FALSE)
  94. // or data is being retrieved (TRUE).
  95. UpdateData(FALSE);
  96. return TRUE;  // return TRUE unless you set the focus to a control
  97.               // EXCEPTION: OCX Property Pages should return FALSE
  98. }
  99. void C3dPageBackground::OnOK() 
  100. {
  101. // Get the dialog data
  102. UpdateData(TRUE);
  103. // Set the Objects Translate..
  104. // m_pObject->m_fTranslate[0] = m_fTranslateX;
  105. // m_pObject->m_fTranslate[1] = m_fTranslateY;
  106. // m_pObject->m_fTranslate[2] = m_fTranslateZ;
  107. CPropertyPage::OnOK();
  108. }
  109. void C3dPageBackground::OnSelchangeColorCombo() 
  110. {
  111. C3dColor* pColor;
  112. // Get the zero-based index of the item selected
  113. int index = m_ColorCombo.GetCurSel();
  114. if(index == CB_ERR)
  115. return;
  116. // Cast the user selected list box items' lParam to
  117. // a C3dColor pointer..
  118. pColor = (C3dColor*)m_ColorCombo.GetItemData(index);
  119. if(pColor)
  120. {
  121. // Set the world's background color and name, then 
  122. // and paint the color button window
  123. m_pWorld->m_BackgroundColor.SetColor4fv(pColor);
  124. m_pWorld->m_BackgroundColor.m_szName = pColor->m_szName;
  125. PaintButtonWnd();
  126. }
  127. }
  128. void C3dPageBackground::OnButtonColorWnd() 
  129. {
  130. if(m_pWorld) 
  131. {
  132. C3dColor cColor;
  133. cColor.SetColor4fv(&m_pWorld->m_BackgroundColor);
  134. // Create the dialog
  135. CEditColorDlg colorDlg(&m_pWorld->m_ColorList, &cColor, this);
  136. // Invoke the modal dialog box and return the
  137. // dialog-box result when done.
  138. if(colorDlg.DoModal() == IDOK)
  139. {
  140. // Save any changes the user may have made
  141. m_pWorld->m_BackgroundColor.SetColor4fv(&colorDlg.m_Color);
  142. PaintButtonWnd();
  143. }
  144. }
  145. }
  146. void C3dPageBackground::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
  147. {
  148. // TODO: Add your message handler code here and/or call default
  149. CPropertyPage::OnDrawItem(nIDCtl, lpDrawItemStruct);
  150. if(nIDCtl == IDC_BUTTON_COLOR_WND)
  151. PaintButtonWnd();
  152. }
  153. void C3dPageBackground::PaintButtonWnd()
  154. {
  155. CRect rect; // window rect
  156. CDC* pDC; // pointer to a device context
  157. // Get the size of the color button window
  158. m_wndBkgndColor.GetWindowRect(&rect);
  159. // Get a pointer to the windows device context
  160. pDC = m_wndBkgndColor.GetDC();
  161. if(pDC && m_pWorld)
  162. {
  163. // Since this is an owner drawn button and CPropertyPage
  164. // will not accept extended window attributes, we will
  165. // draw the border for the button, then the selected color.
  166. /*
  167. // Draw shading highlights
  168. pDC->FillSolidRect(0,
  169.    0,
  170.    rect.right-rect.left,
  171.    rect.bottom-rect.top,
  172.    COLORREF RGB(96, 96, 96)); // dark gray
  173. // Draw box shading
  174. pDC->FillSolidRect(0,
  175.    0,
  176.    (rect.right-rect.left)-2,
  177.    (rect.bottom-rect.top)-2,
  178.    COLORREF RGB(239, 239, 239));// very light gray
  179. // Draw shading in lower left corner
  180. pDC->SetPixel(1, rect.bottom-1,
  181.    COLORREF RGB(239, 239, 239)); // very light gray
  182. // Draw shading in top right corner
  183. pDC->SetPixel(rect.right-1, 1,
  184.    COLORREF RGB(239, 239, 239)); // very light gray
  185. */
  186. // Draw the box color
  187. pDC->FillSolidRect(0,
  188.    0,
  189.    rect.right-rect.left,
  190.    rect.bottom-rect.top,
  191.    COLORREF RGB(m_pWorld->m_BackgroundColor.m_fColor[0]*255,
  192. m_pWorld->m_BackgroundColor.m_fColor[1]*255,
  193. m_pWorld->m_BackgroundColor.m_fColor[2]*255));
  194. }
  195. ReleaseDC(pDC);
  196. }
  197. void C3dPageBackground::OnTextureOpen() 
  198. {
  199. CFileDialog fileDlg(TRUE, NULL, NULL);
  200. fileDlg.m_ofn.lpstrFilter = "Texture Files (*.bmp)*.bmpDIB Files (*.dib)*.dibAVI Files (*.avi)*.aviAll Files (*.*)*.*";
  201. fileDlg.m_ofn.lpstrTitle = "Open Texture Map";
  202. if(!m_pWorld)
  203. return;
  204. int retn = fileDlg.DoModal();
  205. if(retn == IDOK) {
  206. CString szFile = fileDlg.GetFileName();
  207. CString szPath = fileDlg.GetPathName();
  208. CString szFileExt = fileDlg.GetFileExt();
  209. if(szFileExt.Compare("bmp") == 0 ||
  210.    szFileExt.Compare("dib") == 0 ||
  211.    szFileExt.Compare("avi") == 0)
  212. {
  213. if(m_pWorld->AddTexture(szPath.GetBuffer(128)))
  214. {
  215. // Set the magnification filter to nearest for clearest
  216. // image quality
  217. m_pWorld->m_pBkgndTexture->m_iMagfilter = GL_NEAREST;
  218. // }
  219. // if(m_pWorld->m_pBkgndTexture->OpenTextureMap(szPath.GetBuffer(128), the3dEngine.m_hPalette))
  220. // {
  221. m_szBkgndFileName = szPath;
  222. // Dialog box is being initialized (FALSE)
  223. // or data is being retrieved (TRUE).
  224. UpdateData(FALSE);
  225. }
  226. }
  227. else
  228. AfxMessageBox("Unsupported File Extension!  Select files with either 'bmp' or 'dib' extensions.", MB_OK, NULL);
  229. }
  230. }
  231. void C3dPageBackground::OnTextureEdit() 
  232. {
  233. // Get a pointer to our 3dWorld background texture
  234. if(m_pWorld)
  235. {
  236. if(m_pWorld->m_pBkgndTexture)
  237. {
  238. CTexture* pTexture = m_pWorld->m_pBkgndTexture;
  239. ASSERT(pTexture);
  240. CEditTextureDlg textureDlg(pTexture, CWnd::GetActiveWindow());
  241. textureDlg.DoModal();
  242. // Force a repaint of the window
  243. pTexture->m_bApplyImage = TRUE;
  244. }
  245. else
  246. AfxMessageBox("There are no background textures to edit!", MB_OK, 0);
  247. }
  248. }
  249. void C3dPageBackground::OnTextureRemove() 
  250. {
  251. if(m_pWorld)
  252. {
  253. if(m_pWorld->m_pBkgndTexture) {
  254. // Delete the background texture map
  255. m_pWorld->DeleteTexture();
  256. m_szBkgndFileName = _T("<None>");
  257. // Dialog box is being initialized (FALSE)
  258. // or data is being retrieved (TRUE).
  259. UpdateData(FALSE);
  260. }
  261. }
  262. }