Win32API中有一个MAKELONG函数,其实是一个宏,其介绍如:
MAKELONG macro creates an unsigned 32-bit value by concatenating two given 16-bit values.
DWORD MAKELONG(
WORD wLow, // low-order word of long value
WORD wHigh // high-order word of long value
);
大概是将两个16位数值连接成一个32位无符号数值。
在很多地方,有用到例如 (Delphi语法):
var
li_row : Integer;
l_row : wparam;
begin
li_row := 1000; // 例如要滚动到1000行
l_row := MAKELONG(SB_THUMBPOSITION, li_row); // 转换,如果不转换,是滚动不了,API识别不了。
SendMessage(mle_record, WM_VSCROLL, l_row, 0); // 滚动到 mle_record 的 li_row 行
end;
可是在Win32汇编里面,却发现没有这个东西,经过简单试了一下,发现
MAKELONG(SB_THUMBPOSITION, li_row) 其实是相当于 li_row * 65536 + 4
这下好了,在Win32汇编里面也可以使用这样的公式来代替 MAKELONG 宏。
顺便把整理的写下来吧,如下:
xor esi,esi
mov esi,li_row
inc esi
mov li_row,esi
mov eax,li_row
mov ecx,65536D
mul ecx
mov li_row,eax
xor esi,esi
mov esi,li_row
add esi,4D
mov li_row,esi
invoke SendMessage,mle_record,WM_VSCROLL,li_row,0