32 비트 및 64 비트 시스템에서 작동하는 API 호출 및 TWIPS/픽셀 문제에 관한 질문입니다. 마우스 포인터 위치에 팝업 양식을 표시하고 싶습니다. 내 솔루션 종류의 작품 (적어도 충돌없이)하지만 정확한 위치를 계산하지 않는 것. Access 2010 VBA API TWIPS/PIXEL
'API Calls
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPtr
Private Declare PtrSafe Function apiGetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hWnd As Long, lpRect As RECT_Type) As LongPtr
Private Declare PtrSafe Function apiGetDC Lib "user32" Alias "GetDC" (ByVal hWnd As Long) As LongPtr
Private Declare PtrSafe Function apiGetDeviceCaps Lib "gdi32" Alias "GetDeviceCaps" (ByVal hDC As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function apiReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hWnd As Long, ByVal hDC As LongPtr) As LongPtr
Private Const TWIPSPERINCH = 1440
Private Const WU_LOGPIXELSX = 88
Private Const WU_LOGPIXELSY = 90
Private Type POINTAPI
X As Long
Y As Long
End Type
Type RECT_Type
left As Long
top As Long
right As Long
bottom As Long
End Type
Public Function GetXCursorPos() As Long
Dim pt As POINTAPI
GetCursorPos pt
GetXCursorPos = CLng(pt.X)
End Function
Public Function GetYCursorPos() As Long
Dim pt As POINTAPI
GetCursorPos pt
GetYCursorPos = pt.Y
End Function
Public Function ConvertPIXELSToTWIPS(lPixel As Long, _
lDirection As Long) As Long
Dim hDC As LongPtr
Dim hWnd As Long
Dim RetVal As LongPtr
Dim PIXELSPERINCH
hDC = apiGetDC(0)
' Horizontal
If (lDirection = 0) Then
PIXELSPERINCH = apiGetDeviceCaps(hDC, WU_LOGPIXELSX)
' Vertical
Else
PIXELSPERINCH = apiGetDeviceCaps(hDC, WU_LOGPIXELSY)
End If
RetVal = apiReleaseDC(0, hDC)
ConvertPIXELSToTWIPS = (lPixel/PIXELSPERINCH) * TWIPSPERINCH
End Function
Function ConvertTwipsToPixels(lTwips As Long, _
lDirection As Long) As Long
Dim lDC As LongPtr
Dim lPixelsPerInch As LongPtr
lDC = apiGetDC(0)
' Horizontal
If (lDirection = 0) Then
lPixelsPerInch = apiGetDeviceCaps(lDC, WU_LOGPIXELSX)
' Vertical
Else
lPixelsPerInch = apiGetDeviceCaps(lDC, WU_LOGPIXELSY)
End If
lDC = apiReleaseDC(0, lDC)
ConvertTwipsToPixels = (lTwips/TWIPSPERINCH) * lPixelsPerInch
End Function
양식 자체
내가 내 프로그래밍 기술이 특히 길고 longptr와 저글링 갖는, API 프로그래밍에 올 때 항복해야한다는 고백해야이Private Sub Form_Load()
Dim lWidthPixel As Long
Dim lHeightPixel As Long
Dim lWidthTwips As Long
Dim lHeightTwips As Long
lWidthPixel = modAPI.GetXCursorPos
lHeightPixel = modAPI.GetYCursorPos
lWidthTwips = ConvertPIXELSToTWIPS(lWidthPixel, 0)
lHeightTwips = ConvertPIXELSToTWIPS(lHeightPixel, 1)
Me.Move left:=lWidthTwips, top:=lHeightTwips
End Sub
처럼 열 수있다. 위의 코드는 다른 출처에서 수집 한 것입니다. 어떤 도움을 크게 당신이 계정에 GetCursorPos
반환 화면 좌표 Form.Move
메인 Access 창에 상대 좌표 가정 사실을 고려하지 않기 때문에 위치가 제대로 계산되지 않습니다 많은 감사
존
감사합니다. 이것은 꽤 많은 일처럼 보입니다. 나는 내일 그 기회를주고 당신에게 알려줄 것입니다. – JonBlumfeld
매력처럼 작동합니다. 고맙습니다. – JonBlumfeld