Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // G4Win32 implementation 27 // 28 // Original author: G.Barrand, 1998 29 // -------------------------------------------------------------------- 30 31 #include "G4Win32.hh" 32 33 #include "G4ios.hh" 34 35 static char className[] = "G4Win32"; 36 37 G4Win32* G4Win32::instance = NULL; 38 39 static G4bool Win32Inited = false; 40 static HWND topWindow = NULL; 41 /***************************************************************************/ 42 G4Win32* G4Win32::getInstance() 43 /***************************************************************************/ 44 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 45 { 46 if (instance == NULL) { 47 instance = new G4Win32(); 48 } 49 return instance; 50 } 51 /***************************************************************************/ 52 G4Win32::G4Win32() 53 /***************************************************************************/ 54 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 55 { 56 if (Win32Inited == false) { // Should be Done once. 57 58 WNDCLASS wc; 59 wc.style = CS_HREDRAW | CS_VREDRAW; 60 wc.lpfnWndProc = (WNDPROC)DefWindowProc; 61 wc.cbClsExtra = 0; 62 wc.cbWndExtra = 0; 63 wc.hInstance = ::GetModuleHandle(NULL); 64 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 65 wc.hCursor = LoadCursor(NULL, IDC_ARROW); 66 wc.hbrBackground = GetStockBrush(BLACK_BRUSH); 67 wc.lpszMenuName = (PTSTR)className; 68 wc.lpszClassName = (PTSTR)className; 69 ::RegisterClass(&wc); 70 71 char winName[] = "Test"; 72 topWindow = 73 ::CreateWindowEx(WS_EX_CLIENTEDGE, (PTSTR)className, (PTSTR)winName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 74 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, ::GetModuleHandle(NULL), NULL); 75 76 if (topWindow == NULL) { 77 G4cout << "G4Win32: Unable to create Win32 window." << G4endl; 78 } 79 80 Win32Inited = true; 81 } 82 83 AddDispatcher((G4DispatchFunction)G4Win32::DispatchWin32Event); 84 SetMainInteractor(topWindow); 85 } 86 /***************************************************************************/ 87 G4Win32::~G4Win32() 88 /***************************************************************************/ 89 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 90 { 91 if (this == instance) { 92 instance = NULL; 93 } 94 } 95 /***************************************************************************/ 96 G4bool G4Win32::Inited() 97 /***************************************************************************/ 98 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 99 { 100 return Win32Inited; 101 } 102 /***************************************************************************/ 103 void* G4Win32::GetEvent() 104 /***************************************************************************/ 105 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 106 { 107 static MSG event; 108 BOOL status = ::GetMessage(&event, NULL, 0, 0); 109 if (status == FALSE) return NULL; 110 return &event; 111 } 112 /***************************************************************************/ 113 void G4Win32::FlushAndWaitExecution() 114 /***************************************************************************/ 115 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 116 { 117 MSG event; 118 while (::PeekMessage(&event, NULL, 0, 0, PM_REMOVE)) { 119 ::TranslateMessage(&event); 120 ::DispatchMessage(&event); 121 } 122 } 123 /***************************************************************************/ 124 G4bool G4Win32::DispatchWin32Event(void* a_event) 125 /***************************************************************************/ 126 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 127 { 128 ::TranslateMessage((MSG*)a_event); 129 ::DispatchMessage((MSG*)a_event); 130 return true; 131 } 132