
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Сообщ.
#1
,
|
|
|
Создаю окно в котором будут рисунки. В качестве контейнера для рисунков взял 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); } Добавил полосы прокрутки. На форме отображаются. Но где выловить их сообщения в главную процедуру не приходят. Статик вообще передает сообщения от его скроллов ? |
Сообщ.
#2
,
|
|
|
Вот ответ от ChatGPT. Думаю нужно посмотреть и проверить:
Цитата Статический элемент управления WC_STATIC не передает сообщения о прокрутке по умолчанию. Он предназначен для отображения статического текста или изображений и не имеет встроенной функциональности прокрутки. Если вам нужно иметь возможность прокручивать изображения внутри контейнера, вам может потребоваться использовать другой элемент управления, который поддерживает прокрутку, например, элемент управления ScrollBar или Panel. На C++ вы можете использовать элемент управления ScrollBar или элемент управления Panel с прокруткой для создания контейнера с рисунками. Вот пример кода на C++, который использует элемент управления ScrollBar: ![]() ![]() #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). |
![]() |
Сообщ.
#3
,
|
|
SS_NOTIFY не поможет?
|
Сообщ.
#4
,
|
|
|
Цитата 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. |
![]() |
Сообщ.
#5
,
|
|
Я тоже читал, но попробовать минута времени. В MSDN иногда попадаются статьи с ошибками, лично две видел.
|
Сообщ.
#6
,
|
|
|
Цитата Qraizer @ SS_NOTIFY не поможет? Хорошо допустим добавил я этот стиль SS_NOTIFY, сообщение WM_HSCROLL все равно не проходит, а тогда какое сообщение ловить в главной процедуре ? И в главной ли процедуре, пробовал через субклассинг,то же не помогло ![]() ![]() 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 года назад ))) |
Сообщ.
#7
,
|
|
|
попробовал сделать scroll-ы отдельными элементами - выглядит очень не эстетично :-(
... и к тому же с перерисовкой вопросы. н-да, придется что-то еще придумывать Добавлено Делаю следующее "извращение" будет кнопка WC_BUTTON со скроллами (от нее идут сообщения WM_HSCROLL и WM_VSCROLL) а поверх будет статик чуть меньше по размеру на ширину этих скроллов. В статике и будет все рисование, а смещение рисунка на статике будут регулировать скроллы от кнопки... Вот как тут будешь делать правильно, если приходится такой ерундой заниматься. |
![]() |
Сообщ.
#8
,
|
|
Ну, с SS_NOTIFY было ожидаемо. Хоть и жаль.
Я бы в итоге сделал, как и (наверное) ты: добавил справа и снизу скроллы отдельными элементами и SS_OWNERDRAWнутому статику по WM_PAINT из заранее загруженного битмапа BitBlt()шил с нужными смещениями. |
Сообщ.
#9
,
|
|
|
Цитата H g @ Создаю окно в котором будут рисунки. В качестве контейнера для рисунков взял WC_STATIC, поскольку PictureBox как в VB6 Добавил полосы прокрутки. На форме отображаются. Но где выловить их сообщения в главную процедуру не приходят. Статик вообще передает сообщения от его скроллов ? Эти сообщения, вероятно, приходят в оконную процедуру самого статика. А ни как не главного окна. Должны быть сообщения WM_VSCROLL и WM_HSCROLL. Почитай у Петзольда, том 1, ~ стр. 56 и далее. Добавлено Цитата H g @ В общем, видится уже проще сделать скроллы как отдельные элементы управления, уж они то точно должны посылать сообщения Да, лично я так и делал. Только использовал "обычное" окно, а ни как не "статик". Всё отлично работает, никаких посторонних видео-эффектов не наблюдается. |