Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отображение изображения

249
22 июля 2005 года
DissDoc
639 / / 01.10.2004
Для начала - Win32. :D
Глобальные переменные
 
Код:
LOGPEN lPen;
LOGBRUSH lBrush;
HPEN hPen;
HBRUSH hBrush;
POINT Pnt;
HDC image_dc;


Функция рисования
Код:
void DrawSquareFunc(HWND hWnd, HDC hDc)
{
    Pnt.x = 5;
    Pnt.y = 5;

    lPen.lopnStyle = PS_STYLE_MASK;
    lPen.lopnColor = 0;
    lPen.lopnWidth = Pnt;

    hDc = GetDC(hWnd);
    hPen = CreatePenIndirect(&lPen);
    SelectObject(hDc, hPen);

    Rectangle(hDc, 50, 50, 250, 250);
}


реализация функции вот такая
 
Код:
case ID_DRAW_LINE:
            DrawLineFunc(hWnd, image_dc);
            break;


И также не забыл в функции WM_PAINT вот это
 
Код:
hdc = BeginPaint(hWnd, &ps);
        image_dc = ::CreateCompatibleDC(hdc);
        SelectObject(hdc, image_dc);
        BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRCCOPY);
        DeleteDC(image_dc);
        EndPaint(hWnd, &ps);
        break;


Линия рисуется, но стоит мне свернуть окно а потом его восстановить (развернуть) - изображение пропадает! Что сделать, чтобы это исправить?
279
24 июля 2005 года
bave
456 / / 07.03.2004
Обрабатывай не только сообщение WM_PAINT,
но и WM_SIZE, на сообщение WM_SIZE посылай своему
окну сообщение перерисоваться UpdateWindow(hWnd);
- способ конечно не очень, но помоему в твоём
случае самый раз.
249
24 июля 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by bave
Обрабатывай не только сообщение WM_PAINT,
но и WM_SIZE, на сообщение WM_SIZE посылай своему
окну сообщение перерисоваться UpdateWindow(hWnd);
- способ конечно не очень, но помоему в твоём
случае самый раз.


