/// <summary>
        /// Capture the contents of a window or control
        /// </summary>
        /// <param name="control">Control</param>
        /// <param name="bitmap">Picture</param>
        private static void CaptureWindow(Control control, ref Bitmap bitmap)
        {
            using (Graphics g2 = Graphics.FromImage(bitmap))
            {
                const int meint = (int)(Win32Engine.PRF_CLIENT | Win32Engine.PRF_ERASEBKGND);
                var       meptr = new IntPtr(meint);

                IntPtr hdc = g2.GetHdc();
                Win32Engine.SendMessage(control.Handle, Win32Engine.WM_PRINT, hdc, meptr);

                g2.ReleaseHdc(hdc);
            }
        }
Beispiel #2
0
        // отлов скроллирования
        // при движении ползунка мышью - срабатывает WmVScroll, получается позиция ползунка и кидается событие VScrollingChange
        // текущее событие пробрасывается для движения ползунка на текущем контроле
        // при скроллировании мышью - срабатывает WmMouseWheel, получается текущая позиция ползунка, определяется направление
        // скроллирования, вычисляется правильное положение ползунка после сдвига и кидается событие VScrollingChange.
        // Так приходится поступать, потому что это событие происходит до того, как ползунок изменит своё положение. Поэтому
        // приходится не пробрасывать текущее событие, а генерить своё, с указанием правильного положения ползунка после сдвига,
        // ибо сдвиг может произойти на любое количество шагов (1, 2, 3 и т.д.). Мы же в итоге сдвигается всегда на один шаг.
        protected override void WndProc(ref Message m)
        {
            if (_stopScrollCatching)
            {
                base.WndProc(ref m);
                return;
            }

            int pos;
            var scrollInfo = new ScrollInfo();

            scrollInfo.Size = (uint)Marshal.SizeOf(scrollInfo);

            switch (m.Msg)
            {
            case (int)ScrollMessage.WmVScroll:
                if (VScrollingChange != null)
                {
                    if ((m.WParam.ToInt32() & 0xFF) == (int)ScrollBarCommands.ThumbTrack)
                    {
                        scrollInfo.Mask = (uint)ScrollBarInfo.TrackPos;
                        Win32Engine.GetScrollInfo(Handle, (int)ScrollBarType.SbVert, ref scrollInfo);
                        pos = scrollInfo.TrackPos;
                    }
                    else
                    {
                        scrollInfo.Mask = (uint)ScrollBarInfo.Pos;
                        Win32Engine.GetScrollInfo(Handle, (int)ScrollBarType.SbVert, ref scrollInfo);
                        pos = scrollInfo.Pos;
                    }

                    VScrollingChange(this, new CScrollEventArgs(pos));
                }
                break;

            case (int)ScrollMessage.WmMouseWheel:
                scrollInfo.Mask = (uint)ScrollBarInfo.Pos;
                Win32Engine.GetScrollInfo(Handle, (int)ScrollBarType.SbVert, ref scrollInfo);
                pos = scrollInfo.Pos;
                if (m.WParam.ToInt32() < 0)
                {
                    pos++;
                }
                else if (pos > 0)
                {
                    pos--;
                }

                if (VScrollingChange != null)
                {
                    VScrollingChange(this, new CScrollEventArgs(pos));
                }

                _stopScrollCatching = true;
                pos <<= 16;
                uint wParam = (uint)ScrollBarCommands.ThumbPosition | (uint)pos;
                Win32Engine.SendMessage(Handle, (int)ScrollMessage.WmVScroll, new IntPtr(wParam), new IntPtr(0));

                _stopScrollCatching = false;

                return;
            }

            base.WndProc(ref m);
        }