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ххх
Хм.. а это уже интересно 8)
Но всё равно имхо большинство юзеров будут с другими видюхами.

[офф]Кстати, тяжело ли написать подобный драйвер для 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, проблема только в отсечении курсора?