Пример #1
0
 public void RestoreHdc()
 {
     IntUnsafeNativeMethods.RestoreDC(new HandleRef(this, this.hDC), -1);
     if (this.contextStack != null)
     {
         GraphicsState state = (GraphicsState)this.contextStack.Pop();
         this.hCurrentBmp   = state.hBitmap;
         this.hCurrentBrush = state.hBrush;
         this.hCurrentPen   = state.hPen;
         this.hCurrentFont  = state.hFont;
         if ((state.font != null) && state.font.IsAlive)
         {
             this.selectedFont = state.font.Target as WindowsFont;
         }
         else
         {
             WindowsFont selectedFont = this.selectedFont;
             this.selectedFont = null;
             if ((selectedFont != null) && MeasurementDCInfo.IsMeasurementDC(this))
             {
                 selectedFont.Dispose();
             }
         }
     }
     MeasurementDCInfo.ResetIfIsMeasurementDC(this.hDC);
 }
Пример #2
0
        /// <summary>
        ///  Restores the device context to the specified state. The DC is restored by popping state information off a
        ///  stack created by earlier calls to the SaveHdc function.
        ///  The stack can contain the state information for several instances of the DC. If the state specified by the
        ///  specified parameter is not at the top of the stack, RestoreDC deletes all state information between the top
        ///  of the stack and the specified instance.
        ///  Specifies the saved state to be restored. If this parameter is positive, nSavedDC represents a specific
        ///  instance of the state to be restored. If this parameter is negative, nSavedDC represents an instance relative
        ///  to the current state. For example, -1 restores the most recently saved state.
        ///  See MSDN for more info.
        /// </summary>
        public void RestoreHdc()
        {
#if TRACK_HDC
            bool result =
#endif
            // Note: Don't use the Hdc property here, it would force handle creation.
            IntUnsafeNativeMethods.RestoreDC(new HandleRef(this, hDC), -1);
#if TRACK_HDC
            // Note: Winforms may call this method during app exit at which point the DC may have been finalized already causing this assert to popup.
            Debug.WriteLine(DbgUtil.StackTraceToStr(String.Format("ret[0]=DC.RestoreHdc(hDc=0x{1:x8})", result, unchecked ((int)this.hDC))));
#endif
            Debug.Assert(contextStack != null, "Someone is calling RestoreHdc() before SaveHdc()");

            if (contextStack != null)
            {
                GraphicsState g = (GraphicsState)contextStack.Pop();

                hCurrentBmp   = g.hBitmap;
                hCurrentBrush = g.hBrush;
                hCurrentPen   = g.hPen;
                hCurrentFont  = g.hFont;

                if (g.font != null && g.font.IsAlive)
                {
                    selectedFont = g.font.Target as WindowsFont;
                }
                else
                {
                    WindowsFont previousFont = selectedFont;
                    selectedFont = null;
                    if (previousFont != null && MeasurementDCInfo.IsMeasurementDC(this))
                    {
                        previousFont.Dispose();
                    }
                }
            }

#if OPTIMIZED_MEASUREMENTDC
            // in this case, GDI will copy back the previously saved font into the DC.
            // we dont actually know what the font is in our measurement DC so
            // we need to clear it off.
            MeasurementDCInfo.ResetIfIsMeasurementDC(hDC);
#endif
        }