1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
| void CMainWindow::CreateGLWindow()
{
TCHAR buf[255];
DWORD windowStyle = WS_OVERLAPPEDWINDOW; // Define Our Window Style
DWORD windowExtendedStyle = WS_EX_APPWINDOW; // Define The Window's Extended Style
PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
{
sizeof (PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | //Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
(BYTE)gcf.nBitsPerPixel, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
1, // Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored
};
RECT windowRect = {0, 0, gcf.nWidth, gcf.nHeight}; // Define Our Window Coordinates (fullscreen)
GLuint PixelFormat; // Will Hold The Selected Pixel Format
if (fullscreen){
gcf.log(_T("Starting in Full screen mode"));
screenMode.setDisplayMode(gcf.nWidth,gcf.nHeight,gcf.nBitsPerPixel);
ShowCursor (FALSE); // Turn Off The Cursor
windowStyle = WS_POPUP; // Set The WindowStyle To WS_POPUP (Popup Window)
}
else{
// Adjust Window, Account For Window Borders
gcf.log(_T("Starting in windowed mode"));
windowRect.left = gcf.nXwnd;
windowRect.top = gcf.nYwnd;
windowRect.right = gcf.nXwnd+gcf.nWidth;
windowRect.bottom = gcf.nYwnd+gcf.nHeight;
AdjustWindowRectEx (&windowRect, windowStyle, 0, windowExtendedStyle);
}
swprintf_s(buf,255,_T("%d bits per pixel were requested"),gcf.nBitsPerPixel);
gcf.log(buf);
//Window creation
CString className = AfxRegisterWndClass(
CS_HREDRAW | CS_VREDRAW | CS_OWNDC,
LoadCursor(NULL, IDC_ARROW),
(HBRUSH)GetStockObject(BLACK_BRUSH),
AfxGetApp()->LoadIcon(IDR_MAINFRAME));
BOOL bRet = CreateEx(
windowExtendedStyle,
className,
_T("MyOpenGLwithMFC"),
windowStyle,
windowRect,
NULL,
0);
if (bRet == 0) gcf.log(_T("Critical : Window creation failed !"));
gcf.pDC = this->GetDC();
gcf.hDC = gcf.pDC->GetSafeHdc();
/*
Our first pass, Multisampling hasn't been created yet, so we create a window normally
If it is supported, then we're on our second pass
that means we want to use our pixel format for sampling
so set PixelFormat to arbMultiSampleformat instead
*/
if(!arbMultisampleSupported)
{
PixelFormat = ChoosePixelFormat (gcf.hDC, &pfd); // Find A Compatible Pixel Format
if (PixelFormat == 0) // Did We Find A Compatible Format?
{
// Failed
gcf.log(_T("Critical : No match for pixel format"));
}
else{
swprintf_s(buf,255,_T("Pixel format selected : %d"),PixelFormat);
gcf.log(buf);
}
}
else
{
PixelFormat = arbMultisampleFormat;
}
if (SetPixelFormat (gcf.hDC, PixelFormat, &pfd) == FALSE){ // Try To Set The Pixel Format
// Failed
DWORD err = GetLastError();
CString csE = ErrorString(err);
gcf.log(_T("Critical : can't set pixel format"));
}
gcf.hRC = wglCreateContext (gcf.hDC); // Try To Get A Rendering Context
if (gcf.hRC == 0){ // Did We Get A Rendering Context?
// Failed
gcf.log(_T("Critical : can't get rendering context"));
}
// Make The Rendering Context Our Current Rendering Context
if (wglMakeCurrent (gcf.hDC, gcf.hRC) == FALSE){
// Failed
gcf.log(_T("Critical : can't switch current rendering context"));
}
/*
Now that our window is created, we want to queary what samples are available
we call our InitMultiSample window
if we return a valid context, we want to destroy our current window
and create a new one using the multisample interface.
*/
if (gcf.bDoMultiSampling){//Multisampling can be set or disabled from config file
if(!arbMultisampleSupported && CHECK_FOR_MULTISAMPLE){
HINSTANCE hInst = AfxGetInstanceHandle( );
if(InitMultisample(hInst,this->m_hWnd,pfd)){
gcf.log(_T("Antialiasing is supported, starting multisampling"));
DestroyGLWindow();
CreateGLWindow();
}
}
}
// Init the openGL window parameters
DoInitGL();
//Show Window and make active
ShowWindow(SW_NORMAL);
SetForegroundWindow();
SetFocus();
if (fullscreen){
//No cursor visible
ShowCursor(false);
}
}
void CMainWindow::DestroyGLWindow()
{
gcf.log(_T("Closing OpenGL window"));
if (gcf.hDC != 0){
wglMakeCurrent (gcf.hDC, 0);
if (gcf.hRC != 0){
// Release The Rendering Context
wglDeleteContext(gcf.hRC);
// Zero The Rendering Context
gcf.hRC = 0;
}
ReleaseDC(gcf.pDC);
gcf.pDC = NULL;
gcf.hDC = 0;
}// end drawing context exists
DestroyWindow();
if (fullscreen){
ChangeDisplaySettings (NULL,0); // Switch Back To Desktop Resolution
ShowCursor (TRUE); // Show The Cursor
}
} |
Partager