Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > полосы прокрутки в рисовании


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

Код

#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
заранее спасибо  

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

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

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

Автор: ElcnU 22.5.2006, 14:41
Необходимо задать размер область отрисовки с учетом скрола(такая логика в MFC)
Код

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

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

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


 

Автор: darthnick 22.5.2006, 16:09
я уже помойму всё перепробовал  smile  

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

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


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

Автор: darthnick 22.5.2006, 16:46
спасиба 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;


работает О.о 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)