Графика и мышь в Turboc + Ассемблер

Тема в разделе "Общие вопросы по С и С++", создана пользователем XIII, 14 окт 2007.

Наш партнер Genesis Hackspace
Статус темы:
Закрыта.
  1. XIII

    XIII Гость

    Здравствуйте.

    Компилятор Turbo C 3.1 и встроенный ассемблер.

    В программе необходимо использовать стандартные функции для работы с графикой [line, arc, rectangle и пр.] и в то же время работать с мышью [ничего другого, как написать обработчик на ассемблере, в голову не пришло].

    При вызове этих функций выводится сообщение о том, что неинициализирован графический режим.
    Если просто заменить SetVideoMode на initgraph, то курсор мыши отображается неверно, т.е. разноцветным квадратом.

    Подскажите, пожалуйста, как можно заменить функцию SetVideoMode на initgraph [функция из graphics.h] или какие изменения в ассемблерном коде необходимо сделать для того, чтобы курсор мыши отображался корректно.

    Файл main.c
    Код (Text):
    #include <stdio.h>
    #include "mouse.cpp"
    #include <graphics.h>

    int DoneFlag;

    CursorShape new_cursor = {
    0x0FFF, 0x07FF, 0x01FF, 0x007F, 0x801F, 0xC007,
    0xC001, 0xE000, 0xE0FF, 0xF0FF, 0xF0FF, 0xF5FF,
    0xF8FF, 0xFCFF, 0xFCFF, 0xFEFF, 0x0000, 0x6000,
    0x7800, 0x3E00, 0x3F80, 0x1FE0, 0x1FF8, 0x0FFE,
    0x0F00, 0x0700, 0x0700, 0x0300, 0x0300, 0x0100,
    0x0100, 0x0000, 1,1
    };

    #pragma argsused

    void WaitPress(int mask, int button, int x, int y)
    {
    if(mask & MOUSE_RBUTTON_PRESS)
    DoneFlag = 1;
    }

    int main(void)
    {
    SetVideoMode(0x12);
    ResetMouse();
    ShowMouseCursor();
    SetMouseShape(new_cursor);
    SetMouseHandler(WaitPress);
    // Do smth
    HideMouseCursor();
    RemoveMouseHandler();
    SetVideoMode(3);

    return 0;
    }
    Файл mouse.cpp
    Код (Text):
    #include <alloc.h>
    #include <conio.h>
    #include <stdio.h>

    #pragma inline
    #define MOUSE_MOVE_MASK     0x01
    #define MOUSE_LBUTTON_PRESS     0x02
    #define MOUSE_LBUTTON_RELEASE   0x04
    #define MOUSE_RBUTTON_PRESS     0x08
    #define MOUSE_RBUTTON_RELEASE   0x10
    #define MOUSE_MBUTTON_PRESS     0x20
    #define MOUSE_MBUTTON_RELEASE   0x40
    #define MOUSE_ALL_EVENTS        0x7F

    struct MouseState{
    int x, y;
    int buttons;
    };

    struct CursorShape{
    unsigned AndMask [16];
    unsigned XorMask [16];
    int HotX, HotY;
    };

    typedef void (*MouseHandler)(int, int, int, int);
    int ResetMouse(void);
    void SetVideoMode(int);
    void ShowMouseCursor(void);
    void ReadMouseState(MouseState &);
    void SetMouseShape(CursorShape &);
    void SetMouseHandler(MouseHandler, int = MOUSE_ALL_EVENTS);
    void RemoveMouseHandler(void);

    static MouseHandler CurHandler = NULL;

    int ResetMouse(void)
    {
    asm {
    xor ax, ax
    int 33h
    }
    return _AX==0xFFFF;
    }

    void ShowMouseCursor(void)
    {
    asm {
    mov ax, 1
    int 33h
    }
    }

    void ReadMouseState(MouseState &s)
    {
    asm {
    mov ax, 3
    int 33h
    }

    #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
    asm {
    push es
    push di
    les di, dword ptr s
    mov es:[di ], cx                    // x
    mov es:[di+2], dx                   // y
    mov es:[di+4], bx                   // button
    pop di
    pop es
    }
    #else                                                   // short address (without seg)
    asm {
    push di
    mov di, word ptr s
    mov [di ], cx
    mov [di+2], dx
    mov [di+4], bx
    pop di
    }
    #endif
    }

    void SetMouseShape(CursorShape &c)
    {
    #if defined(__COMPACT ) || defined(__LARGE__) || defined(__HUGE__)
    asm {
    push es
    push di
    les di, dword ptr c
    mov bx, es:[di+16]
    mov cx, es:[di+18]
    mov dx, di
    mov ax, 9
    int 33h
    pop di
    pop es
    }
    #else
    asm {
    push di
    mov di, word ptr c
    mov bx, [di+16]
    mov cx, [di+18]
    mov dx, di
    mov ax, 9
    int 33h
    pop di
    }
    #endif
    }

    static void far MouseStub(void)
    {
    asm {
    push ds // preserve ds
    push ax // preserve ax
    mov ax, seg CurHandler
    mov ds, ax
    pop ax // restore ax
    push dx // �
    push cx // x
    push bx // button state
    push ax // event mask
    call CurHandler
    add sp, 8 // clear stack
    pop ds
    }
    }

    void SetMouseHandler(MouseHandler h, int mask)
    {
    void far *p = MouseStub;
    CurHandler = h;
    asm {
    push es
    mov ax, 0Ch
    mov cx, mask
    les dx, p
    int 33h
    pop es
    }
    }

    void RemoveMouseHandler(void)
    {
    CurHandler = NULL;
    asm {
    mov ax, 0Ch
    mov cx, 0
    int 33h
    }
    }

    void SetVideoMode(int mode)
    {
    asm {
    mov ah, 0
    mov al, mode
    int 10h
    }
    }
     
Загрузка...
Похожие Темы - Графика мышь Turboc
  1. MatthewK
    Ответов:
    0
    Просмотров:
    26
  2. Lers
    Ответов:
    0
    Просмотров:
    1.675
  3. 203
    Ответов:
    2
    Просмотров:
    1.509
Статус темы:
Закрыта.

Поделиться этой страницей