窗口操作的几个重要的函数

00D45712 8BCE MOV ECX,ESI
00D45714 FF15 843DDB00 CALL DWORD PTR DS:[<&w60oper.?_RestoreWindow@CGisView@@QAEXXZ>] ; w60oper.?

_RestoreWindow@CGisView@@QAEXXZ

restorewindow 复位窗口 w60oper.dll

100023A0 > 83EC 20 SUB ESP,20 ; restorewindow 复位窗口 w60oper.dll
100023A3 8D4424 00 LEA EAX,DWORD PTR SS:[ESP]
100023A7 56 PUSH ESI
100023A8 8BF1 MOV ESI,ECX
100023AA 50 PUSH EAX
100023AB E8 40010000 CALL w60oper.?_GetWinMapRange@CGisView@@QAEFPAUD_RECT@@@Z
100023B0 66:85C0 TEST AX,AX
100023B3 74 43 JE SHORT w60oper.100023F8
100023B5 8B46 4C MOV EAX,DWORD PTR DS:[ESI+4C]
100023B8 85C0 TEST EAX,EAX
100023BA 74 09 JE SHORT w60oper.100023C5
100023BC 8B4E 20 MOV ECX,DWORD PTR DS:[ESI+20]
100023BF 51 PUSH ECX
100023C0 E8 9B540000 CALL w60oper.#1003
100023C5 8B56 20 MOV EDX,DWORD PTR DS:[ESI+20]
100023C8 6A 00 PUSH 0
100023CA 52 PUSH EDX
100023CB C746 4C 0000000>MOV DWORD PTR DS:[ESI+4C],0
100023D2 E8 99490000 CALL w60oper.#1000
100023D7 8D4424 04 LEA EAX,DWORD PTR SS:[ESP+4]
100023DB 8BCE MOV ECX,ESI
100023DD 50 PUSH EAX
100023DE E8 9D000000 CALL w60oper.?_SetWinDispRect@CGisView@@QAEFPAUD_RECT@@@Z
100023E3 8BCE MOV ECX,ESI
100023E5 E8 B6F0FFFF CALL w60oper.?_PopupWinImage@CGisView@@QAEXXZ
100023EA 8B4E 20 MOV ECX,DWORD PTR DS:[ESI+20]
100023ED 6A 01 PUSH 1
100023EF 6A 00 PUSH 0
100023F1 51 PUSH ECX
100023F2 FF15 F8C20010 CALL DWORD PTR DS:[<&USER32.InvalidateRect>] ; user32.InvalidateRect
100023F8 5E POP ESI
100023F9 83C4 20 ADD ESP,20
100023FC C3 RETN
movewindow 移动窗口 w60oper.dll
10002340 > 56 PUSH ESI ; movewindow 移动窗口 w60oper.dll
10002341 8BF1 MOV ESI,ECX
10002343 8B46 4C MOV EAX,DWORD PTR DS:[ESI+4C]
10002346 85C0 TEST EAX,EAX
10002348 74 09 JE SHORT w60oper.10002353
1000234A 8B46 20 MOV EAX,DWORD PTR DS:[ESI+20]
1000234D 50 PUSH EAX
1000234E E8 0D550000 CALL w60oper.#1003
10002353 8B56 20 MOV EDX,DWORD PTR DS:[ESI+20]
10002356 C746 4C FBDF000>MOV DWORD PTR DS:[ESI+4C],0DFFB
1000235D 8B0D 38020110 MOV ECX,DWORD PTR DS:[10010238] ; db60_Ora.0057063F
10002363 51 PUSH ECX
10002364 52 PUSH EDX
10002365 E8 A6540000 CALL w60oper.#1002
1000236A 5E POP ESI
1000236B C3 RETN
几个重要的函数
//移动窗口
virtual short _MoveWindowLxy(long dx,long dy);
virtual short _MoveWindowFxy(double dx,double dy);
//跳转窗口到
virtual short _GotoWindowFxy(double x,double y);
//取、设置视窗口参数
short _GetWinDispParam(WIN_ORG *wxy);
short _SetWinDispParam(WIN_ORG *wxy);
short _SetWinDispRate(double rate);
double _GetWinDispRate(void);

WIN_ORG窗口参数
typedef struct
{
double x0,y0; //视口左下角(原点)
D_RECT frc; //显示范围
double r; //显示比例
}WIN_ORG;
占7个 DOUBLE

*_GetWinDispParam(WIN_ORG wxy);

10002090 > 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] ; _GetWinDispParam(WIN_ORG *wxy);
10002094 8B49 20 MOV ECX,DWORD PTR DS:[ECX+20]
10002097 50 PUSH EAX
10002098 51 PUSH ECX
10002099 E8 82720000 CALL w60oper.#10
1000209E C2 0400 RETN 4
*_SetWinDispParam(WIN_ORG wxy);

10002510 > 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] ; _SetWinDispParam(WIN_ORG *wxy);
10002514 8B49 20 MOV ECX,DWORD PTR DS:[ECX+20]
10002517 50 PUSH EAX
10002518 51 PUSH ECX
10002519 E8 626E0000 CALL w60oper.#11
1000251E C2 0400 RETN 4
_MoveWindowFxy(double dx,double dy);
100021E0 >/$ 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] ; _MoveWindowFxy(100.0,200.0);
100021E4 |. 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C]
100021E8 |. 50 PUSH EAX
100021E9 |. 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
100021ED |. 52 PUSH EDX
100021EE |. 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C]
100021F2 |. 50 PUSH EAX
100021F3 |. 8B41 20 MOV EAX,DWORD PTR DS:[ECX+20]
100021F6 |. 52 PUSH EDX
100021F7 |. 50 PUSH EAX
100021F8 |. E8 F3800000 CALL w60oper.#27
100021FD . C2 1000 RETN 10
调用方式如下
00401553 |. 68 00006940 PUSH 40690000 ; 200
00401558 |. 6A 00 PUSH 0
0040155A |. 68 00005940 PUSH 40590000 ; 100
0040155F |. 6A 00 PUSH 0
00401561 |. 8BCE MOV ECX,ESI
00401563 |. FF92 B0010000 CALL DWORD PTR DS:[EDX+1B0] ; 调用_MoveWindowFxy
_GotoWindowFxy(double x,double y)

100020D0 >/$ 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] ; _GotoWindowFxy(double x,double y)
100020D4 |. 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C]
100020D8 |. 50 PUSH EAX
100020D9 |. 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
100020DD |. 52 PUSH EDX
100020DE |. 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C]
100020E2 |. 50 PUSH EAX
100020E3 |. 8B41 20 MOV EAX,DWORD PTR DS:[ECX+20]
100020E6 |. 52 PUSH EDX
100020E7 |. 50 PUSH EAX
100020E8 |. E8 B3800000 CALL w60oper.#28
100020ED . C2 1000 RETN 10
调用方式
00401569 |. 8B06 MOV EAX,DWORD PTR DS:[ESI]
0040156B |. 68 00006940 PUSH 40690000
00401570 |. 6A 00 PUSH 0
00401572 |. 68 00005940 PUSH 40590000
00401577 |. 6A 00 PUSH 0
00401579 |. 8BCE MOV ECX,ESI
0040157B |. FF90 B4010000 CALL DWORD PTR DS:[EAX+1B4] ; <JMP.&w60oper.?_GotoWindowFxy@CGisView@@UAEFNN@Z>
下面的代码调到窗口坐标的200,200
PUSH 40690000
push 0
PUSH 40690000
push 0
mov ecx,229c418 //ecx需要计算
call 0a820d0 //调用_GotoWindowFxy直接跳转到200,200窗口坐标位置
下面的代码移动窗口200,200的坐标
PUSH 40690000
push 0
PUSH 40690000
push 0
mov ecx,229c418 //ecx需要计算
call 0a821e0 //调用_MoveWindowFxy,这个是每次移动200,200的距离
如下面两幅图,图面坐标是2557,41242 调用GotoWindowFxy之后图面坐标变为200,200

在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/haodawei123/article/details/87832423