Page 1 of 4
Курсоры
Posted: Sun Mar 25, 2007 9:58 pm
by Serial
Подскажите пожалуйста, как удалить курсор мыши в окне программы или заменить на другой курсор (только без использования .cur файлов). Курсор могу нарисовать попиксельно.. а как это все дело в структуру в памяти загнать не знаю..
Подфункция 4 - загрузить курсор
Параметры:
eax = 37 - номер функции
ebx = 4 - номер подфункции
dx = источник данных:
dx = LOAD_FROM_FILE = 0 - данные в файле
ecx = указатель на полный путь к файлу курсора
файл курсора должен быть в формате .cur, стандартном для MS Windows, причём размером 32*32 пикселя
dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
ecx = указатель на данные файла курсора
формат данных такой же, как и в предыдущем случае
dx = LOAD_INDIRECT = 2 - данные в памяти
ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
edx = 0xXXYY0002, где
XX = x-координата "горячей точки" курсора
YY = y-координата
0 ≤ XX, YY ≤ 31
Возвращаемое значение:
eax = 0 - неудача
иначе eax = хэндл курсора
Не знаю как это юзать
Posted: Sun Mar 25, 2007 10:16 pm
by Veliant
может так?
Code: Select all
mov eax,37
mov ebx,4
xor edx,edx
mov ecx,path
int 0x40
path db '/rd/1/cursor.cur'
Posted: Sun Mar 25, 2007 10:18 pm
by Serial
Veliant, дык говорю ж, что без использования внешних файлов.. ибо это ни к чему хорошему не приведет.
Posted: Sun Mar 25, 2007 11:04 pm
by Heavyiron
mov eax,37
mov ebx,4
mov edx,2
mov ecx,cur
int 0x40
cur:
db 0xaa, 0xrr, 0xgg, 0xbb ... так 32 раза
db ... так 32 строки
где аа - значение альфа-канала, rr - красный, gg - зеленый, bb - синий для каждого (!) пиксела
А вообще это мазохизм
Проще файл считать и не мучаться
Posted: Mon Mar 26, 2007 1:08 am
by Serial
Heavyiron wrote:А вообще это мазохизм
Проще файл считать и не мучаться
Я лублу помучаться..
Если не секрет, а как эта структура на сишке выглядеть будет? Типа такого?
Code: Select all
char cur[32][4*32];
// или даже так
typedef unsigned __int32 Dword;
Dword cur[32][32];
Posted: Mon Mar 26, 2007 2:27 am
by Serial
Ошибка при линковке через VS2005
Code: Select all
void ChangeCursor()
{
char cur[32*32*4];
__asm{
mov eax, 37
mov ebx, 4
mov edx, 0x05050002
mov ecx, cur
int 0x40
}
}
game.obj : error LNK2019: unresolved external symbol __chkstk referenced in function "void __cdecl ChangeCursor(void)" (?ChangeCursor@@YAXXZ)
Posted: Mon Mar 26, 2007 11:34 am
by Serge
Serial
Ты решил загрузить курсор из стека ? Там сплошной мусор.
И чем тебе не нравятся cur ? Их можно в VC сделать.
Ладно, если тебе нравится raw ARGB, сохраняешь образ в файл и делаешь заглушку на асме
Code: Select all
format MS COFF
public cursor1
public cursor2
section '.data' align 16 data readable writable
cursor1:
file 'cursor1.raw'
cursor2:
file 'cursor2.raw'
Posted: Mon Mar 26, 2007 12:19 pm
by Serial
Serge wrote:Serial
Ты решил загрузить курсор из стека ? Там сплошной мусор.
И чем тебе не нравятся cur ? Их можно в VC сделать.
Вот только что отладил работу...
Code: Select all
Dword *cur = new Dword[1024];
for (int i = 0; i < 1024; i++)
{
cur[i] = 0x00000000;
}
delete[] cur;
И кстати.. отказался от красивого курсора с помощью API
ибо он очень сильно мерцает. Сделал его прозрачным, и буду рисовать курсор вручную в окне приложения.
Всем спасибо за помощь!
Posted: Mon Mar 26, 2007 1:45 pm
by Serge
Serial
Он мерцает там где нет аппаратного курсора. А там где он есть начнёт мерцать твой вариант
Posted: Mon Mar 26, 2007 8:46 pm
by Serial
Serge wrote:Serial
Он мерцает там где нет аппаратного курсора. А там где он есть начнёт мерцать твой вариант
а где есть аппаратный курсор?
Posted: Mon Mar 26, 2007 8:54 pm
by Heavyiron
в ati видеокартах radeon 9ххх
Posted: Mon Mar 26, 2007 9:41 pm
by Serial
Heavyiron wrote:в ati видеокартах radeon 9ххх
Хм.. а это уже интересно
Но всё равно имхо большинство юзеров будут с другими видюхами.
[офф]Кстати, тяжело ли написать подобный драйвер для NVidia?[/офф]
Posted: Mon Mar 26, 2007 9:48 pm
by Heavyiron
Posted: Mon Mar 26, 2007 10:50 pm
by Serge
Точнее аппаратный курсор должен работать на ATI 7500 - x850 и не работать на новых х1000+
Posted: Mon Mar 26, 2007 11:12 pm
by Serial
На сколько я понял по постам
Serge, проблема только в отсечении курсора?