برای ساب کلاس کردن پنجره در 32 بیت :
Constants used with Windows APIs
Private Const GWL_WNDPROC = -4
Private mHwnd As LongPtr
Public mOldWndProc As LongPtr
Private Sub Comman4_Click()
mHwnd = FindWindowA(vbNullString, Me.Caption)
SetHook
End Sub
Private Sub Form1_Close()
RemoveHook
End Sub
Private Sub SetHook()
mOldWndProc = SetWindowLongPtrA(mHwnd, GWL_WNDPROC, VBA.CLngPtr(AddressOf NewWndProc))
End Sub
Private Sub RemoveHook()
SetWindowLongPtrA mHwnd, GWL_WNDPROC, mOldWndProc
End Sub
Public Function NewWndProc(ByVal hwnd As LongPtr, _
ByVal uMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr
'On Error Resume Next
NewWndProc = CallWindowProcA(mOldWndProc, hwnd, uMsg, wParam, lParam)
End Function
Unfortunately, you cannot rotate text in a WinForms label. If you really want to do it, you have to handle the Paint
event and write code to rotate the text.
برای چرخش متن در گزارش از اکتیوایکس ها استفاده می شود ( و دارای Property ها یا Event هااست البته اگر سازنده تعبیه کرده باشد ) که بصورت کنترل acCustomControl است بنابراین بدون کمک از آنها نمی توان تکست را به درجه ای که می خواهید بچرخانید اکسس فقط چرخش در حالت ۹۰ درجه Vertical دارد..... پس کنترل اکتیو ایکس رو در گزارشات می بایست اضافه کنید بجای لیبل و از پراپرتی های آن استفاده نمائید
WM_PAINT :
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Type PAINTSTRUCT
hDc As Long
fErase As Boolean
rcPaint As RECT
End Type
WindowProc(hwnd,uMsg,wParam,lParam)
Dim ps As PAINTSTRUCT
Dim hDC,hBrushAs LongPtr
Select Case uMsg
case WM_DESTROY
PostQuitMessage(0)
SelectObject hDC,hOldBrush
DeleteObject hBrush
WindowProc=0 ' False
case WM_PAINT
hdc = BeginPaint(hwnd, &ps)
hBrush=CreateSolidBrush(Rgb)
hOldBrush=SelectObject(hDC,hBrush)
FillRect(hdc, &ps.rcPaint, hBrush)
EndPaint hwnd, &ps
WindowProc=0End Select
WindowProc=DefWindowProc(hwnd, uMsg, wParam, lParam)
توابع API به حروف بزرگ و کوچک حساسند پس اگر فرضا تابع CreateCompatibleDc ارور Not Find در DLL مربوطه دریافت خواهید کرد چرا ؟ چون DC است نه Dc