На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Сообщения Scrollbar
    Создаю окно в котором будут рисунки. В качестве контейнера для рисунков взял WC_STATIC, поскольку PictureBox как в VB6 нет

    void FormCreatePictureBox()
    {
    DWORD dwstyle;
    dwstyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | SS_WHITERECT;
    e::formhpicturebox = CreateWindowEx(WS_EX_CLIENTEDGE, WC_STATIC, NULL, dwstyle, 0, 0, 0, 0, e::formhwnd, 0, e::formhinst, NULL);
    ShowWindow(e::formhpicturebox, SW_SHOW);
    }

    Добавил полосы прокрутки. На форме отображаются. Но где выловить их сообщения в главную процедуру не приходят.
    Статик вообще передает сообщения от его скроллов ?
    Сообщение отредактировано: H g -
      Вот ответ от ChatGPT. Думаю нужно посмотреть и проверить:

      Цитата
      Статический элемент управления WC_STATIC не передает сообщения о прокрутке по умолчанию. Он предназначен для отображения статического текста или изображений и не имеет встроенной функциональности прокрутки.
      Если вам нужно иметь возможность прокручивать изображения внутри контейнера, вам может потребоваться использовать другой элемент управления, который поддерживает прокрутку, например, элемент управления ScrollBar или Panel.
      На C++ вы можете использовать элемент управления ScrollBar или элемент управления Panel с прокруткой для создания контейнера с рисунками. Вот пример кода на C++, который использует элемент управления ScrollBar:

      ExpandedWrap disabled
        #include <windows.h>
         
        HWND formhpicturebox;
        HWND scrollbar;
         
        void CreatePictureBox(HWND hwnd)
        {
            // Создание элемента управления ScrollBar
            scrollbar = CreateWindowEx(0, "SCROLLBAR", NULL, WS_CHILD | WS_VISIBLE | SBS_VERT, 0, 0, 0, 0, hwnd, NULL, NULL, NULL);
         
            // Создание элемента управления WC_STATIC для отображения рисунков
            DWORD dwstyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | SS_WHITERECT;
            formhpicturebox = CreateWindowEx(WS_EX_CLIENTEDGE, "STATIC", NULL, dwstyle, 0, 0, 0, 0, hwnd, NULL, NULL, NULL);
         
            // Установка связи между ScrollBar и WC_STATIC
            SetScrollPos(scrollbar, SB_CTL, 0, TRUE);
            SetScrollRange(scrollbar, SB_CTL, 0, 100, TRUE);
            SetScrollInfo(scrollbar, SB_CTL, &si, TRUE);
        }
         
        LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            switch (msg)
            {
                case WM_CREATE:
                    CreatePictureBox(hwnd);
                    break;
                case WM_SIZE:
                    // Обновление размеров элементов управления при изменении размера окна
                    // ...
                    break;
                case WM_VSCROLL:
                    // Обработка сообщений о прокрутке вертикальной полосы прокрутки
                    // ...
                    break;
                case WM_PAINT:
                    // Отрисовка рисунков в элементе управления WC_STATIC
                    // ...
                    break;
                case WM_DESTROY:
                    // Освобождение ресурсов при закрытии окна
                    // ...
                    break;
                default:
                    return DefWindowProc(hwnd, msg, wParam, lParam);
            }
            return 0;
        }

      В этом примере мы создаем элемент управления ScrollBar с помощью функции CreateWindowEx и элемент управления WC_STATIC с помощью функции CreateWindowEx. Затем мы устанавливаем связь между ScrollBar и WC_STATIC с помощью функций SetScrollPos, SetScrollRange и SetScrollInfo. В функции WndProc мы обрабатываем сообщения о прокрутке (WM_VSCROLL) и отрисовываем рисунки в элементе управления WC_STATIC (WM_PAINT).
        SS_NOTIFY не поможет?
          Цитата Qraizer @
          SS_NOTIFY не поможет?

          Почитал описалово, про сообщения о прокрутке там ничего на сказано. Только вот это:

          Цитата
          SS_NOTIFY
          Sends the parent window STN_CLICKED, STN_DBLCLK, STN_DISABLE, and STN_ENABLE notification codes when the user clicks or double-clicks the control.
            Я тоже читал, но попробовать минута времени. В MSDN иногда попадаются статьи с ошибками, лично две видел.
              Цитата Qraizer @
              SS_NOTIFY не поможет?

              Хорошо
              допустим добавил я этот стиль SS_NOTIFY, сообщение WM_HSCROLL все равно не проходит, а тогда какое сообщение ловить в главной процедуре ?
              И в главной ли процедуре, пробовал через субклассинг,то же не помогло
              ExpandedWrap disabled
                void FormCreatePictureBox()
                {
                    DWORD dwstyle;
                    dwstyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | SS_WHITERECT | SS_NOTIFY;
                    e::formhpicturebox = CreateWindowEx(WS_EX_CLIENTEDGE, WC_STATIC, NULL, dwstyle, 0, 0, 0, 0, e::formhwnd, 0, e::formhinst, NULL);
                    //e::formhpicturebox = CreateWindowEx(WS_EX_CLIENTEDGE, e::formpictureclass, NULL, dwstyle, 0, 0, 0, 0, e::formhwnd, 0, e::formhinst, NULL);
                 
                    //e::formhpictureboxwndproc = (WNDPROC) SetWindowLong(e::formhpicturebox, GWL_WNDPROC, (LONG) WndProcSubclassing);
                    //EnableScrollBar(e::formhpicturebox, SB_BOTH, ESB_DISABLE_BOTH);
                    ShowWindow(e::formhpicturebox, SW_SHOW);
                }
                 
                LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
                {
                    switch (message)
                    {
                    // ...
                 
                    case WM_HSCROLL:
                        MessageBox(e::formhwnd, "WM_HSCROLL", "Message", MB_OK);
                        return 0;
                    }
                    return DefWindowProc(hwnd, message, wparam, lparam);
                }


              Попробую сделать скроллы как отдельные элементы управления, уж они то точно должны посылать сообщения

              Добавлено
              обновлено:

              пытаюсь ловить
              case WM_LBUTTONDOWN:
              MessageBox(e::formhwnd, "WM_LBUTTONDOWN", "Message", MB_OK);
              DataLButtonDown();
              return 0;

              если нет стиля SS_NOTIFY мессажд появляется, если этот стиль установлен мессадж не появляется.
              В общем, видится уже проще сделать скроллы как отдельные элементы управления, уж они то точно должны посылать сообщения

              Добавлено
              На форуме что-то похожее было
              Упрямый STATIC

              Добавлено
              22 года назад )))
              Сообщение отредактировано: H g -
                попробовал сделать scroll-ы отдельными элементами - выглядит очень не эстетично :-(
                ... и к тому же с перерисовкой вопросы.
                н-да, придется что-то еще придумывать

                Добавлено
                Делаю следующее "извращение" будет кнопка WC_BUTTON со скроллами (от нее идут сообщения WM_HSCROLL и WM_VSCROLL) а поверх будет статик чуть меньше по размеру на ширину этих скроллов. В статике и будет все рисование, а смещение рисунка на статике будут регулировать скроллы от кнопки...
                Вот как тут будешь делать правильно, если приходится такой ерундой заниматься.
                Сообщение отредактировано: H g -
                  Ну, с SS_NOTIFY было ожидаемо. Хоть и жаль.
                  Я бы в итоге сделал, как и (наверное) ты: добавил справа и снизу скроллы отдельными элементами и SS_OWNERDRAWнутому статику по WM_PAINT из заранее загруженного битмапа BitBlt()шил с нужными смещениями.
                    Цитата H g @
                    Создаю окно в котором будут рисунки. В качестве контейнера для рисунков взял WC_STATIC, поскольку PictureBox как в VB6

                    Добавил полосы прокрутки. На форме отображаются. Но где выловить их сообщения в главную процедуру не приходят.
                    Статик вообще передает сообщения от его скроллов ?

                    Эти сообщения, вероятно, приходят в оконную процедуру
                    самого статика.
                    А ни как не главного окна.
                    Должны быть сообщения WM_VSCROLL и WM_HSCROLL.
                    Почитай у Петзольда, том 1, ~ стр. 56 и далее.

                    Добавлено
                    Цитата H g @
                    В общем, видится уже проще сделать скроллы как отдельные элементы управления, уж они то точно должны посылать сообщения

                    Да, лично я так и делал.
                    Только использовал "обычное" окно, а ни как не "статик".
                    Всё отлично работает, никаких посторонних видео-эффектов
                    не наблюдается.
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0341 ]   [ 15 queries used ]   [ Generated: 17.06.25, 02:00 GMT ]