ScrollWindow не имеет абсолютно никакого эффекта - PullRequest
1 голос
/ 07 февраля 2011

Я создаю пользовательский элемент управления для WinForms, и у меня есть необходимость прокрутить раздел окна управления.

Необъяснимо, но, похоже, в WinForms нет метода ScrollWindow (). Поэтому я пытаюсь использовать InteropServices для использования функции ScrollWindow () Win32 API, используя следующие варианты:

[StructLayout(LayoutKind.Sequential)] 
public struct RECT
{
    public int left; 
    public int top; 
    public int right; 
    public int bottom; 

    public RECT(Rectangle rect)
    {
        this.bottom = rect.Bottom;
        this.left = rect.Left;
        this.right = rect.Right;
        this.top = rect.Top;
    }
}

[DllImport("user32")]
public static extern int ScrollWindow(IntPtr hWnd, int nXAmount, int nYAmount,
    ref RECT rectScrollRegion, ref RECT rectClip);

void MyScrollFunc(int yAmount)
{
    RECT r = new RECT(ClientRectangle);
    ScrollWindow(Handle, 0, yAmount, ref r, ref r);
}

В результате этот код абсолютно ничего не делает. Я пробовал все виды вариаций этого кода, включая вызов Update () после прокрутки (что не должно быть необходимо).

ScrollWindow () возвращает 1, что означает успех, но оно просто не влияет на содержимое окна управления, независимо от того, что я пытаюсь.

Кто-нибудь знает, есть ли что-то в пользовательском элементе управления, который не позволяет изменять отображение таким образом? Я тестирую это на C # Express Edition 2008 на Windows XP.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2011

Как указано в комментарии Will, вы можете легко прокрутить свой пользовательский элемент управления, установив его свойство AutoScroll - для этого не нужно нажимать Win32 API.

Если вы действительно хотите использовать API, хотя бы используйте ScrollWindowEx вместо ScrollWindow.

Обновление: Поскольку я случайно догадался об этом, ответ:

Передайте Null для двух RECT параметров.

0 голосов
/ 09 февраля 2011

Итак, получается ScrollWindow() работает просто отлично.Я скопировал некоторый код из Интернета, в котором члены структуры RECT вышли из строя.Спасибо MusiGenesis за совет, который заставил меня посмотреть в нужном месте (я просто предположил, что скопированный код был верным - моя ошибка.)

Да, мне иногда нравится писать эффективный код, и это обычно означаетВ таких местах, как SO, я бьюсь головой о людях, которые думают, что я должен использовать все, что есть на полке.Разные люди любят подходить к разработке программного обеспечения по-разному, и я думаю, что все в порядке.

Если кому-то интересно, я писал многострочный элемент управления статусом.Я хотел, чтобы это было быстро, потому что мое приложение может отправлять много сообщений в элемент управления за короткий промежуток времени.Статья о контроле вместе с окончательным исходным кодом была размещена на http://www.blackbeltcoder.com/Articles/controls/a-scrolling-status-control.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...