static private int GetAAPixelFormat(ref int samples) { PIXELFORMATDESCRIPTOR pfd = new PIXELFORMATDESCRIPTOR(); pfd.nSize = (ushort)Marshal.SizeOf(typeof(PIXELFORMATDESCRIPTOR)); pfd.nVersion = 1; pfd.dwFlags = PixelFlag.PFD_DRAW_TO_WINDOW | PixelFlag.PFD_SUPPORT_OPENGL | PixelFlag.PFD_DOUBLEBUFFER; pfd.iPixelType = PixelType.PFD_TYPE_RGBA; pfd.cColorBits = 32; IntPtr dummyHWnd = GDI.CreateWindowEx(0, s_dummyClass, "", GDI.WindowStyles.WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); IntPtr dummyHDc = GDI.GetDC(dummyHWnd); int dummyPF = GDI.ChoosePixelFormat(dummyHDc, ref pfd); GDI.SetPixelFormat(dummyHDc, dummyPF, ref pfd); IntPtr dummyHRc = WGL.wglCreateContext(dummyHDc); WGL.wglMakeCurrent(dummyHDc, dummyHRc); int[] iattrs = new int[] { WGL.WGL_DRAW_TO_WINDOW_ARB, 1, WGL.WGL_ACCELERATION_ARB, WGL.WGL_FULL_ACCELERATION_ARB, WGL.WGL_COLOR_BITS_ARB, 24, WGL.WGL_ALPHA_BITS_ARB, 8, WGL.WGL_DEPTH_BITS_ARB, 24, WGL.WGL_STENCIL_BITS_ARB, 8, WGL.WGL_DOUBLE_BUFFER_ARB, 1, WGL.WGL_SAMPLE_BUFFERS_ARB, 1, WGL.WGL_SAMPLES_ARB, 0, 0, 0 }; WGL.wglChoosePixelFormatARBHandler wglChoosePixelFormatARB = (WGL.wglChoosePixelFormatARBHandler)WGL.GetProc <WGL.wglChoosePixelFormatARBHandler>("wglChoosePixelFormatARB"); int pixelFormat = 0; if (wglChoosePixelFormatARB != null) { int reqSamples; for (reqSamples = samples; reqSamples > 0; reqSamples /= 2) { iattrs[17] = reqSamples; int[] pixelFormats = new int[16]; int numFormats; unsafe { fixed(int *pPixelFormats = pixelFormats) { fixed(int *pIAttrs = iattrs) { int success = wglChoosePixelFormatARB( dummyHDc, pIAttrs, (float *)0, 16, pPixelFormats, &numFormats); if (success != 0 && numFormats > 0) { pixelFormat = pixelFormats[0]; samples = reqSamples; break; } } } } } } else { samples = 1; pixelFormat = GDI.ChoosePixelFormat(dummyHDc, ref pfd); } WGL.wglMakeCurrent(dummyHDc, dummyHRc); WGL.wglDeleteContext(dummyHRc); GDI.ReleaseDC(dummyHWnd, dummyHDc); GDI.DestroyWindow(dummyHWnd); return(pixelFormat); }
protected void OnScroll(ScrollEventArgs se) { bool hasViewChanged = false; if (se.ScrollOrientation == ScrollOrientation.HorizontalScroll) { GDI.SCROLLINFO si = new GDI.SCROLLINFO(); si.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(GDI.SCROLLINFO)); si.fMask = (int)(GDI.ScrollInfoMask.SIF_TRACKPOS | GDI.ScrollInfoMask.SIF_PAGE | GDI.ScrollInfoMask.SIF_POS); GDI.GetScrollInfo(Handle, (int)GDI.ScrollBarDirection.SB_HORZ, ref si); switch (se.Type) { case ScrollEventType.LargeDecrement: m_view = new RectD(m_view.Left - m_view.Width, m_view.Top, m_view.Right - m_view.Width, m_view.Bottom); break; case ScrollEventType.LargeIncrement: m_view = new RectD(m_view.Left + m_view.Width, m_view.Top, m_view.Right + m_view.Width, m_view.Bottom); break; case ScrollEventType.SmallDecrement: m_view = new RectD(m_view.Left - m_view.Width * 0.1f, m_view.Top, m_view.Right - m_view.Width * 0.1f, m_view.Bottom); break; case ScrollEventType.SmallIncrement: m_view = new RectD(m_view.Left + m_view.Width * 0.1f, m_view.Top, m_view.Right + m_view.Width * 0.1f, m_view.Bottom); break; case ScrollEventType.ThumbTrack: { double tp = si.nTrackPos / ScrollScale * m_physExtents.Width + m_physExtents.Left; m_view = new RectD(tp, m_view.Top, tp + m_view.Width, m_view.Bottom); } break; } ClampView(); UpdateScroll(); Invalidate(); hasViewChanged = true; } else if (se.ScrollOrientation == ScrollOrientation.VerticalScroll) { GDI.SCROLLINFO si = new GDI.SCROLLINFO(); si.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(GDI.SCROLLINFO)); si.fMask = (int)(GDI.ScrollInfoMask.SIF_TRACKPOS | GDI.ScrollInfoMask.SIF_PAGE | GDI.ScrollInfoMask.SIF_POS); GDI.GetScrollInfo(Handle, (int)GDI.ScrollBarDirection.SB_VERT, ref si); switch (se.Type) { case ScrollEventType.LargeDecrement: m_view = new RectD(m_view.Left, m_view.Top - m_view.Height, m_view.Right, m_view.Bottom - m_view.Height); break; case ScrollEventType.LargeIncrement: m_view = new RectD(m_view.Left, m_view.Top + m_view.Height, m_view.Right, m_view.Bottom + m_view.Height); break; case ScrollEventType.SmallDecrement: m_view = new RectD(m_view.Left, m_view.Top - m_view.Height * 0.1f, m_view.Right, m_view.Bottom - m_view.Height * 0.1f); break; case ScrollEventType.SmallIncrement: m_view = new RectD(m_view.Left, m_view.Top + m_view.Height * 0.1f, m_view.Right, m_view.Bottom + m_view.Height * 0.1f); break; case ScrollEventType.ThumbTrack: { double tp = si.nTrackPos / ScrollScale * m_physExtents.Height + m_physExtents.Top; m_view = new RectD(m_view.Left, tp, m_view.Right, tp + m_view.Height); } break; } ClampView(); UpdateScroll(); Invalidate(); hasViewChanged = true; } if (hasViewChanged) { OnViewChanged(); } }