PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » свой курсор


свой курсор

Сообщений 1 страница 4 из 4

1

функция CreateCursor() требует два массива
немогу понять что это за код, откуда он берётся?
надо думать это картинка как то зашифрвана

Код:
BYTE ANDmaskCursor[] =
{
	0xFF, 0xFC, 0x3F, 0xFF,   // строка1
	0xFF, 0xC0, 0x1F, 0xFF,   // строка 2
	0xFF, 0x00, 0x3F, 0xFF,   // строка 3
	0xFE, 0x00, 0xFF, 0xFF,   // строка 4
        ......
BYTE XORmaskCursor[] =
{
	0x00, 0x00, 0x00, 0x00,   // строка 1
	0x00, 0x03, 0xC0, 0x00,   // строка 2
	0x00, 0x3F, 0x00, 0x00,   // строка 3
	0x00, 0xFE, 0x00, 0x00,   // строка 4
        ......

это лучшее что нашлось

0

2

newJS написал(а):

надо думать это картинка как то зашифрвана

Не то, чтобы зашифрована. Просто  так закодирована, чтобы было определённо видимые пиксели курсора и прозрачные. Вод простейший код

Код:
OpenWindow(0,0,0,320,240,"Test")

  AndMask=AllocateMemory(32*4)
  FillMemory(AndMask,32*4,$ff)
  
  XorMask=AllocateMemory(32*4)
  FillMemory(XorMask,32*4,$00)
  
hCur = CreateCursor_(GetModuleHandle_(0), 0, 0, 32,32, AndMask, XorMask)
SetClassLong_(WindowID(0), #GCL_HCURSOR, hCur)

Repeat
  StartDrawing(WindowOutput(0))
    Circle(WindowMouseX(0),WindowMouseY(0),5,#Red)
  StopDrawing()
Until WaitWindowEvent(1) = #PB_Event_CloseWindow

DestroyCursor_(hCur)

Тут курсор весь прозрачный. Поиграйся с заполнением обеих масок и станет понятно.

Реально, если курсор не весь прозрачный, как в этом примере, то удобно его положить в Data секцию.

0

3

Спасибо, это хоть что то, но пока непонятно как готовую картинку преобразовать
надо думать что сначала люди картинку рисуют, а не в лоб этот хитрожопый код создают

это похоже на группы по три байта и четвёртый байт маска

Код:
BYTE ANDmaskCursor[] =
{
	0xFF, 0xFC, 0x3F, 0xFF,   // строка 1
	0xFF, 0xC0, 0x1F, 0xFF,   // строка 2
	0xFF, 0x00, 0x3F, 0xFF,   // строка 3
	0xFE, 0x00, 0xFF, 0xFF,   // строка 4
        ......
BYTE XORmaskCursor[] =
{
	0x00, 0x00, 0x00, 0x00,   // строка 1
	0x00, 0x03, 0xC0, 0x00,   // строка 2
	0x00, 0x3F, 0x00, 0x00,   // строка 3
	0x00, 0xFE, 0x00, 0x00,   // строка 4
        ......

это другая картинка от Климова на VB, тоже группы по три байта, плюс маска

Код:
andbuffer = 
            "FFFC3FFF" & "FFC01FFF" & "FF003FFF" & "FE00FFFF" & _
            "F701FFFF" & "F003FFFF" & "F003FFFF" & "E007FFFF" & _
            "C007FFFF" & "C00FFFFF" & "800FFFFF" & "800FFFFF" & _
            "8007FFFF" & "8007FFFF" & "0003FFFF" & "0000FFFF" & _
            "00007FFF" & "00001FFF" & "00000FFF" & "80000FFF" & _
            "800007FF" & "800007FF" & "C00007FF" & "C0000FFF" & _
            "E0000FFF" & "F0001FFF" & "F0001FFF" & "F8003FFF" & _
            "FE007FFF" & "FF00FFFF" & "FFC3FFFF" & "FFFFFFFF"
xorbuffer =
            "00000000" & "0003C000" & "003F0000" & "00FE0000" & _
            "0EFC0000" & "07F80000" & "07F80000" & "0FF00000" & _
            "1FF00000" & "1FE00000" & "3FE00000" & "3FE00000" & _
            "3FF00000" & "7FF00000" & "7FF80000" & "7FFC0000" & _
            "7FFF0000" & "7FFF8000" & "7FFFE000" & "3FFFE000" & _
            "3FC7F000" & "3F83F000" & "1F83F000" & "1F83E000" & _
            "0FC7E000" & "07FFC000" & "07FFC000" & "01FF8000" & _
            "00FF0000" & "003C0000" & "00000000" & "00000000"

P.S.
идея появилась
это RGBA
если это верно, то это каждый пиксель описан

Отредактировано newJS (28.12.2020 10:27:59)

0

4

разобрался, ВиниПур, спасибо, твой пинок оказался удачным
это битовый массив, размером 32х32
в обоих примерах одна картинка, только по разному нарисована
картинку можно только чёрно-белую, для меня интереса не представляет
не вижу смысла разбираться дальше как это сгенерить из своей картинки
эта функция грузит из файла цветной курсор LoadCursorFromFile_()
мне хотелось от внешнего файла избавиться

Код:

;{ macros
Macro q1(s):MessageRequester("", ""+s):EndMacro
Macro q2(s1, s2):MessageRequester(""+s1, ""+s2):EndMacro
Macro q3(s1, s2, f):MessageRequester(""+s1, ""+s2, f):EndMacro
Macro qs:MessageRequester("!!!", "Stop"):EndMacro
Macro q11:MessageRequester("Q11", "ПЕРВАЯ"):EndMacro
Macro q12:MessageRequester("Q12", "ВТОРАЯ"):EndMacro
Macro q13:MessageRequester("q13", "ТРЕТЬЯ"):EndMacro
Macro q14:MessageRequester("q14", "ЧЕТВЁРТАЯ"):EndMacro
Macro q15:MessageRequester("q15", "ПЯТАЯ"):EndMacro
#W=1234
Global tb.s=#TAB$
Global cr.s=#CRLF$, cr2.s=cr+cr, cr1.s=Chr(10)
Global qt.s=Chr(34), qt2.s=qt+qt; кавычка
Global pb.s=" ", pb2.s="  ", pb3.s="   "
Global pd.a=5, pd2.a=pd*2, pd3.a=pd*3; это типа паддинг
Global any=#PB_Any
Procedure bGet(a, z=5):ProcedureReturn GadgetHeight(a)+GadgetY(a)+z:EndProcedure
Procedure rGet(a, z=5):ProcedureReturn GadgetWidth(a)+GadgetX(a)+z:EndProcedure
;}

EnableExplicit

Procedure imo(wnd)
Protected y, Result, re.RECT, pt.POINT
GetWindowRect_(GadgetID(wnd), @re)
GetCursorPos_(@pt)
Result = PtInRect_(@re, pt\x|(pt\y<<32))
ProcedureReturn Result
EndProcedure

Procedure senior()
Protected ev, eg, em, et, Dim ab1.a(127), Dim xb1.a(127), Dim ab2.a(127), Dim xb2.a(127), s1.s, s2.s, k1, k2, u, n
If OpenWindow(#W, 870, 640, 400, 300, "")
AddKeyboardShortcut(#W, #PB_Shortcut_Escape, 0); ESC
ButtonGadget(21, 9, 9, 333, 55, "")
ButtonGadget(23, 9, 69, 333, 55, "")

;{
s1="FFFC3FFFFFC01FFFFF003FFFFE00FFFFF701FFFFF003FFFFF003FFFFE007FFFF"
s1+"C007FFFFC00FFFFF800FFFFF800FFFFF8007FFFF8007FFFF0003FFFF0000FFFF"
s1+"00007FFF00001FFF00000FFF80000FFF800007FF800007FFC00007FFC0000FFF"
s1+"E0000FFFF0001FFFF0001FFFF8003FFFFE007FFFFF00FFFFFFC3FFFFFFFFFFFF"
s2="000000000003C000003F000000FE00000EFC000007F8000007F800000FF00000"
s2+"1FF000001FE000003FE000003FE000003FF000007FF000007FF800007FFC0000"
s2+"7FFF00007FFF80007FFFE0003FFFE0003FC7F0003F83F0001F83F0001F83E000"
s2+"0FC7E00007FFC00007FFC00001FF800000FF0000003C00000000000000000000"
For k1=0 To 127
ab1(k1)=Val("$"+Mid(s1, 2*k1+1, 2))
xb1(k1)=Val("$"+Mid(s2, 2*k1+1, 2))
;Debug ""+Hex(ab(k))+pb+Hex(xb(k))
Next
;}
k1=CreateCursor_(WindowID(#W), 15, 15, 32, 32, @ab1(0), @xb1(0))

;{
s1="FFFFFFFFFFFFC3FFFFFF00FFFFFE007FFFFC001FFFF8000FFFF8000FFFF00007"
s1+"FFF00003FFE00003FFE00001FFE00001FFF00001FFF00000FFF80000FFFC0000"
s1+"FFFF0000FFFF8000FFFFE000FFFFE001FFFFF001FFFFF001FFFFF003FFFFE003"
s1+"FFFFE007FFFFC00FFFFFC00FFFFF801FFFFF007FFFFC00FFFFF803FFFFFC3FFF"
s2="0000000000000000000000000000000000000000000000000000000000003800"
s2+"00007C0000007C0000007C000000380000000000000000000000000000000000"
s2+"0000000000000000000000000000000000000000000000000000000000000000"
s2+"0000000000000000000000000000000000000000000000000000000000000000"
For k2=0 To 127
ab2(k2)=Val("$"+Mid(s1, 2*k2+1, 2))
xb2(k2)=Val("$"+Mid(s2, 2*k2+1, 2))
;Debug ""+Hex(ab(k))+pb+Hex(xb(k))
Next
;}
k2=CreateCursor_(WindowID(#W), 15, 15, 32, 32, @ab2(0), @xb2(0))


Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu And em=0:Break:EndIf; ESC

If ev=#PB_Event_Gadget

EndIf

If ev=#WM_MOUSEMOVE
If imo(21):SetCursor_(k1):EndIf
If imo(23):SetCursor_(k2):EndIf

EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » свой курсор