Нее, это не то! Те же яйца, только в профиль =(((

406
26 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Че за дурдом здесь творится. Убери строки
image_dc = ::CreateCompatibleDC(hdc);//нахрена создаеш новый пустой контекст
SelectObject(hdc, image_dc);//а здесь пытаешся выбрать контекст в контекст! Так нельзя!
DeleteDC(image_dc);

из WM_PAINT и все будет работать:

case WM_PAINT :
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRC
COPY);
EndPaint(hWnd, &ps);
break;
249
27 июля 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by vitaly2003s
Че за дурдом здесь творится. Убери строки
image_dc = ::CreateCompatibleDC(hdc);//нахрена создаеш новый пустой контекст
SelectObject(hdc, image_dc);//а здесь пытаешся выбрать контекст в контекст! Так нельзя!
DeleteDC(image_dc);

из WM_PAINT и все будет работать:

case WM_PAINT :
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRC
COPY);
EndPaint(hWnd, &ps);
break;



И так тоже не работает!

К слову сказать, я проверил некоторые программы под DirectX (как примеры к изучению прилагались). Так там такая же фигня почему-то... Т.е. на фоне крутиться кубик, стоит окно свернуть, а потом его развернуть - кубик исчезает! :roll:

406
27 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by DissDoc
И так тоже не работает!

К слову сказать, я проверил некоторые программы под DirectX (как примеры к изучению прилагались). Так там такая же фигня почему-то... Т.е. на фоне крутиться кубик, стоит окно свернуть, а потом его развернуть - кубик исчезает! :roll:


Выложи исходник,посмотрим.

249
28 июля 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by vitaly2003s
Выложи исходник,посмотрим.



Вот небольшой кусок

Код:
void DrawLineFunc(HWND hWnd, HDC hDc, int x, int y1, int y2, COLORREF clr)
{
    Pnt.x = 1;
    Pnt.y = 1;

    lPen.lopnStyle = PS_STYLE_MASK;
    lPen.lopnColor = clr;
    lPen.lopnWidth = Pnt;

    hDc = GetDC(hWnd);
    hPen = CreatePenIndirect(&lPen);
    SelectObject(hDc, hPen);

    MoveToEx(hDc, x, y1, &Pnt);
    LineTo(hDc, x, y2);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HANDLE handle;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
       
        switch (wmId)
        {
        case IDM_about :
            DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
            break;
        case ID_FILE_OPEN:
            LPTSTR fname;
            fname=PAlloc(250);
            FGetDirectory(fname);
            LoadBMTrue(hWnd, fname, bitmap);
            PDeAlloc((HLOCAL)fname);
            break;
        case ID_FILE_SAVE:
            OpenFileName(hWnd, handle);
            break;
        case ID_LINES_GRAY256:
            ConvertGray256(image_dc);
            break;
        case ID_DRAW_ELLIPSE:
            DrawEllipseFunc(hWnd, image_dc);
            break;
        case ID_DRAW_SQUARE:
            DrawSquareFunc(hWnd, image_dc);
            break;
        case ID_DRAW_LINE:
            DrawLineFunc(hWnd, image_dc, 50, 50, 200, 0x00FFFFFF);
            break;
        case ID_LINES_CODE:
            DialogBox(hInst, (LPCTSTR)IDD_ENTER_TEXT, hWnd, (DLGPROC)Code);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRCCOPY);
        DeleteDC(image_dc);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        DeleteObject(SelectObject(image_dc, hPen));
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
406
28 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Я же те говорил че убрать.
Убери в case WM_PAINT

DeleteDC(image_dc);
249
28 июля 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by vitaly2003s
Я же те говорил че убрать.
Убери в case WM_PAINT

DeleteDC(image_dc);



Убрал - опять то же самое! Не работает, т.е. при сворачивании, а потом разворачивании - нарисованное изображение пропадает (в данном случае - это линия).

406
28 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by DissDoc
Убрал - опять то же самое! Не работает, т.е. при сворачивании, а потом разворачивании - нарисованное изображение пропадает (в данном случае - это линия).


давай весь проект в архиве

249
29 июля 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by vitaly2003s
давай весь проект в архиве



Вот! На класс Парсер не смотри, он не доделан.

406
29 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by DissDoc
Вот! На класс Парсер не смотри, он не доделан.


Ты там многие вещи делаеш неправильно,переопределяеш hdc,забываеш про сохранение в котексте его предыдущих обектов и т.д. И пытаешся использовать напрямую hdc основного окна,но для прорисовки так не делается,необходимо создавать так называемый бэк буффер и уже туда вести прорисовку а уж затем потом просто копировать содержимое буффера на экран,я здесь тебе это показал немного как это делается. Подкорректировал некоторые участки кода но не все так что за остальное сам думай. Кстати при изменении размеров окна необходимо изменять размер бэк буффера,попробуй сам самостоятельно это реализовать(подсказка: на сообщении WM_SIZE)

249
29 июля 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by vitaly2003s
Ты там многие вещи делаеш неправильно,переопределяеш hdc,забываеш про сохранение в котексте его предыдущих обектов и т.д. И пытаешся использовать напрямую hdc основного окна,но для прорисовки так не делается,необходимо создавать так называемый бэк буффер и уже туда вести прорисовку а уж затем потом просто копировать содержимое буффера на экран,я здесь тебе это показал немного как это делается. Подкорректировал некоторые участки кода но не все так что за остальное сам думай. Кстати при изменении размеров окна необходимо изменять размер бэк буффера,попробуй сам самостоятельно это реализовать(подсказка: на сообщении WM_SIZE)



Спасибо тебе, очень помогло! Я действительно этих вещей не знал и в результате просто не обращал на это внимание...
Спасибо еще раз!

249
22 августа 2005 года
DissDoc
639 / / 01.10.2004
В твоем коде нашел ошибку!!! Проблема в том, что он рисует только черные и белые линии! А все цветные линии он рисует как черные. Как это исправить? Ну например линию красную (0x00FF0000) он рисует как черную (пока только с этим пример давай поработаем) Я так и не нашел причину этой ошибки...
406
22 августа 2005 года
vitaly2003s
481 / / 27.07.2004
Ну вобщето не в моем а в твоем коде была куча ошибок,и я их всех не исправлял естественно думал ты сам справишся. Проблема была при инициализации буфера. Юзай новый CodeLines.сpp. там буфер инициализируется теперь правильно.
249
22 августа 2005 года
DissDoc
639 / / 01.10.2004
Цитата:
Originally posted by vitaly2003s
Ну вобщето не в моем а в твоем коде была куча ошибок,и я их всех не исправлял естественно думал ты сам справишся. Проблема была при инициализации буфера. Юзай новый CodeLines.сpp. там буфер инициализируется теперь правильно.



Мдя.. вот уже месяц с винапи мучаюсь, каждый раз что-то новое =((( Хоть бы терпения хватило!
Спасибо, более-менне начал вникать...

406
23 августа 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by DissDoc
Мдя.. вот уже месяц с винапи мучаюсь, каждый раз что-то новое =((( Хоть бы терпения хватило!
Спасибо, более-менне начал вникать...


Ну а ты чего хотел за месяц весь вин апи выучить чтоль. Я его уже 3 года юзаю и до сих пор не могу знать что знаю хотя бы половину его.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог