Add(Button,3183747,77,462)
{
Left=5
Top=470
Caption="Поиск"
link(onClick,8272130:doEvent1,[])
}
Add(Label,16719776,329,469)
{
Left=235
Top=435
Width=97
Height=22
Caption="ms"
}
Add(Hub,8272130,161,462)
{
OutCount=4
link(onEvent1,14227323:##add,[(203,468)(203,412)])
link(onEvent2,13352437:doEvent1,[])
link(onEvent3,14728094:In,[(185,482)(185,503)])
link(onEvent4,8584492:doTimer,[(188,489)(188,76)])
}
Add(Label,2751625,756,455)
{
Left=10
Top=445
Width=85
Caption="Мышь"
}
Add(Timer,10241311,420,455)
{
Interval=100
Enable=1
link(onTimer,2407579:doString,[])
}
Add(FormatStr,2407579,714,455)
{
Mask="Х = %1 | Y = %2"
link(onFString,2751625:doText,[])
link(Str1,2362061:Var1,[])
link(Str2,2362061:Var2,[])
}
Add(FormatStr,4171558,791,413)
{
Mask="X=%1 Y=%2"
Point(FString)
link(onFString,15336817:doText,[])
link(Str1,15072728:GetData,[])
}
Add(Label,15336817,840,413)
{
Left=130
Top=440
Width=85
Caption="Результат"
}
Add(StrCat,3796541,280,469)
{
Str2=" мсек"
link(onStrCat,16719776:doText,[])
}
Add(SizeWindow,10540619,231,469)
{
Width=1024
Height=768
link(Handle,14227323:##count,[])
}
Add(Hub,4055485,140,420)
{
InCount=2
OutCount=3
link(onEvent1,14227323:doStop,[])
link(onEvent2,5903204:In,[(161,433)(161,447)])
link(onEvent3,8584492:doStop,[(315,440)(315,83)])
}
Add(GHotKey,13601760,77,420)
{
Alt=1
Key=88
Point(doAlt)
Point(doKey)
link(onEventHotKey,4055485:doEvent1,[])
}
Add(Label,10533358,14,56)
{
Left=70
Top=470
Width=98
Height=17
Caption="Остановить Alt + X"
}
Add(Label,16439978,287,350)
{
Left=185
Top=470
Width=410
Caption=""
}
Add(Hub,8374006,196,350)
{
OutCount=3
link(onEvent1,933422:doWork1,[])
link(onEvent2,13601760:doStartHotKey,[(222,363)(222,387)(72,387)(72,426)])
}
Add(LineBreak,12210862,371,448)
{
Caption="On"
link(Out,10241311:doTimer,[(411,454)(411,461)])
Primary=[14728094,-189,49]
}
Add(LineBreak,13374515,371,497)
{
Caption="Off"
link(Out,10241311:doStop,[(411,503)(411,468)])
Primary=[5903204,-203,-56]
}
Add(MultiElementEx,14227323,231,406)
{
Mode=1
link(onEvent,2362061:doWork1,[])
link(onStop,3796541:doStrCat,[(275,419)(275,475)])
link(Handle,933422:Var1,[])
link(subBitmap,3220404:ImageBitmap,[(244,396)(762,396)])
}
BEGIN_SDK
Add(EditMultiEx,10129213,3,3)
{
WorkCount=#19:##add=Запуск поиска|33:##select=Выбор запущенного поиска|22:doStop=Выключает поиск|
EventCount=#27
nEvent=Координаты цели X Y|33
nStop=Время затраченное на поиск|
VarCount=#33:##count=Содержит индефикатор окна|
DataCount=#24:Handle=Хендл окна танков|29:subBitmap=Картинка для поиска|
Width=391
Height=172
VOffset=100
HOffset=100
Point(##add)
Point(##select)
Point(##count)
link(##add,11379391:doTimer,[(68,109)(68,111)])
link(doStop,11379391:doStop,[(68,123)(68,118)])
link(##count,13129097:Var2,[(109,134)(116,134)])
}
Add(InlineCode,4095621,259,98)
{
WorkPoints=#12:doFindBitmap|
EventPoints=#8
nResult|3:dbg|0
DataPoints=#6:Bitmap|9:subBitmap|
Code=#15:unit HiAsmUnit;|0
9:interface|0
29:uses Windows,kol,Share,Debug;|0
4:type|40: TByteArray = array [0..32767] of Byte;|27: PByteArray = ^TByteArray;|35: TBuf = array of array of integer;|15: FRes = record|19: found: boolean;|17: x,y: integer;|6: end;|14: WH2 = record|43: Width1,Height1,Width2,Height2: integer;|6: end;|2: |28: THiAsmClass = class(TDebug)|10: private|0
9: public|12: Bitmap,|15: subBitmap,|30: onResult, dbg: THI_Event;|57: procedure doFindBitmap(var _Data:TData; Index:word);|65: function CompareIMG(var buf1:TBuf; buf2:TBuf; WH:WH2): FRes;|5: end;|0
14:implementation|0
40:function LoagIMG(var Bmp
Bitmap) :TBuf;|3:var|17: x,y,c: integer;|16: p: pByteArray;|15: buffer: TBuf;|5:begin|36: Bmp.PixelFormat:=pf24Bit;//pf8Bit;|43: SetLength(buffer, Bmp.Height, Bmp.Width);|35: for y:=0 to Bmp.Height-1 do begin|23: p:=Bmp.ScanLine[y];|36: for x:=0 to Bmp.Width-1 do begin|52: c:=((p[x*3+0] shl 8+p[x*3+1]) shl 8)+p[x*3+2];|21: buffer[y,x]:=c;|8: end;|6: end;|19: Result := buffer;|4:end;|0
72:function THiAsmClass.CompareIMG(var buf1:TBuf; buf2:TBuf; WH:WH2): FRes;|3:var|37: y, x, yy, xx, err, maxerr: integer;|5:begin|56: maxerr:=200; //максимальная ошибка = в диапазоне 0-726|22: Result.found:=false;|7: y:=0;|8: repeat|9: x:=0;|10: repeat|25: Result.found:=true;|12: yy:=0;|12: repeat|14: xx:=0;|14: repeat|55: //Result.found:=buf1[y+yy, x+xx]=buf2[yy,xx];|71: err:=abs(byte(buf1[y+yy, x+xx]) - (buf2[yy,xx] and $0000ff))+|91: abs((buf1[y+yy, x+xx] and $00ff00 shr 8) - (buf2[yy,xx] and $00ff00 shr 8))+|93: abs((buf1[y+yy, x+xx] and $ff0000 shr 16) - (buf2[yy,xx] and $ff0000 shr 16));|49: if err>maxerr then Result.found:=false;|18: inc(xx);|52: until (xx>=WH.Width2) or (Not Result.found);|16: inc(yy);|51: until (yy>=WH.Height2) or (Not Result.found);|13: inc(x);|52: until (x>WH.Width1-WH.Width2) or (Result.found);|11: inc(y);|52: until (y>WH.Height1-WH.Height2) or (Result.found);|28: if Result.found then begin|18: Result.x:=x-1;|18: Result.y:=y-1;|6: end;|4:end;|0
35:procedure THiAsmClass.doFindBitmap;|3:var|24: Bmp, subbmp
Bitmap;|21: FindResult: FRes;|21: buf1, buf2: TBuf;|12: WH: WH2;|16: dt,di:TData;|5:begin|36: Bmp := ReadBitmap(_Data,Bitmap);|42: if (Bmp = nil) or Bmp.Empty then exit;|42: subbmp := ReadBitmap(_Data,subBitmap);|48: if (subbmp = nil) or subbmp.Empty then exit;|73: if (Bmp.Width<subbmp.Width) or (Bmp.Height<subbmp.Height) then exit;|4: |25: buf1 := LoagIMG(Bmp);|25: WH.Width1:=Bmp.Width;|27: WH.Height1:=Bmp.Height;|15: //Bmp.Free;|4: |28: buf2 := LoagIMG(subbmp);|28: WH.Width2:=subbmp.Width;|30: WH.Height2:=subbmp.Height;|22: //subbmp.Free; |4: |43: FindResult:=CompareIMG(buf1, buf2, WH);|4: |15: dtNull(dt);|15: dtNull(di);|34: if FindResult.found then begin|53: dtInteger(dt,FindResult.x+(WH.width2 div 2));|54: dtInteger(di,FindResult.y+(WH.height2 div 2));|24: dt.ldata := @di;|35: _hi_onEvent(onResult, dt); |8: end;|4:end;|4:end.|
link(onResult,5695768:doEvent1,[(300,104)(300,146)])
link(Bitmap,2561111:Bitmap,[])
link(subBitmap,13129097:Var3,[(272,89)])
}
Add(TimeCounter,10552413,210,105)
{
link(onStart,4095621:doFindBitmap,[(250,111)(250,104)])
link(onStop,10129213
nStop,[(322,118)(322,116)])
}
Add(Hub,5695768,308,140)
{
link(onEvent1,10552413:doStop,[(334,146)(334,139)(198,139)(198,118)])
link(onEvent2,10129213
nEvent,[(362,153)(362,109)])
}
Add(ScreenShort,13817426,217,28)
{
link(onCapture,2561111:doLoad,[])
link(Handle,10129213:Handle,[(223,16)(109,16)])
}
Add(Bitmap,2561111,259,28)
{
}
Add(Timer,11379391,133,105)
{
Interval=1
Point(doInterval)
link(onTimer,152795:doEvent1,[(173,111)(173,34)])
}
Add(Hub,152795,182,28)
{
link(onEvent1,13817426:doCapture,[])
link(onEvent2,10552413:doStart,[(203,41)(203,111)])
}
Add(GetDataEx,13129097,110,84)
{
link(Data,10129213:subBitmap,[])
}
END_SDK
Add(MultiElement,933422,231,350)
{
link(onEvent1,16439978:doText,[])
}
BEGIN_SDK
Add(EditMulti,3079797,21,21)
{
EventCount=1
WorkCount=1
VarCount=1
link(doWork1,3751137:doFind,[(56,27)(56,132)])
link(Var1,3751137:Handle,[(27,186)(97,186)])
}
Add(WinEnum,3751137,91,119)
{
link(onFindWindow,9656870:doStrCat,[])
link(Caption,12863172:Value,[])
}
Add(Memory,12863172,91,70)
{
Default=String(WoT Client)
}
Add(StrCat,9656870,133,119)
{
Str1="Найдено окно: "
link(onStrCat,3079797
nEvent1,[(243,125)(243,27)])
}
Add(StyleXP,3667158,133,70)
{
}
END_SDK
Add(Hub,13352437,203,469)
{
link(onEvent1,10540619:doWidth,[])
link(onEvent2,10540619:doHeight,[])
}
Add(MultiElement,2362061,714,406)
{
link(onEvent1,15072728:doData,[(782,412)(782,363)])
link(onEvent2,4171558:doString,[])
}
BEGIN_SDK
Add(EditMulti,6401462,21,21)
{
EventCount=2
WorkCount=2
VarCount=2
Width=223
Height=144
link(doWork1,9272755:doEvent1,[(28,27)(28,41)])
link(doWork2,9483123:doClick,[(84,34)(84,118)])
link(Var1,9483123:MouseX,[(27,155)(153,155)])
link(Var2,9483123:MouseY,[(34,161)(160,161)])
}
Add(Hub,9272755,35,35)
{
link(onEvent1,238729:doSeparateMT,[])
link(onEvent2,9483123:doPosition,[(59,48)(59,132)])
}
Add(MouseEvent,9483123,147,112)
{
Point(doPosition)
link(X,9183133:Value,[(160,96)(139,96)])
link(Y,11531058:Value,[(167,107)(188,107)])
}
Add(MT_MultiData,238729,70,35)
{
link(onData1,9183133:doValue,[(125,41)(125,62)])
link(onData2,11531058:doValue,[(174,48)(174,69)])
}
Add(Memory,9183133,133,56)
{
link(onData,6401462
nEvent1,[(205,62)(205,27)])
}
Add(Memory,11531058,182,63)
{
link(onData,6401462
nEvent2,[(229,69)(229,34)])
}
END_SDK
Add(EventFromData,15072728,791,357)
{
}
Add(MainForm,11997614,91,336)
{
Width=635
Height=542
Caption="Пример использования BitmapArray"
link(onCreate,8374006:doEvent1,[])
}
Add(CounterEx,2644362,560,70)
{
Max=3
Default=-1
Point(doValue)
link(onNext,12807787:doEvent1,[])
}
Add(ArrayRW,5936639,756,70)
{
link(Array,7694442:Array,[])
}
Add(If_else,9463291,700,84)
{
link(onTrue,2644362:doValue,[(738,90)(738,121)(549,121)(549,83)])
link(Op1,7694442:Count,[(706,62)(769,62)])
}
Add(Hub,12807787,623,70)
{
OutCount=5
link(onEvent1,5936639:doRead,[])
link(onEvent2,9463291:doCompare,[(651,83)(651,90)])
link(onEvent3,6831312:doValue,[(645,90)(645,188)])
link(onEvent4,3220404:doLoad,[(654,97)(654,146)])
link(onEvent5,7694442:doGetName,[(659,104)(659,20)])
}
Add(Label,14677961,700,182)
{
Left=510
Top=5
Width=66
Height=17
Caption="Index vfssiva"
}
Add(BitmapArray,7694442,756,7)
{
Bitmaps=['arta'=[ZIPDA02000078DA9591BF6AC25014C6B5BBEFE0D827E80374F7456C15FC5795423015C1D8A19A41A89388228264AB936F50BE4141B06E66081A496D2236E0607ACEC5A1DB8D077E70B9E7FBEE3D7FEE13AB9B88883BE296885D8846E2E2BE7FC9FF0FD334617B1E7ECF677CFBBE383BC723768703FC20C0D675E19D4E7009CEB37E6018D03B1DBCB5DB5258F7DEEDA2D16AA15CA9A0A828A1D09A4DA89A86876C36148FB91C9E6B3528F53A52F93C92998C14F694AB55945415E942219487DF7EA23EB8B717AA4FE13F25A854D3ABAEE3633AC5603C466F349232A4191B93899837160B7CCEE75266CB25BED66BE1F9A15D6DF67B29BC5BD65B968580F61D16D6EF6CFB2A8F4D7AC771AEF2B0FE0F367FF2A6],'vboi'=[ZIPFE00000078DA73F2FDC700016640AC01C48A40CC04C48C0C1260F113407C840F8261E0EDDBF77575B359D827B2706C60E5DCCDCAB9978573170BC77656AE9DDC7C9D274E5C7CFBF6DDECD96B23222A2E5DBAF5F4E98B9D3B8F7A78E43032BB31736E64E5DAC5CD5BBE6EDDFEF7EF3F42D0BB771F3E7CF8F4EEDDC7B97337B073D5B0716E90966DFAFFE9D3E70D1BF6B171CF64E5390C446C3C4758F94EB0F21E63E5D9CDC2D93179F2F22F5FBE3C7DFA525CDC9581C19881C114E80346966866AE59ACBC7BD904CEB3F1EDE3E2CB2B2D9B74E4C8F9172F5E03D1A1436773F37AB8F84A5879B7036565153AFF03005CBE624B],'vlivo'=[ZIP4E06000078DA9D544D48545114B64DF7DE79F3A7E338338D33CD9499698ECE14236A414E1623932D846C61412B29422134940A09AA451415084528413F9B5645081531EBC2F816414821D1A66D8B88162DA2CE3DF7C13C6D9C6C1E7C3CDE7DE79EEF3BBFB9C1C31B6BF8C9125A081E429CB0A126C1E761FBBFF351CA82526E828F504BA8877285E91D85746D86F46D83F4B643D676427A5A0949FAA7089E55F68D902A41F6DB210319B40F4EE2EEA7DF189D2BD2FD1D0E0EB25721877D33210D153980F32F977103DF114A0D33574953A8A4C7A5F5A420EAF6E0E0C43DE6C84F3F800876D3798B6D1F246C22C421E556F625825D08741CC7F5B7DF3053FC0C152B40FA339056D3CA18E416F6237D1988D07E9CB85D648E8E239720EA7BC8571BDB188EA88941510C9E0ED2B417CD03D36C7FF2FE1BBADFCF7E382764A7548410B335B541F8BA20628730B5F011B34B3F11CA8E1A0EF74EB26962FD250EF2E1494384FBB06F7C9E390A171ED3778ECE8943B6D8BA1A4B1CE447D477C3DF3A82ABAFBFE2E2AB2F90C9213E93EE76934BCAA9CE1573E8B8BDBB59F7C8CDE7CCB1EBD8B51207D551FBD5FE75BEA46573502D92B949DC59FE85D30F17211A0620BCC461A58C6E99E438741D3957759A238FB34F9738EE68F718F9E8636ECEAFB6B175E9DAE8FC69CD3DA3B3AC69E8CA33D25480F0F71247DADCA1584CBE22E60E6915815E9C7BB1CCBA02E953F49D37BADCD4CB56AB23C791EA791CF14C3C796FC7335E399E72797BB468B8FECA5BA39DB784A32FD7A88F9E4F477DAAE983B2FD3636C75C83336BF5DBCABE96FE2CC732B5F0A1425FAF9A1F9EE97FCDCF3AE674F8F2AA39AD661F54DE3BFD67E6CBEC9DF5EDB75BEF7EA0A1F3A8BDDFAAD9A3FFBFAF5D2E57F97BAC33626A68C54D0F5866E7FC01EF880B97],'vpravo'=[ZIP8206000078DAA5544968535114AD1BFF7BF9998726354DDB38D45ACD684949AB60639594349B827551055741292D482B1695220E0B51542828D222386C5C2922A848D68A7216821425881BB72E445CB810BDFFBE9F26A669093170096F38FF9C73EF7D3793BFB0B1857F298A1E0A1B4527C586962EDE1F35CFAB7F52BA20A597C247E1AF0A63CF0D75EEA0B052E81416F33C08A97740583AF95FCA768AB62A6C2D6E13842D4CD10BE18A43D823108E6D0A6F7CCB12A8836BA77B3B50582CE2CEE73F88E467213C49C26D87905D8AF31F9C8DD621E6688D1FC6CDF73F71F66509B2ED00611214DD15DC8A4E87C2D87BA0F9D2C8CEDD67AEE1934BD0DC7B683F4A1AAB7432CEA5B4E95B219C49C8500EF3C52FB8F6EE3B3CB1A3F49D7EE5536CA17B1DEC5DE5973062339DED84E61D406CFC12731DBB5584E6DF4FFA92ACC3B853F11664CDEC99CE35FF308EDF7BC3B8EE9139D2B8576994656F41B30E541B41FAACBB98CB9F2A6061F9174E3FFB082D9023DD29D6A134864C5FA63E411A6CC415C8203FFF88B9F64D2DD27A88F6298FB29C7F9FAA2BE58673648D10571A223C86F3AFBEE2CAEB6F70F64EA83DD2A1B8DCA6AF10AF394F26D7EE2357996BE2C673F659CE87CA77595F58F1EB5168F6347B997CF816B74BBF11CECCAA9A1197EA216F459F911FC3AFBD8FEE0C21989EE67CCC3CFE405C5908775F15C6CC9FE1C9C0E80968CE41E61ABBFC94350E1416D8D72A8C91739D3C59E34A9F270B4FE204EB3BF3A244EBC1FFE459CBCF14FB39F564B9CA8F6BE5ADAECA5BEB08261FD4CB5B4D7DE8FDAD591FE256F569A60FEAF75BEE9CD96FD34B75FA6DBDBEFE042D340ACDD15FD3D70DBC1F5BACE6FDD4BCD343171B78A74DCC833A73E7E0CCDDF5E78E39DFFCD1715CC78FC6E65B3373B48979FD176AD71820]]
Point(doGetName)
Point(onGetName)
}
Add(Image,3220404,756,140)
{
Left=15
Top=10
Width=320
Height=290
link(Bitmap,5936639:Item,[])
}
Add(Label,11659058,14,7)
{
Left=345
Top=10
Width=132
Height=17
Caption="Имя картинки в массиве"
}
Add(Memory,6831312,658,182)
{
link(onData,14677961:doText,[])
}
Add(Timer,8584492,476,70)
{
Interval=3000
Enable=1
link(onTimer,2644362:doNext,[])
}