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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите реализовать прокрутку в окне 
V
    Опции темы
586
Дата 11.5.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Есть окно со стилями WS_VSCROLL, WS_HSCROLL. На нем рисуется рисунок.
1) Как изменить длину бегунка, чтобы при изменении размера окна он менялся относительно картинки.
2) Реализация прокрутки (вводить координать прокрутки, или есть какая-нибудь api-шная фунуция)

Код
#include <windows.h>
#include <stdio.h>

HBITMAP hbmp;
HDC hMemDC;
BITMAP bmp;
int x=0, y=0;

void Init(HWND hWnd)
{
    hMemDC=CreateCompatibleDC(NULL);
    SelectObject(hMemDC, (HGDIOBJ)hbmp);
    GetObject((HGDIOBJ)hbmp, sizeof(BITMAP), &bmp);
}

void Paint(HWND hWnd)
{
    PAINTSTRUCT ps;

    BeginPaint(hWnd, &ps);
    BitBlt(ps.hdc, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, hMemDC, x, y, SRCCOPY);
    EndPaint(hWnd, &ps);
}

void Size(HWND hWnd, LPARAM lParam)
{
    SCROLLINFO s;
    char b[60];    //debug

    s.cbSize=sizeof(s);

    if(LOWORD(lParam)>bmp.bmWidth)
    {
        s.fMask=SIF_DISABLENOSCROLL;
    } else {
        s.fMask=SIF_ALL;
        s.nMin=0;
        s.nMax=bmp.bmWidth-LOWORD(lParam);    // ?
        s.nPage=s.nMax;    // ?
        s.nPos=x;        // ?
        s.nTrackPos=1;
    }

    SetScrollInfo(hWnd, SB_HORZ, &s, FALSE);

    if(HIWORD(lParam)>bmp.bmHeight)
    {
        s.fMask=SIF_DISABLENOSCROLL;
    } else {
        s.fMask= SIF_PAGE | SIF_RANGE ;
        s.nMin=0;
        s.nMax=bmp.bmHeight;    // ?
        s.nPage=bmp.bmHeight-HIWORD(lParam);    // ?
        s.nPos=y;
    }

    sprintf(b, "bmHeight=%d, HIWORD(lParam)=%d, s.nMax=%d, s.nPage=%d", bmp.bmHeight, HIWORD(lParam), s.nMax, s.nPage);
    SetWindowTextA(hWnd, b);    //debug
    SetScrollInfo(hWnd, SB_VERT, &s, FALSE);
    
}

int __stdcall MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_CLOSE: EndDialog(hWnd, 0); break;
    case WM_INITDIALOG: Init(hWnd); break;
    case WM_PAINT: Paint(hWnd); break;
    case WM_SIZE: Size(hWnd, lParam); break;

    }
    return 0;
}

int __stdcall WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, INT)
{
    hbmp=(HBITMAP)LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
    
    if(!hbmp)
    {
        MessageBoxA(NULL, "%cd%\\test.bmp is not accessible", 0, 16);
        return 1;
    }

    DialogBoxParam(hinst, MAKEINTRESOURCE(100), 0, MainWndProc, 0);

    DeleteObject((HGDIOBJ)hbmp);
    return 0;
}


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  WinRAR_archive.rar 97,37 Kb
PM   Вверх
anwe
Дата 11.5.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



586, так?

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  SYSMETS3.EXE 21,00 Kb
PM MAIL   Вверх
586
Дата 12.5.2007, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



вопрос решен

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

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


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

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


 




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


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

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