-----------------------------------------------------------------------
[BUG/PRB.] VFP 9.0 FIX - FIX THE CURSOR POSITION IS TOO SMALL
January 2026
-----------------------------------------------------------------------
CCB
1. BUG:
In vfp9 (and vfp6, vfp7, vfp8), the cursor position is too small when set scaling to greater than 100% on Windows 10.
The bug occurs on Windows 8.1 and Windows 10, it also occurs when we uncheck the checkbox "Use Windows XP Style DPI Scaling"
on Windows Vista, Windows 7 and Windows 8, it does not occur on early Windows XP.
The bug was reported by Atma Negara.
In vfp9, when we set scaling to 125%, the cursor position is too small, please refer to the picture testcursorposition125-vfp9.jpg:
2. CAUSE:
There are some BUGs in the following code.
3. RESOLUTION:
We can write some code to fix the BUG.
Fun773929 :: ; proc near
push ebp ;0x00773929 : 55
mov ebp , esp ;0x0077392a : 8bec
sub esp , 048h ;0x0077392c : 83ec48
push ebx ;0x0077392f : 53
push esi ;0x00773930 : 56
push edi ;0x00773931 : 57
mov esi , eax ;0x00773932 : 8bf0
lea edi , dword ptr [ ebp - 72 ] ;0x00773934 : 8d7db8
movsd ;0x00773937 : a5
movsd ;0x00773938 : a5
movsd ;0x00773939 : a5
lea eax , dword ptr [ ebp - 72 ] ;0x0077393a : 8d45b8
movsd ;0x0077393d : a5
call Fun467464 ;0x0077393e : e8213bcfff
mov eax , dword ptr [ ebp - 60 ] ;0x00773943 : 8b45c4
sub eax , dword ptr [ ebp - 68 ] ;0x00773946 : 2b45bc
pushd 03h ;0x00773949 : 6a03
cdq ;0x0077394b : 99
pop ecx ;0x0077394c : 59
idiv ecx ;0x0077394d : f7f9
test edx , edx ;0x0077394f : 85d2
jne Label773956 ;0x00773951 : 7503
inc dword ptr [ ebp - 60 ] ;0x00773953 : ff45c4
Label773956 ::
pushd 00h ;0x00773956 : 6a00
mov byte ptr [ ebp - 56 ] , 0FFh ;0x00773958 : c645c8ff
mov byte ptr [ ebp - 54 ] , 0FFh ;0x0077395c : c645caff
mov byte ptr [ ebp - 55 ] , 0FFh ;0x00773960 : c645c9ff
call GetDC ;0x00773964 : ff15b4729100
mov ebx , eax ;0x0077396a : 8bd8
test ebx , ebx ;0x0077396c : 85db
je Label773a0e ;0x0077396e : 0f849a000000
pushd 07h ;0x00773974 : 6a07
push ebx ;0x00773976 : 53
call SetROP2 ;0x00773977 : ff1518769100
push ecx ;0x0077397d : 51
mov edi , esp ;0x0077397e : 8bfc
lea esi , dword ptr [ ebp - 56 ] ;0x00773980 : 8d75c8
movsw ;0x00773983 : 66a5
pushd 01h ;0x00773985 : 6a01
pushd 00h ;0x00773987 : 6a00
mov dword ptr [ ebp - 12 ] , eax ;0x00773989 : 8945f4
movsb ;0x0077398c : a4
call Fun423df7 ;0x0077398d : e86504cbff
mov esi , SelectObject ;0x00773992 : 8b35f4769100
push eax ;0x00773998 : 50
push ebx ;0x00773999 : 53
call esi ;0x0077399a : ffd6
pushd 05h ;0x0077399c : 6a05
mov dword ptr [ ebp - 8 ] , eax ;0x0077399e : 8945f8
call GetStockObject ;0x007739a1 : ff15f0769100
push eax ;0x007739a7 : 50
push ebx ;0x007739a8 : 53
call esi ;0x007739a9 : ffd6
push dword ptr [ ebp + 8 ] ;0x007739ab : ff7508
lea edi , dword ptr [ ebp - 72 ] ;0x007739ae : 8d7db8
mov dword ptr [ ebp - 4 ] , eax ;0x007739b1 : 8945fc
call Fun43aee1 ;0x007739b4 : e82875ccff
mov edx , dword ptr [ ebp + 8 ] ;0x007739b9 : 8b5508
lea eax , dword ptr [ ebp - 28 ] ;0x007739bc : 8d45e4
call Fun42e782 ;0x007739bf : e8beadcbff
;
; ------------------------------------------------------------
; VFP 9.0 FIX - FIX THE CURSOR POSITION IS TOO SMALL
; October 2018
; ------------------------------------------------------------
; CCB
;
; In vfp9, the cursor position is too small when set scaling to greater than 100% on Windows 10.
;
; 2018/10/16, by ccb
;
Label7739c4_x1_start ::
mov eax , dword ptr [ ebp - 28 + 00h ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739c4_x1_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739c4_x1_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
mov dword ptr [ ebp - 28 + 00h ] , eax
Label7739c4_x1_end ::
Label7739c4_y1_start ::
mov eax , dword ptr [ ebp - 28 + 04h ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739c4_y1_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739c4_y1_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
mov dword ptr [ ebp - 28 + 04h ] , eax
Label7739c4_y1_end ::
Label7739c4_x2_start ::
mov eax , dword ptr [ ebp - 28 + 08h ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739c4_x2_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739c4_x2_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
mov dword ptr [ ebp - 28 + 08h ] , eax
Label7739c4_x2_end ::
Label7739c4_y2_start ::
mov eax , dword ptr [ ebp - 28 + 0Ch ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739c4_y2_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739c4_y2_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
mov dword ptr [ ebp - 28 + 0Ch ] , eax
Label7739c4_y2_end ::
lea eax , dword ptr [ ebp - 28 ]
push eax ;0x007739c4 : 50
call CreateRectRgnIndirect ;0x007739c5 : ff15f0759100
mov edi , eax ;0x007739cb : 8bf8
push edi ;0x007739cd : 57
push ebx ;0x007739ce : 53
call SelectClipRgn ;0x007739cf : ff1550769100
;
; ------------------------------------------------------------
; VFP 9.0 FIX - FIX THE CURSOR POSITION IS TOO SMALL
; October 2018
; ------------------------------------------------------------
; CCB
;
; In vfp9, the cursor position is too small when set scaling to greater than 100% on Windows 10.
;
; 2018/10/16, by ccb
;
; push dword ptr [ ebp - 60 ] ;0x007739d5 : ff75c4
; push dword ptr [ ebp - 64 ] ;0x007739d8 : ff75c0
; push dword ptr [ ebp - 68 ] ;0x007739db : ff75bc
; push dword ptr [ ebp - 72 ] ;0x007739de : ff75b8
Label7739d5_y2_start ::
mov eax,dword ptr [ ebp - 60 ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739d5_y2_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739d5_y2_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
Label7739d5_y2_end ::
push eax
Label7739d8_x2_start ::
mov eax,dword ptr [ ebp - 64 ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739d8_x2_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739d8_x2_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
Label7739d8_x2_end ::
push eax
Label7739db_y1_start ::
mov eax,dword ptr [ ebp - 68 ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739db_y1_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739db_y1_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
Label7739db_y1_end ::
push eax
Label7739de_x1_start ::
mov eax,dword ptr [ ebp - 72 ]
cmp dword ptr vfpa_sys9010_data,00h
je Label7739de_x1_end
mov ecx,dword ptr vfpa_getdpiforwindow_dpi
cmp ecx,dword ptr vfpa_getdpiforsystem_dpi
jbe Label7739de_x1_end
push dword ptr vfpa_getdpiforsystem_dpi
push dword ptr vfpa_getdpiforwindow_dpi
push eax
call MulDiv
Label7739de_x1_end ::
push eax
push ebx ;0x007739e1 : 53
call Rectangle ;0x007739e2 : ff15ec769100
push edi ;0x007739e8 : 57
call DeleteObject ;0x007739e9 : ff15d4769100
push dword ptr [ ebp - 4 ] ;0x007739ef : ff75fc
push ebx ;0x007739f2 : 53
call esi ;0x007739f3 : ffd6
push dword ptr [ ebp - 8 ] ;0x007739f5 : ff75f8
push ebx ;0x007739f8 : 53
call esi ;0x007739f9 : ffd6
push dword ptr [ ebp - 12 ] ;0x007739fb : ff75f4
push ebx ;0x007739fe : 53
call SetROP2 ;0x007739ff : ff1518769100
push ebx ;0x00773a05 : 53
pushd 00h ;0x00773a06 : 6a00
call ReleaseDC ;0x00773a08 : ff15b0729100
Label773a0e ::
pop edi ;0x00773a0e : 5f
pop esi ;0x00773a0f : 5e
pop ebx ;0x00773a10 : 5b
leave ;0x00773a11 : c9
ret 04h ;0x00773a12 : c20400
Now in VFP Advanced, when we set scaling to 125%, the cursor position is normal, please refer to the picture testcursorposition125-vfpa.jpg:
4. APPLIES TO:
VFP 6.0.8167.0
VFP 6.0.8961.0 (SP5)
VFP 7.0.0.9262
VFP 7.0.0.9465 (SP1)
VFP 8.0.0.2521
VFP 8.0.0.3117 (SP1)
VFP 9.0.0.2412
VFP 9.0.0.3504 (SP1)
VFP 9.0.0.4611 (SP2)
VFP 9.0.0.5015 (SP2)
VFP 9.0.0.5411 (SP2)
VFP 9.0.0.5721 (SP2)
VFP 9.0.0.5815 (SP2)
VFP 9.0.0.6303 (SP2)
VFP 9.0.0.6602 (SP2)
VFP 9.0.0.7423 (SP2)
The bug has been fixed in VFP Advanced.
IMPORTANT NOTE FOR WINDOWS 10:
The GetDpiForSystem and GetDpiForWindow Windows APIs are only on Windows 10 version 1607 (August 2, 2016) or later,
the bug has been fixed on Windows 10 version 1607 (August 2, 2016) or later,
so recommend to upgrade to Windows 10 version 1607 (August 2, 2016) or later.
If there is no the registry key "HKEY_CURRENT_USER\Control Panel\Desktop\Win8DpiScaling" in the Windows registry,
the GetDpiForWindow Windows API always returns 96,
so we MUST create the following registry key:
[HKEY_CURRENT_USER\Control Panel\Desktop]
"Win8DpiScaling"=dword:00000000
and then the GetDpiForWindow Windows API can return correct value.
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
http://www.baiyujia.com/vfpdocuments/f_vfp9fix57.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix40.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix56.asp
2, foxite.com:
https://www.foxite.com/archives/native-draganddrop-visual-win10-0000460950.htm
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|