home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 36 / #36-1.iso / quake / Files / md2 / src / inter.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-05-06  |  14.5 KB  |  618 lines

  1. /*****************************************************************
  2. Copyright (c) 1998 Jawed Karim <jkarim@students.uiuc.edu>
  3. All rights reserved.
  4.  
  5. This source code has been provided to you under the condition
  6. that you adhere to the following terms:
  7.  
  8. 1. YOU MAY USE THIS SOURCE CODE PRIVATELY WITHOUT RESTRICTIONS.
  9.  
  10. 2. REDISTRIBUTIONS OF MODIFICATIONS OF THIS PROGRAM IN BINARY OR
  11.    IN SOURCE CODE FORM ARE NOT PERMITTED.
  12.  
  13. 3. REDISTRIBUTIONS OF THIS SOURCE CODE ARE ONLY PERMITTED IF
  14.    THE SOURCE CODE REMAINS COMPLETELY UNCHANGED AND ALL THE
  15.    FILES WHICH WERE IN THE ORIGINAL DISTRIBUTION ARE INCLUDED.
  16.  
  17. 4. ALL SOFTWARE USING SECTIONS OF THIS SOURCE CODE MUST GIVE
  18.    EXPLICIT ACKNOWLEDGMENT TO JAWED KARIM IN THE PROGRAM
  19.    ITSELF AS WELL AS IN THE DOCUMENTATION.
  20.  
  21. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
  22. OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  23. WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  25. DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  27. GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. INTERRUPTION).
  29. *****************************************************************/
  30.  
  31. #include <stdio.h>
  32. #include <iostream.h>
  33.  
  34. #include <windows.h>
  35. #include <commctrl.h>
  36. #include <windowsx.h>
  37. #include <wininet.h>
  38.  
  39. #include <GL/gl.h>
  40. #include <GL/glu.h>
  41.  
  42. #include "resource.h"
  43. #include "fileio.h"
  44. #include "inter.h"
  45. #include "pcx.h"
  46. #include "slidebar.h"
  47. #include "md2.h"
  48. #include "wingl.h"
  49.  
  50. const int iRenderWindowX = 400;
  51. const int iRenderWindowY = 400;
  52.  
  53. CSlidebar frameSlider;
  54. CMD2 md2Model;
  55. COpenGLWindow glWindow (iRenderWindowX, iRenderWindowY);
  56. CImage imageTexture;
  57.  
  58. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  59. {
  60.     static char szAppName[] = "Quake2 Model Viewer" ;
  61.     MSG         msg ;
  62.     WNDCLASSEX  wndclass ;
  63.  
  64.     wndclass.cbSize        = sizeof (wndclass) ;
  65.     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  66.     wndclass.lpfnWndProc   = WndProc ;
  67.     wndclass.cbClsExtra    = 0 ;
  68.     wndclass.cbWndExtra    = 0 ;
  69.     wndclass.hInstance       = hInstanceGlobal = hInstance ;
  70.     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  71.     hIconGlobal = LoadIcon(hInstanceGlobal, MAKEINTRESOURCE(IDI_ICON1));
  72.     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  73.     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  74.     wndclass.lpszMenuName  = NULL ;
  75.     wndclass.lpszClassName = szAppName ;
  76.     wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
  77.  
  78.     RegisterClassEx (&wndclass) ;
  79.     LoadLibrary("RICHED32.DLL");
  80.     InitCommonControls();
  81.  
  82.     RegisterClassEx (&wndclass) ;
  83.  
  84.     wndclass.lpfnWndProc = GraphicsProc;
  85.     wndclass.cbWndExtra = 0;
  86.     wndclass.hIcon        = NULL;
  87.     wndclass.lpszClassName = "Graphics";
  88.     wndclass.hIconSm = NULL;
  89.     wndclass.hCursor = LoadCursor (NULL, IDC_CROSS) ;
  90.  
  91.     RegisterClassEx (&wndclass) ;
  92.  
  93.     hDialog = CreateDialog (hInstance, MAKEINTRESOURCE (IDD_MAINDIALOG), NULL, (DLGPROC)DlgProc);
  94.  
  95.     frameSlider.Initialize (GetDlgItem (hDialog, IDC_SLIDER));
  96.  
  97.     SendMessage (GetDlgItem (hDialog, IDC_TEXTURE), BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
  98.     SendMessage (GetDlgItem (hDialog, IDC_WIREFRAME), BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
  99.  
  100.     ShowWindow (hDialog, iCmdShow) ;
  101.     UpdateWindow (hDialog) ;
  102.  
  103.     while (GetMessage (&msg, NULL, 0, 0))
  104.     {
  105.         TranslateMessage (&msg) ;
  106.         DispatchMessage (&msg) ;
  107.     }
  108.     return msg.wParam ;
  109. }
  110.  
  111. LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  112. {
  113.     switch (iMsg)
  114.     {
  115.         case WM_DESTROY :
  116.             md2Model.Destroy ();
  117.             imageTexture.Destroy ();
  118.             PostQuitMessage (0) ;
  119.             return 0 ;
  120.  
  121.         case WM_QUERYDRAGICON:
  122.             return (LRESULT) hIconGlobal;
  123.     }
  124.  
  125.     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
  126. }
  127.  
  128. BOOL CALLBACK DlgProc (HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
  129. {
  130.     NM_UPDOWN *pUpDown;
  131.     char szLongFilename[255];
  132.     char szShortFilename[255];
  133.     int iState;
  134.  
  135.     switch (iMsg) {
  136.  
  137.         case WM_NOTIFY:
  138.  
  139.             pUpDown    = (NM_UPDOWN FAR *) lParam;
  140.  
  141.             switch (LOWORD (wParam)) {
  142.  
  143.                 case IDC_SPIN:
  144.  
  145.                     frameSlider.setFocus();
  146.  
  147.                     if (pUpDown->iDelta > 0)
  148.                         frameSlider.setPosition(frameSlider.getPosition() - 1);
  149.  
  150.                     if (pUpDown->iDelta < 0)
  151.                         frameSlider.setPosition(frameSlider.getPosition() + 1);
  152.  
  153.                     redraw (frameSlider.getPosition());
  154.  
  155.                     break;
  156.             }
  157.             return 0;
  158.  
  159.         case WM_HSCROLL:
  160.  
  161.             switch (LOWORD (wParam)) {
  162.  
  163.                 case TB_ENDTRACK:
  164.  
  165.                     redraw (frameSlider.getPosition());
  166.  
  167.                     break;
  168.  
  169.                 default:
  170.                     break;
  171.             } 
  172.  
  173.         case WM_INITDIALOG:
  174.             SendMessage (hDlg, WM_SETICON, TRUE, (LPARAM)hIconGlobal);
  175.             SendMessage (hDlg, WM_SETICON, FALSE, (LPARAM)hIconGlobal);
  176.  
  177.             return TRUE;
  178.  
  179.         case WM_PAINT:
  180.             return 0;
  181.  
  182.         case WM_COMMAND:
  183.  
  184.             if (HIWORD (wParam) == BN_CLICKED)
  185.             {
  186.                 iState = SendMessage (GetDlgItem (hDlg, IDC_WIREFRAME), BM_GETCHECK, 0, 0);
  187.                 if (iState == BST_CHECKED)
  188.                     render_mode = WIREFRAME;
  189.  
  190.                 iState = SendMessage (GetDlgItem (hDlg, IDC_TEXTURE), BM_GETCHECK, 0, 0);
  191.                 if (iState == BST_CHECKED)
  192.                     render_mode = TEXTURE;
  193.  
  194.                 if (((HWND)lParam) == (GetDlgItem (hDlg, IDC_WIREFRAME)) ||
  195.                     ((HWND)lParam) == (GetDlgItem (hDlg, IDC_TEXTURE)))
  196.                     ChangeRenderMode ();
  197.             }
  198.  
  199.             switch (LOWORD (wParam))
  200.             {
  201.                 case IDM_MENU_ITEM_HELP:
  202.                     DialogBox (hInstanceGlobal, MAKEINTRESOURCE (IDD_ABOUT), hDlg, (DLGPROC)HelpDlgProc);
  203.                     return 0;
  204.  
  205.                 case IDM_MENU_ITEM_EXIT: case WM_DESTROY:
  206.                     md2Model.Destroy();
  207.                     imageTexture.Destroy ();
  208.  
  209.                     PostQuitMessage (0);
  210.                     return TRUE;
  211.  
  212.                 case IDM_MENU_ITEM_RELOAD_PCX:
  213.  
  214.                     imageTexture.Destroy ();
  215.  
  216.                     if ((imageTexture.Read (imageTexture.m_szCurrentFile)) == 0)
  217.                     {
  218.                         imageTexture.Image2GLTexture ();
  219.  
  220.                         redraw (frameSlider.getPosition());
  221.                         init ();
  222.                     }
  223.                     else
  224.                         MessageBox (hDlg, "There was a problem loading the PCX file.", "File Error", MB_OK | MB_ICONEXCLAMATION);
  225.  
  226.                     return 0;
  227.  
  228.                 case IDM_MENU_ITEM_OPEN_PCX:
  229.                     szLongFilename[0] = '\0';
  230.                     szShortFilename[0] = '\0';
  231.  
  232.                     if (LoadPCXFileOpenDlg (hDialog, szLongFilename, szShortFilename) == TRUE) {
  233.  
  234.                         imageTexture.Destroy();
  235.  
  236.                         if ((imageTexture.Read (szLongFilename)) == 0)
  237.                         {
  238.                             imageTexture.Image2GLTexture ();
  239.  
  240.                             SendMessage (GetDlgItem (hDlg, IDC_WIREFRAME), BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
  241.  
  242.                             SendMessage (GetDlgItem (hDlg, IDC_TEXTURE), BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
  243.                             render_mode = TEXTURE;
  244.  
  245.                             init ();
  246.  
  247.                             EnableMenuItem (GetMenu (hDialog), IDM_MENU_ITEM_RELOAD_PCX, MF_ENABLED);
  248.                         }
  249.                         else
  250.                             MessageBox (hDlg, "There was a problem loading the PCX file.", "File Error", MB_OK | MB_ICONEXCLAMATION);
  251.                     }
  252.  
  253.                     return 0;
  254.  
  255.  
  256.                 case IDM_MENU_ITEM_OPEN:
  257.                     szLongFilename[0] = '\0';
  258.                     szShortFilename[0] = '\0';
  259.  
  260.                     if (LoadMD2FileOpenDlg (hDialog, szLongFilename, szShortFilename) == TRUE) {
  261.  
  262.                         md2Model.Destroy();
  263.                         imageTexture.Destroy ();
  264.  
  265.                         if (hGraphics != NULL)
  266.                             DestroyWindow (hGraphics);
  267.  
  268.                         if (md2Model.Read (szLongFilename)) {
  269.  
  270.                             hGraphics = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, "Graphics", NULL,
  271.                                 WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CAPTION,
  272.                                 390, 30, iRenderWindowX, iRenderWindowY,
  273.                                 hDlg, NULL, (HINSTANCE) GetWindowLong (hDlg, GWL_HINSTANCE), NULL) ;
  274.  
  275.                             frameSlider.setRange (0, md2Model.getnumberFrames() - 1);
  276.                             frameSlider.setPosition (0);
  277.  
  278.                             rot[0] = rot[1] = trans[0] = trans[1] = trans[2] = 0.0;
  279.  
  280.                             init();
  281.  
  282.                             EnableControls (1);
  283.  
  284.                         }
  285.                         else
  286.                             MessageBox (hDlg, "There was a problem loading the MD2 file.", "File Error", MB_OK | MB_ICONEXCLAMATION);
  287.                     }
  288.  
  289.                     return 0;
  290.             }
  291.             break;
  292.  
  293.         case WM_QUERYDRAGICON:
  294.             return (LRESULT) hIconGlobal;
  295.             return 0;
  296.     }
  297.     return FALSE ;
  298. }
  299.  
  300. void init (void)
  301. {
  302.     glClearColor (0.0, 0.0, 0.0, 0.0);
  303.  
  304.     glMatrixMode(GL_PROJECTION);
  305.     glLoadIdentity ();
  306.  
  307.     gluPerspective (40, 1, 40, 500);
  308.  
  309.     glMatrixMode(GL_MODELVIEW);
  310.     glLoadIdentity ();
  311.  
  312.     glTranslatef(0.0F, 0.0F, -70.0F);
  313.  
  314.     glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
  315.     glRotatef(90.0F, 0.0F, 0.0F, 1.0F);
  316.  
  317.     glEnable(GL_DEPTH_TEST);
  318.     glEnable(GL_LIGHT0);
  319.  
  320.     glCullFace(GL_BACK);
  321.  
  322.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  323.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  324.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  325.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  326.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  327.  
  328.  
  329.     glTexImage2D(GL_TEXTURE_2D, 0, 4, imageTexture.m_iscaledWidth, imageTexture.m_iscaledHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageTexture.glTexture);
  330.  
  331.     ChangeRenderMode ();
  332. }
  333.  
  334. void redraw (int frame)
  335. {
  336.     int i;
  337.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  338.  
  339.     glPushMatrix();
  340.  
  341.     glTranslatef(-trans[2], -trans[0], trans[1]);
  342.     glTranslatef(0, -trans[0], trans[1]);
  343.     glRotatef(-rot[0], 0.0f, 1.0f, 0.0f);
  344.     glRotatef(rot[1], 0.0f, 0.0f, 1.0f);
  345.  
  346.     for (i = 0; i < md2Model.getnumberTriangles(); i++) {
  347.         glBegin(GL_TRIANGLES);
  348.  
  349.         glTexCoord2f((md2Model.m_index_list[i].a_s)/(float)imageTexture.m_iWidth, (md2Model.m_index_list[i].a_t)/(float)imageTexture.m_iHeight);
  350.         glVertex3f (md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].a].x,
  351.                     md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].a].y,
  352.                     md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].a].z);
  353.  
  354.         glTexCoord2f((md2Model.m_index_list[i].b_s)/(float)imageTexture.m_iWidth, (md2Model.m_index_list[i].b_t)/(float)imageTexture.m_iHeight);
  355.         glVertex3f (md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].b].x,
  356.                     md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].b].y,
  357.                     md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].b].z);
  358.  
  359.         glTexCoord2f((md2Model.m_index_list[i].c_s)/(float)imageTexture.m_iWidth, (md2Model.m_index_list[i].c_t)/(float)imageTexture.m_iHeight);
  360.         glVertex3f (md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].c].x,
  361.                     md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].c].y,
  362.                     md2Model.m_frame_list[frame].vertex[md2Model.m_index_list[i].c].z);
  363.  
  364.         glEnd();
  365.     }
  366.  
  367.     glPopMatrix();
  368.     glFlush();
  369.     SwapBuffers(glWindow.GetDC());
  370. }
  371.  
  372. void ChangeRenderMode (void)
  373. {
  374.     if (render_mode == WIREFRAME) {
  375.         glDisable(GL_CULL_FACE);
  376.         glDisable(GL_TEXTURE_2D);
  377.         glDisable (GL_LIGHTING);
  378.  
  379.         glColor3f (0.0, 1.0, 0.0);
  380.         glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
  381.     }
  382.     else if (render_mode == TEXTURE) {
  383.         glEnable(GL_CULL_FACE);
  384.         glEnable(GL_TEXTURE_2D);
  385.         glDisable (GL_LIGHTING);
  386.  
  387.         glColor3f (0.0F, 0.0F, 0.0F);
  388.         glPolygonMode (GL_FRONT, GL_FILL);
  389.         glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  390.     }
  391.  
  392.     redraw (frameSlider.getPosition());
  393. }
  394.  
  395. void resize (int x, int y)
  396. {
  397.  
  398.     glViewport(0, 0, x, y);
  399. }
  400.  
  401. static void update (int state, int ox, int nx, int oy, int ny)
  402. {
  403.     int dx = ox - nx;
  404.     int dy = ny - oy;
  405.  
  406.     switch(state) {
  407.         case PAN:
  408.             trans[0] -= dx / 5.0f;
  409.             trans[1] -= dy / 5.0f;
  410.             break;
  411.  
  412.         case ROTATE:
  413.             rot[0] += (dy * 180.0f) / 500.0f;
  414.             rot[1] -= (dx * 180.0f) / 500.0f;
  415.             #define clamp(x) x = x > 360.0f ? x-360.0f : x < -360.0f ? x+=360.0f : x
  416.             clamp(rot[0]);
  417.             clamp(rot[1]);
  418.             break;
  419.     
  420.         case ZOOM:
  421.             trans[2] -= (dx+dy) / 4.0f;
  422.             break;
  423.     }
  424. }
  425.  
  426. LRESULT APIENTRY GraphicsProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  427. {
  428.     static int omx, omy, mx, my;
  429.     static GLuint    state   = 0;
  430.  
  431.     int x, y;
  432.  
  433.     switch (message) {
  434.  
  435.         case WM_LBUTTONDOWN:
  436.         case WM_RBUTTONDOWN:
  437.             SetCapture(hGraphics);
  438.             mx = LOWORD(lParam);
  439.             my = HIWORD(lParam);
  440.  
  441.             if (message == WM_LBUTTONDOWN)
  442.                 state = PAN;
  443.  
  444.             if (message == WM_RBUTTONDOWN)
  445.                 state = ROTATE;
  446.  
  447.             if ((wParam & MK_RBUTTON) && (wParam & MK_LBUTTON))
  448.                 state = ZOOM;
  449.  
  450.             break;
  451.  
  452.         case WM_LBUTTONUP:
  453.         case WM_RBUTTONUP:
  454.             ReleaseCapture();
  455.             state = 0;
  456.             break;
  457.  
  458.         case WM_MOUSEMOVE:
  459.             if (state) {
  460.                 omx = mx;
  461.                 omy = my;
  462.                 mx = LOWORD(lParam);
  463.                 my = HIWORD(lParam);
  464.                 if(mx & 1 << 15) mx -= (1 << 16);
  465.                 if(my & 1 << 15) my -= (1 << 16);
  466.                 update (state, omx, mx, omy, my);
  467.                 PostMessage(hGraphics, WM_PAINT, 0, 0);
  468.             }
  469.             break;
  470.  
  471.         case WM_CREATE:
  472.             glWindow.Create (hWnd);
  473.  
  474.             break;
  475.  
  476.         case WM_DESTROY:
  477.             glWindow.Destroy (hWnd);
  478.  
  479.             EnableControls (0);
  480.             break;
  481.  
  482.         case WM_SIZE:
  483.             x = LOWORD (lParam);
  484.             y = HIWORD (lParam);
  485.  
  486.             if (glWindow.GLRCValid()) {
  487.  
  488.                 glWindow.SetSize (x, y);
  489.  
  490.                 resize(x, y);
  491.                 return 0;
  492.             }
  493.  
  494.             break;
  495.  
  496.         case WM_PALETTECHANGED:
  497.             if (glWindow.GLRCValid() && glWindow.PaletteValid() && (HWND) wParam != hWnd) {
  498.  
  499.                 glWindow.RedoPalette ();
  500.                 redraw(frameSlider.getPosition());
  501.  
  502.                 break;
  503.             }
  504.             break;
  505.  
  506.         case WM_QUERYNEWPALETTE:
  507.  
  508.             if (glWindow.GLRCValid() && glWindow.PaletteValid()) {
  509.  
  510.                 glWindow.RedoPalette ();
  511.                 redraw(frameSlider.getPosition());
  512.  
  513.                 return TRUE;
  514.             }
  515.             break;
  516.  
  517.         case WM_PAINT:
  518.         {
  519.             PAINTSTRUCT ps;
  520.             BeginPaint(hWnd, &ps);
  521.  
  522.             if (glWindow.GLRCValid()) {
  523.                 redraw(frameSlider.getPosition());
  524.             }
  525.  
  526.             EndPaint(hWnd, &ps);
  527.             return 0;
  528.         }
  529.         break;
  530.  
  531.         case WM_KEYDOWN :
  532.  
  533.             switch (wParam)
  534.             {
  535.                 case VK_HOME :
  536.                     rot[0] = rot[1] = trans[0] = trans[1] = trans[2] = 0.0;
  537.                     break;
  538.  
  539.                 case VK_RIGHT:
  540.                     update (ROTATE, 0, 10, 0, 0);
  541.                     break;
  542.  
  543.                 case VK_LEFT:
  544.                     update (ROTATE, 0, -10, 0, 0);
  545.                     break;
  546.  
  547.                 case VK_UP:
  548.                     update (ROTATE, 0, 0, 0, -10);
  549.                     break;
  550.  
  551.                 case VK_DOWN:
  552.                     update (ROTATE, 0, 0, 0, 10);
  553.                     break;
  554.  
  555.                 case VK_ADD:
  556.                     trans[2] += 10;
  557.                     break;
  558.  
  559.                 case VK_SUBTRACT:
  560.                     trans[2] -= 10;
  561.                     break;
  562.             }
  563.             redraw (frameSlider.getPosition());
  564.  
  565.             return 0;
  566.  
  567.         default:
  568.             break;
  569.     }
  570.     return DefWindowProc(hWnd, message, wParam, lParam);
  571. }
  572.  
  573. BOOL CALLBACK HelpDlgProc (HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
  574. {
  575.     switch (iMsg)
  576.     {
  577.         case WM_COMMAND :
  578.  
  579.             switch (LOWORD (wParam))
  580.             {
  581.                 case IDCANCEL :
  582.                 case IDOK :
  583.  
  584.                     EndDialog (hDlg, 0) ;
  585.                     return TRUE ;
  586.             }
  587.             break ;
  588.     }
  589.     return FALSE ;
  590. }
  591.  
  592. void EnableControls (int status)
  593. {
  594.     if (status == 0) {
  595.  
  596.         EnableWindow (GetDlgItem (hDialog, IDC_SLIDER), FALSE);
  597.         EnableWindow (GetDlgItem (hDialog, IDC_SPIN), FALSE);
  598.  
  599.         EnableWindow (GetDlgItem (hDialog, IDC_WIREFRAME), FALSE);
  600.         EnableWindow (GetDlgItem (hDialog, IDC_TEXTURE), FALSE);
  601.  
  602.         EnableMenuItem (GetMenu (hDialog), IDM_MENU_ITEM_OPEN_PCX, MF_GRAYED);
  603.  
  604.         EnableMenuItem (GetMenu (hDialog), IDM_MENU_ITEM_RELOAD_PCX, MF_GRAYED);
  605.     }
  606.  
  607.     if (status == 1) {
  608.  
  609.         EnableWindow (GetDlgItem (hDialog, IDC_SLIDER), TRUE);
  610.         EnableWindow (GetDlgItem (hDialog, IDC_SPIN), TRUE);
  611.  
  612.         EnableWindow (GetDlgItem (hDialog, IDC_WIREFRAME), TRUE);
  613.         EnableWindow (GetDlgItem (hDialog, IDC_TEXTURE), TRUE);
  614.  
  615.         EnableMenuItem (GetMenu (hDialog), IDM_MENU_ITEM_OPEN_PCX, MF_ENABLED);
  616.     }
  617. }
  618.