WIN_Z.CPP (4892B)
1 /* 2 =========================================================================== 3 Copyright (C) 1999-2005 Id Software, Inc. 4 5 This file is part of Quake III Arena source code. 6 7 Quake III Arena source code is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 2 of the License, 10 or (at your option) any later version. 11 12 Quake III Arena source code is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with Foobar; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 =========================================================================== 21 */ 22 // win_cam.c -- windows specific camera view code 23 24 #include "stdafx.h" 25 #include "qe3.h" 26 27 static HDC s_hdcZ; 28 static HGLRC s_hglrcZ; 29 30 /* 31 ============ 32 WZ_WndProc 33 ============ 34 */ 35 LONG WINAPI WZ_WndProc ( 36 HWND hWnd, 37 UINT uMsg, 38 WPARAM wParam, 39 LPARAM lParam) 40 { 41 int fwKeys, xPos, yPos; 42 RECT rect; 43 44 GetClientRect(hWnd, &rect); 45 46 switch (uMsg) 47 { 48 49 case WM_DESTROY: 50 QEW_StopGL( hWnd, s_hglrcZ, s_hdcZ ); 51 return 0; 52 53 case WM_CREATE: 54 s_hdcZ = GetDC(hWnd); 55 QEW_SetupPixelFormat( s_hdcZ, false); 56 if ( ( s_hglrcZ = wglCreateContext( s_hdcZ ) ) == 0 ) 57 Error( "wglCreateContext in WZ_WndProc failed" ); 58 59 if (!wglMakeCurrent( s_hdcZ, s_hglrcZ )) 60 Error ("wglMakeCurrent in WZ_WndProc failed"); 61 62 if (!wglShareLists( g_qeglobals.d_hglrcBase, s_hglrcZ ) ) 63 Error( "wglShareLists in WZ_WndProc failed" ); 64 return 0; 65 66 case WM_PAINT: 67 { 68 PAINTSTRUCT ps; 69 70 BeginPaint(hWnd, &ps); 71 72 if ( !wglMakeCurrent( s_hdcZ, s_hglrcZ ) ) 73 Error ("wglMakeCurrent failed"); 74 QE_CheckOpenGLForErrors(); 75 76 Z_Draw (); 77 SwapBuffers(s_hdcZ); 78 79 EndPaint(hWnd, &ps); 80 } 81 return 0; 82 83 84 case WM_KEYDOWN: 85 QE_KeyDown (wParam); 86 return 0; 87 88 case WM_MBUTTONDOWN: 89 case WM_RBUTTONDOWN: 90 case WM_LBUTTONDOWN: 91 if (GetTopWindow(g_qeglobals.d_hwndMain) != hWnd) 92 BringWindowToTop(hWnd); 93 94 SetFocus( g_qeglobals.d_hwndZ ); 95 SetCapture( g_qeglobals.d_hwndZ ); 96 fwKeys = wParam; // key flags 97 xPos = (short)LOWORD(lParam); // horizontal position of cursor 98 yPos = (short)HIWORD(lParam); // vertical position of cursor 99 yPos = (int)rect.bottom - 1 - yPos; 100 Z_MouseDown (xPos, yPos, fwKeys); 101 return 0; 102 103 case WM_MBUTTONUP: 104 case WM_RBUTTONUP: 105 case WM_LBUTTONUP: 106 fwKeys = wParam; // key flags 107 xPos = (short)LOWORD(lParam); // horizontal position of cursor 108 yPos = (short)HIWORD(lParam); // vertical position of cursor 109 yPos = (int)rect.bottom - 1 - yPos; 110 Z_MouseUp (xPos, yPos, fwKeys); 111 if (! (fwKeys & (MK_LBUTTON|MK_RBUTTON|MK_MBUTTON))) 112 ReleaseCapture (); 113 return 0; 114 115 case WM_GETMINMAXINFO: 116 { 117 MINMAXINFO *pmmi = (LPMINMAXINFO) lParam; 118 119 pmmi->ptMinTrackSize.x = ZWIN_WIDTH; 120 return 0; 121 } 122 123 case WM_MOUSEMOVE: 124 fwKeys = wParam; // key flags 125 xPos = (short)LOWORD(lParam); // horizontal position of cursor 126 yPos = (short)HIWORD(lParam); // vertical position of cursor 127 yPos = (int)rect.bottom - 1 - yPos; 128 Z_MouseMoved (xPos, yPos, fwKeys); 129 return 0; 130 131 case WM_SIZE: 132 z.width = rect.right; 133 z.height = rect.bottom; 134 InvalidateRect( g_qeglobals.d_hwndZ, NULL, false); 135 return 0; 136 137 case WM_NCCALCSIZE:// don't let windows copy pixels 138 DefWindowProc (hWnd, uMsg, wParam, lParam); 139 return WVR_REDRAW; 140 141 case WM_KILLFOCUS: 142 case WM_SETFOCUS: 143 SendMessage( hWnd, WM_NCACTIVATE, uMsg == WM_SETFOCUS, 0 ); 144 return 0; 145 146 case WM_CLOSE: 147 /* call destroy window to cleanup and go away */ 148 DestroyWindow (hWnd); 149 return 0; 150 } 151 152 return DefWindowProc (hWnd, uMsg, wParam, lParam); 153 } 154 155 156 /* 157 ============== 158 WZ_Create 159 ============== 160 */ 161 void WZ_Create (HINSTANCE hInstance) 162 { 163 WNDCLASS wc; 164 memset (&wc, 0, sizeof(wc)); 165 wc.style = CS_NOCLOSE; 166 wc.lpfnWndProc = (WNDPROC)WZ_WndProc; 167 wc.cbClsExtra = 0; 168 wc.cbWndExtra = 0; 169 wc.hInstance = hInstance; 170 wc.hIcon = 0; 171 wc.hCursor = LoadCursor (NULL,IDC_ARROW); 172 wc.hbrBackground = NULL; 173 wc.lpszMenuName = NULL; 174 wc.lpszClassName = Z_WINDOW_CLASS; 175 176 if (!RegisterClass (&wc) ) 177 Error ("WCam_Register: failed"); 178 179 g_qeglobals.d_hwndZ = CreateWindow (Z_WINDOW_CLASS , 180 "Z", 181 QE3_STYLE, 182 0,20,ZWIN_WIDTH,screen_height-38, // size 183 g_qeglobals.d_hwndMain, // parent 184 0, // no menu 185 hInstance, 186 NULL); 187 if (!g_qeglobals.d_hwndZ) 188 Error ("Couldn't create zwindow"); 189 190 LoadWindowState(g_qeglobals.d_hwndZ, "zwindow"); 191 ShowWindow (g_qeglobals.d_hwndZ, SW_SHOWDEFAULT); 192 }