Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> полосы прокрутки в рисовании, сабж 
V
    Опции темы
darthnick
  Дата 22.5.2006, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



хай
задача: нарисовать линию, превышающую размеры окна и смотреть недоступную часть линии полосой прокрутки(чтобы в будущем строить графики по точкам). 
Мой код:

Код

#include <windows.h>
#include <windowsx.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE hI;

int __stdcall WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
{
    MSG msg;
    WNDCLASS wc;

    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = GetStockBrush(WHITE_BRUSH);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = hInst;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = "Graph";
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wc);

    hI = hInst;

    HWND hwnd = CreateWindow("Graph","Graph",WS_OVERLAPPEDWINDOW | WS_HSCROLL,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInst,NULL);
    ShowWindow(hwnd,SW_NORMAL);
    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
        DispatchMessage(&msg);

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    static int HorizPos = 0;
    static int HorizDif = 600;

    switch(msg) {
        case WM_CREATE:
            SetScrollRange(hwnd,SB_HORZ,0,100,TRUE);
            break;
        case WM_PAINT:
            PAINTSTRUCT ps;
            BeginPaint(hwnd,&ps);
            LineTo(ps.hdc,40,40);
            LineTo(ps.hdc,100,60);
            LineTo(ps.hdc,250,25);
            LineTo(ps.hdc,650,85);
            LineTo(ps.hdc,850,105);
            LineTo(ps.hdc,1100,500);
            EndPaint(hwnd,&ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_HSCROLL:
            switch(LOWORD(wParam))
            {
            case SB_LINEDOWN:
                if(HorizPos < HorizDif)
                    HorizPos++;
            break;

            case SB_LINEUP:
                if(HorizPos > 0)
                    HorizPos--;
            break;

            case SB_THUMBTRACK:
                HorizPos = HIWORD(wParam);
                break;
            }
            SetScrollPos(hwnd,SB_HORZ,HorizPos,TRUE);
            InvalidateRect(hwnd,NULL,TRUE);
            break;
        default: return DefWindowProc(hwnd,msg,wParam,lParam);
    }

    return 0;
}


пробовал так же еще и с SCROLLINFO и с полосой в качестве отдельного окна.
Собственно проблема: линия не в какую не хочет сдвигаться smile
посоветуйте что делать smile
заранее спасибо  

Это сообщение отредактировал(а) darthnick - 22.5.2006, 03:32
PM MAIL   Вверх
ElcnU
Дата 22.5.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 28.4.2006

Репутация: нет
Всего: нет



на MFC на основе CScrollView все просто:в функции OnDraw(...) рисуешь что угодно, главное заранее выставить
Код

    sizeTotal.cx = sizeTotal.cy = 10000ххх;
    SetScrollSizes(MM_TEXT, sizeTotal);
  

Это сообщение отредактировал(а) ElcnU - 22.5.2006, 09:58
PM MAIL   Вверх
darthnick
Дата 22.5.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



не люблю MFC smile
надо чистый апи  smile  
как я понимаю, надо как то сдвигать координаты  smile   

Это сообщение отредактировал(а) darthnick - 22.5.2006, 14:10
PM MAIL   Вверх
ElcnU
Дата 22.5.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 28.4.2006

Репутация: нет
Всего: нет



Необходимо задать размер область отрисовки с учетом скрола(такая логика в MFC)
Код

SetScrollRange(hwnd,SB_HORZ,0,100,TRUE);

может установить
Код

SetScrollRange(hwnd,SB_HORZ,0,>100,TRUE);
например
SetScrollRange(hwnd,SB_HORZ,0,1100,TRUE);


 
PM MAIL   Вверх
darthnick
Дата 22.5.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



я уже помойму всё перепробовал  smile  
PM MAIL   Вверх
Vaulter
Дата 22.5.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



darthnick
во первых заведи постоянную hdc, на которой будешь рисовать,
и она какраз таки будет необходимой ширины.
далее, в начале программы естесвенно при WM_PAINT
bitblt по 0,0, ширина окна, высота окна
енеблишь скрол если клиент-высота окна меньше высоты твоей hdc

отлавливая скролл - запоминаешь координаты "origin" - откуда рисовать ИЗ hdc в 0,0
рисуешь... smile


есть еще.. событие... не помню как зовется, MSDN ща нет smile
по нему можно и отловить скролл и прорисовать корректно - оно именно для этого
 


--------------------
PM MAIL WWW ICQ   Вверх
darthnick
Дата 22.5.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



спасиба smile 
изменил на 

Код

        case WM_PAINT:
            PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd,&ps);
            MoveToEx(hdc,1-HorizPos,1,NULL);
            LineTo(hdc,40-HorizPos,40);
            LineTo(hdc,1500-HorizPos,70);
            EndPaint(hwnd,&ps);
            break;


работает О.о 

Это сообщение отредактировал(а) darthnick - 22.5.2006, 16:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1152 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.