کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی
کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی

WM_NCHITTEST در ساب کلاس EDIT Control



تمام موارد کپی شده از داکیومنتِ موجود است  تست شده همراه با تصویر ، ثابت ها نیز از داکیومنت استخراج و قابل مشاهده برای عموم است. لینک ها شما را به مطلب داکیومنت هدایت خواهند نمود.



if the return value of the message response function of WM_NCHITTEST is HTCLIENT, indicating that the mouse clicked on the client area, Windows will send a WM_LBUTTONDOWN message to the window; if the return value of the message response function of WM_NCHITTEST is not HTCLIENT (may be HTCAPTION, HTCLOSE,

HTMAXBUTTON) Etc.), that is, when the mouse clicks on the non-client area, Windows will send a WM_NCLBUTTONDOWN message to the window.



اگر مقدار برگشتی پاسخ پیام تابع، HTCLIENT باشد، نشان می دهد که ماوس روی ناحیه Client کلیک شده . ویندوز یک پیام WM_NCLBUTTONDOWN به پنجره خواهد فرستاد اگر مقدار جواب پیام برگشتی HTCLIENT نباشد ممکن است HTCAPTION یا HTCLOSE و یا حتی HTMAXBUTTON باشد .یعنی زمان کلیک در منطقه خارج از Client ( هر پنجره ای می تواند خود باتن باشد یا کنترل ویرایش یا  دیالوگ باکس ) ویندوز یک پیام WM_NCLBUTTONDOWN به پنجره ارسال می نماید.





تصویر بالا وقتی ماوس داخل کنترل ویرایش است ( Client ) در Caption یا TitleBar عدد یک و وقتی روی بوردر است عدد 18 را مشاهده می نمائید ثابت ها در پائین ذکر شده .




Case 132 ' WM_NCHITTEST
ff = CallWindowProc(HookInputBoxprev, hWnd, uMsg, wParam, lParam)
SetWindowTextA GetParent(hWnd), ff



HTBORDER=18   '<<<<<<

HTBOTTOM=15

HTBOTTOMLEFT=16

HTBOTTOMRIGHT=17

HTCAPTION=2

HTCLIENT=1  ' <<<<<

HTCLOSE=20

HTERROR=-2

HTGROWBOX=4

HTHELP=21

HTHSCROLL=6

HTLEFT=10

HTMENU=5

HTMAXBUTTON=9

HTMINBUTTON=8

HTNOWHERE=0

HTREDUCE=8

HTRIGHT=11

HTSIZE=4

HTSYSMENU=3

HTTOP=12

HTTOPLEFT=13

HTTOPRIGHT=14

HTTRANSPARENT=-1

HTVSCROLL=7

HTZOOM=9




How to Get Border Of NonClientArea



  1. Call GetClientRect() to get the size of the client area.
  2. Call ClientToScreen() to transform client rect to screen coordinates.
  3. Call GetWindowRect() to get the rectangle of the control including NC area, in screen coordinates.
  4. Calculate difference between client rect and window rect coordinates to get size of border (e. g. leftBorderWidth = clientRect.left - windowRect.left).



how-to-set-the-size-of-the-non-client-area-of-a-win32-window-native


win32/gdi/nonclient-area



CoorDinate     ..... PtInRect





در بالا مختصات x و y با پیام WM_MOUSEMOVE و پارامتر lParam و استفاده از loword و hiword آن در Caption ذکر شده برای گرفتن Right مستطیل کنترل ویرایش از تابع GetClientRect استفاده شده.


Case WM_MOUSEMOVE
         GetClientRect GetDlgItem(hwnd, 1000), r1
         GetCursorPos tt
         ScreenToClient hwnd, tt
         mm.x = CLng(lParam And &HFFFF&)  'LoWord(lParam
         mm.y = CLng(lParam \ &HFFFF&)  'HiWord(lParam
        SetWindowTextA hwnd, "Coordinate :(" & mm.x & "," & mm.y & ")" & " &RectR:" & r1.Right & " &tt_X_Y(" & tt.x & "," & tt.y & ")"
           'r1.Left = 0: r1.Right = 30: r1.Top = 0: r1.Bottom = 50
           If PtInRect(r1, mm.x, mm.y) Then
            'SetWindowTextA GetDlgItem(hwnd, 1), "In"
           ElseIf Not PtInRect(r1, mm.x, mm.y) Then
            'SetWindowTextA GetDlgItem(hwnd, 1), "Out"
           End If


در تصویر پائین Right را 1263 زده چون از تابع GetWindowRect کنترل ویرایش با آیدی 4900 استفاده شده . در ضمن اگر ماوس در مختصات خاصی که که مستطیل را تعریف کردیم ( با left و top و right و bottom ) باشد در باتن Ok با آیدی 1 رشته In و اگر خارج باشد رشته Out جایگزین تکست پنجره باتن میشود.( استفاده از تابع PtInRect )


if Points moved inside the edit 's rectangle we specified  in the above code  , the window text of "Ok" button will  be changed to "In" , Otherwise "Out"



Byval StrPtr

"1604;1591;1601;1575;32;1601;1602;1591;32;1608;1575;1585;1583;32;1705;1606;1740;1583"



The InflateRect function increases or decreases the width and height of the specified rectangle. The InflateRect function adds -dx units to the left end and dx to the right end of the rectangle and -dy units to the top and dy to the bottom. The dx and dy parameters are signed values; positive values increase the width and height, and negative values decrease them.



تابع InflateRect عرض و ارتفاع مستطیل ( Rectangle )  را افزایش یا کاهش می دهد . این تابع dx- واحد به چپ و dx واحد به انتهای راست مستطیل و dy- به بالا و dy به پائین اضافه می نماید.پارامترهای dx و dy مقادیر علامت دار هستند .مقادیر مثبت عرض و ارتقاع را افزایش می دهند و مقادیر منفی آنها را کاهش می دهند.




Dim Mpos As POINTAPI
'Retrieves the position of the mouse cursor, in screen coordinates.
 Retval = GetCursorPos(MPos)
'Retrieves a handle to the window that contains the specified point.
hWnd = WindowFromPoint(MPos.x, MPos.y)
'A handle to the window to be tested.
 If CBool(IsWindow(hWnd)) = False Then
Label1.Caption = ""
Exit Sub
End If
Determines whether a window is maximized
IsMaximized = IsZoomed(hWnd)
'Determines whether the specified window is minimized (iconic).
IsMinimized = IsIconic(hWnd)
'Retrieves a handle to the specified window's parent or owner.
ParentWnd = GetParent(hWnd)

 




29 بهمن 1400 : در پی اهانت یک افسر هندی به سردار سلیمانی و رهبر انقلاب،  مردم منطقه بدگام کشمیر به خیابان‌ها ریختند و در حمایت از سردار سلیمانی شعار سردادند و با ماموران پلیس درگیر شدند و اقدام مامور هتاک را محکوم کردند. یکی از افسران هندی در حین عملیات سرشماری یکی از شهرهای کشمیر با ورود به منزل یکی از شهروندان عکس شهید سلیمانی و رهبرانقلاب را که در خانه او بود به آتش می‌کشد. 








آبجکت WebBrowserControl





IEXPLORE

WebControl_members

WebElement_properties

webbrowser-open-office-document-in-visual-basic


البته مطلب زیر تکرار مکررات است 


The WebBrowser control has several properties, methods, and events that you can use to implement controls found in Internet Explorer. For example, you can use the Navigate method to implement an address bar, and the GoBack , GoForward , Stop , and Refresh methods to implement navigation buttons on a toolbar


objects_and_controls


  Obj.ContextMenu = TRUE  'Boolean Type


در لینک زیر رویداد های یک اکتیو ایکس کنترل Webbrowser نشان داده 


vba/api/access.webbrowsercontrol


برای نمایش یک سایت در کنترل webbrowser که در اینجا نام کنترل WebBrowser0 است :


Me.WebBrowser0.Navigate "www.Blogsky.com"


فقط صفحات Html در این Browser قابل مشاهده هستند پس در این کنترل نمی توانید فایل Pdf یا Word  باز کنید.


برای Disable  کردن اجرای عملیات  در webbrowser یا باصطلاح خودمون عدم نمایش ، رویداد BeforeNavigate2 را مطالعه نمائید در تابع آرگومان آخر از نوع Boolean تعریف شده  که می توانید آنرا False کنید.


برای استفاده از کلاس ماژول هایی که Microsoft HTML DOCUMENT دارد در Refrence محیط VBE آنرا تیک بزنید همانطور که گفته شد WithEvents متغیری را تعریف می کند که می توانید به رویدادها دسترسی پیدا کنید البته آن متغیر تعریف شده را باید در تابع WebBrowser0_DocumentComplete به پراپرتی Document این کنترل تنظیم کنید.


Private WithEvents HDoc As HTMLDocument


در DocumentComplete که دو آرگومان دارد اولی بعنوان آبجکت و دومی url از نوع Variant بنویسید

Set HDoc=WebBrowser0.Document


از نحوه نوشتاری رویه هایی  که در HTMLDocunent  وجود  دارد اطلاعی ندارم و تنها چیزی که پیدا شد رویداد OnClick است  


Private Function Hdoc_OnClick() As Boolean

Msgbox " Clicked Me !!!)

End Function


در رویه بالا اگر شما Boolean را بکار نبرید خطا دریافت خواهید کرد. و حتما باید آنرا بکاربرد


غیر فعال کردن Scroll : 


Me.WebBrowser0.Document.Body.Scroll="No"



Event : NavigationStateChanged


دو تا آرگومان دارد و مقدار Boolean دارند یکی CanGoBack و دیگری CanGorward



powerscript_reference/mouseMove_event




WithEvents


Specifies that one or more declared member variables refer to an instance of a class that can raise events.



برای استفاده از عناصر مربوطه در Refrence تیک Microsoft Html library را حتما تیک بزنید البته بدون تیک هم می توان کارهایی  انجام داد که مجبور به تیک این آپشن نباشیم البته اگر فایل مربوطه در system32 نباشد دیگر هیچ کاری نمی توان انجام داد.



Public WithEvents ObjHtmlDoc As HTMLDocument


Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)

    Set objHtmlDoc = WebBrowser1.Document

End Sub


OnMouseMove Event :

زمانیکه ماوس را روی کنترل webbrowser می گیرید مختصات x و y را برمی گرداند 

First Tick  "Microsoft HTML Object Library"  Form VBA Refrences

Important :in Upper Sub Procedures Declared   Private WithEvents Doc Ass HTMLDocument ( To use Event )

Important : Set Variable Doc In Sub WebBrowser_DocumentComplete(Byval pDisp as Object,url As Varaint)

Doc_OnMouseMove

Me.text3=Me.Text3 = "X : " & dc.parentWindow.event.clientX & _

          "Y : " & dc.parentWindow.event.clientX


Doc_OnMouseMove


OnMouseUp Event







برای Scroll کردن در اکتیو ایکس WebBrowser به سمت پائین و انتهای body روش زیر پیشنهاد شده


To scroll to a specific location, you can use WebBrowser.Document.Window.ScrollTo(x,y) method. For example to scroll down to the end of body:

private void webBrowser1_DocumentCompleted(object sender, 
                                           WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.Window.ScrollTo(0, webBrowser1.Document.Window.Size.Height);
}


WebBrowser Events 


DocumentComlete  Event : 


زمانی فعال می شود که یک سند به طول کامل بارگیری و مقدار دهی اولیه شود ( "Object.Navigate="url )

نوشتاری : 

Private Sub WebBrowser0_DocumentComplete(ByVal iDisp As Object ,url As Variant)



WindowSetTop Event :






Zoom Method : زوم کردن

طبق عبارت زیر می توانید صفحه را با درصد انتخابی Zoom in یا Zoom Out کنید.

Me.WebBrowser0.Document.body.Style.zoom = "220%"


Scroll Height :  ارتفاع اسکرول در صفحه

برای بدست آوردن ارتفاع اسکرول  طبق زیر عمل کنید

To Get Scroll Height Of Body ( Object Must Be Set )

Dim HtmlBody As HtmlBody

Set HtmlBody = Me.WebBrowser0.Document.body

MsgBox HtmlBody.scrollHeight



Click Button :  کلیک روی باتن

کلیک روی باتن طبق تصویر زیر و باز شدن منو با کلیک اول منو بازشد و کلیک دوم به حالت قبل برگشت.


HTMLElement . متد Click یک کلیک ماوس روی عنصری را شبیه سازی می کند  عنگامی که Click با عناصر پشتیبانی شده مانند <input> استفاده می شود ، رویداد کلیک عنصر را فعال می کند . این رویداد سپس به عناصر بالاتر در شاخه سند  ( یا زنجیره رویداد ) تبدیل می شود و رویداد کلیک آنها را فعال می نماید.


در تصویر Gif زیر کامند سمت چپ داکیومنت را در کنترل راهبری می کند و کامند سمت راست منو رو باز میکند البته در حالتی که کنترل وب براوزر را بازتر کنیم آن حالت راهبری بصورت Toggle از بین می رود و در form-header سه دکمه مثل "ورود به سیستم" نمایان می شود وعملا این کد خاصیتی ندارد. برای کلیک کردن روی سه باتن loging یا Signup می توانید ....... لوپ زدن در element  ها و چک کردن id یا href یا هر چیز دیگری و Ele.Click


شامل header و content و footer است.


.Document.GetElementsByTagName("Button")(0)

.innerText="Toggle Navigation"




getElementsByName و getElementsByClassName یک آرایه را باز می گردانند بنابراین باید ایندکس آیتم آرایه در براکت ها مشخص شود.


مطلب زیر هم جالبه برای انتخاب تمام کلاس ها با getElementsByClassName و Click

Select all class's with getElementsByClassName and click

var el = document.getElementsByClassName('node closed');
for (var i=0;i<el.length; i++) { 
el[i].click(); 
}



' Input the userid and password
ie.Document.getElementById("uid").Value = "testID"
ie.Document.getElementById("password").Value = "testPW"
' Click the "Search" button
ie.Document.getElementById("enter").Click


Link


Set HTMLdoc = appIE.HTMLDocument
Set link = Nothing
i = 0
While i < HTMLdoc.Links.Length And link Is Nothing
If HTMLdoc.Links(i).innerText = "Favorites" Then Set link = HTMLdoc.Links(i)
i = i + 1
Wend
If Not link Is Nothing Then
link.Focus
link.Click
End If

برای کلیک کردن ، حتما متغیر که اینجا myLinks است باید تنظیم شود

Dim myLinks As Object
Set myLinks = Document.getElementsByTagName("a")



Add List the Link to ListBox


Private Sub Form_Load()
WebBrowser1.Navigate "www.vbforums.com"
End Sub


Dim HTMLdoc As HTMLDocument
Dim HTMLlinks As HTMLAnchorElement
Dim STRtxt As String
' List the links.
On Error Resume Next
Set HTMLdoc =WebBrowser1.Document
For Each HTMLlinks In HTMLdoc.links
    List1.AddItem HTMLlinks.href
    STRtxt = STRtxt & HTMLlinks.href & vbCrLf
Next HTMLlinks
'Append means add data to end
Open "C:\Documents and Settings\joe\Desktop\linklog.txt" For Append As #1
Print #1, STRtxt
Close #1
End Sub



CommandStateChange Event :

زمانی ر خ می دهد که حالت فعال یک فرمان  یا Command تغییر نماید 


Private Sub object_CommandStateChange (ByVal Command As Long,
ByVal Enable As Boolean)

Cmmand : 

CSC_NAVIGATEFORWARD  ( Value : 1)
The enabled state of the Forward button has changed.
CSC_NAVIGATEBACK ( Value : 3 )


If Command = 2  Then Me.Command5.Enabled = Enable






How To Hide Or Show WebBrowser Control

Me.WebBrowser0.Visible = False










The enabled statebutton has http:// changed.


باتنی می توان در فرم تعبیه کرد و از GoBack برای برگشتن به عقب استفاده کرد البته باتن Back د ر کیبورد همین کار را انجام میدهد

On Error Resume Next

Me.WebBrowser0.GoBack

وقتی صفحه وب کاملا Load شد اگر از Goback استفاده کنید ( در رویه یک باتن بنویسید )  با خطا مواجه می شوید چون صفحه قبلی وجود ندارد که شما را به آن بازگرداند ولی اگر از دکمه کیبورد ( Back ) استفاده کنید خطا دریافت نمی کنید ... کد اول بخاطر همین نوشته شد.



Print 


WebBrowser1.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER
'you can change OLECMDEXECOPT_DONTPROMPTUSER to OLECMDEXECOPT_PROMPTUSER if you wish

بجای استفاده از DONTPROMPTUSER می توانید از PROMPTUSER بهره ببرید برای اینکه به  کاربر اعلام  نماید و Dialog Box را نمایش دهد. از Shell هم می توان استفاده کرد .


Shell "rundll32.exe C:\WINDOWS\SYSTEM\MSHTML.DLL,PrintHTML " & _ "http://www.developerfusion.com" , vbMinimizedFocus


با SendKeys هم می توان کنترل + P را فرستاد  راه های رسیدن به پرینت صفحه.


To Fill Edit Box : 


WebBrowser1.document.all("username").Value = "Name"
WebBrowser1.document.all("password").Value = "passwort"
WebBrowser1.document.all("Submit").Click



OnMouseDown()

Private Declare Ptrsafe Function GetAsyncKeyState Lib "user32" (ByVal VKey As Long) As Integer

For Key = 1 To 5 '255
If GetAsyncKeyState(Key) Then  'WebBrowser1_MouseDown VKey
Exit For
End If
Next

If Key = 2 Then
Me.Label1 ="Right MouseDown"
End If 





استفاده از تابع ویندوری ShellExecute برای اجرای فایل 


Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" _
'Declare arguments
(ByVal hWnd As Long, ByVal lpszOp As String, _
ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal LpszDir As String, ByVal FsShowCmd As Long) _
As Long

'Used to display a window
Const SW_SHOWNORMAL = 1

'Open pdf occurs on button click
Private Sub cmdPDF_Click()
Dim strPath, strParam As String

strPath = "C:\Example.pdf"
strParam = " /A " & Chr(34) & "page=14" & Chr(34) & strPath

Call ShellExecute(0&, "open", "AcroRd32.exe", strParam, "", SW_SHOWNORMAL)
End Sub



Remove Open\Save Dialog
------------------------------------------------------
Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\AcroPDF.FDF.1]
[HKEY_CLASSES_ROOT\AcroPDF.PDF.1]
"EditFlags"=hex:00,00,01,00
------------------------------------------------------
Add Open\Save Dialog
------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AcroPDF.FDF.1]
"EditFlags"=hex:00,00,00,00
[HKEY_CLASSES_ROOT\AcroPDF.PDF.1]
"EditFlags"=hex:00,00,00,00

















لطفا بعد از مطالعه و استفاده فاتحه ای برای پدر مرحومم قرائت فرمائید .... دوستان عزیز لطفا در نظر سنجی شرکت کنید در ضمن مطالب زیر ربطی به اکسس ندارد و فقط برای مطالعه است







صرفا جهت مطالعه ، مطالب زیر ربطی به کنترل بالا ندارد . موارد  جدید مربوط به webbrowser اگر یافت شد به بالا اضافه خواهد شد.



WM_NCHITTEST=132

WM_SETCURSOR=32

WM_MOUSEMOVE=512




پیام ویندوزی ارسال به پنجره



WM_MOUSEMOVE   : 


Private Type POINTAPI
x As Long
y As Long
End Type


Contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.

Private Type MOUSEHOOKSTRUCT
pt As POINTAPI 
hwnd As Long 
wHitTestCode As Long 
dwExtraInfo As Long 
End Type


'Constants

Public Const WH_MOUSE = 7
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN=&H201
Public Const WM_LBUTTONUP=&H202
Public Const WM_LBUTTONDOWNDBLCLK=&H203
Public Const WM_RBUTTONDOWN=&H204
Public Const WM_RBUTTONUP=&H205
Public Const WM_RBUTTONUPDBLCLK=&H206

Private OldWndProc As Long 
Private IsHooked As Boolean 


Public Function MouseProc(ByVal uCode As Long, ByVal wParam As LongPtr, lParam As MOUSEHOOKSTRUCT) As Long

If uCode < 0 Then 
MouseProc = CallNextHookEx(lpPrevWndProc, uCode, wParam, lParam) 
Else 
Select Case wParam 
Case WM_MOUSEMOVE 
'here is your mouse move event 
Debug.Print "Mouse Move: " &  lParam.pt.x & lParam.pt.y 
End Select 
MouseProc = CallNextHookEx(OldWndProc, uCode, wParam, lParam) 
End If 
End Function




 
Public Sub SetMouseHook()
If Not IsHooked Then
OldWndProc = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc, 0, GetCureantThreadID)
IsHooked = True
End If
End Sub

 Public Sub RemoveMouseHook()
UnhookWindowsHookEx OldWndProc
IsHooked = False
End Sub 







SubClass Window



Public Declare PtrSafe Function SetWindowLongPtrA Lib "user32" (ByVal Hwnd As LongPtr, _

ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr



Public Declare PtrSafe Function CallWindowProcA Lib "user32.dll (ByVal lpPrevWndFunc As LongPtr, _

ByVal Hwnd As LongPtr, ByVal Msg As Long,  _

ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr


Public OldWndProc As LongPtr

Public IsHooked As Boolean

Public cCount As LongLong



Public Sub SubClass()
If Not IsHooked Then
OldWndProc = SetWindowLongPtrA(Hwnd, GWLP_WNDPROC, AddressOf NewWndProc)
IsHooked = True
End If
End Sub

Public Sub UnSubClass()
SetWindowLongPtrA Hwnd, GWLP_WNDPROC, OldWndProc
IsHooked = False
End Sub

Public Function  NewWndProc (ByVal Hwnd As LongPtr,ByVal Msg As Long,ByVal wParam As LongPtr,ByVal lParam As LongPtr) As LongPtr

Select Case Msg
         Case &H201
                  Debug.Print  "&H201"
         Case &H202
                  Debug.Print "&H202"
        Case Else 
NewWndProc=0
End Select 
NewWndProc=CallWindowProcA(OldWndProc,Hwnd,Msg,wParam,lParam)

End Function

WM_MOUSE         : 

هنگامی که مکان نما حرکت می کند به یک پنجره ارسال می شود. اگر ماوس گرفته نشود، پیام به پنجره ای که مکان نما را در خود دارد ارسال می شود. در غیر این صورت، پیام به پنجره ای که ماوس را گرفته ارسال می شود.

پنجره این پیام را از طریق تابع WindowProc خودش دریافت می کند.


WM_MOUSEMOVE=&H200
wParam : are Down virtual keys or not
1-The left mouse button is down.
2-The right mouse button is down
4- The SHIFT key is down.
8-The CTRL key is down.
10-The middle mouse button is down.
20- The first X button is down.
40- The second X button is down.
lParam : مختصات کرسر



If Msg=&H200 And wParam=2 Then 
Debug.Print cCount=cCount+1
WindowProc=False Or True ( To Be Tested)
End If


WM_CONTEXTMENU :

اطلاع میدهد به پنجره ای که کاربر مایل است یک منوی زمینه ظاهر شود. کاربر ممکن است در پنجره با ماوس right-click کرده باشد ، Shift+F10 را فشرده باشد یا از کلیدهای برنامه استفاده کند



WM_CONTEXTMENU=&H7B
wParam :

هندلی است به پنجره ای که کرسر با ماوس right-click شده . می تواند یک زیرپنجره برای پنجره ای باشد که پیام دریافت می کند.

lParam :

قسمت  low-order موقعیت افقی کرسر را تعیین می کند ، در مختصات صفحه ، در زمان ماوس کلیک

Clng(lparam And 255×257)

قسمت high-order موقعیت عمودی کرسر را مشخص می کند ، در مختصات صفحه ، در زمان کلیک کردن روی ماوس
Clng(lparam \ 255×257)






Public Declare PtrSafe Function PtInRect Lib "user32.dll" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long

Public  Type Pt As POINTAPI
x As Long
y As Long
End 

Public rc As Rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type 



Immediate Window :





MOVECURSOR رسم مستطیل



WM_MOUSEMOVE 

       Dim p As POINTAPI

       GetCursorPos p

       ScreenToClient hwnd, p

    

    

      Dim ff As RECT

      Dim ff1 As RECT

       SetRect ff, p.x, p.y, p.x, p.y

       ff.Left = p.x - 15

       ff.Top = p.y - 15

       ff.right = p.x + 35

       ff.bottom = p.y + 30

              

 DrawFrameControl GetDC(hwnd), ff, DFC_BUTTON, DFCS_BUTTONPUSH

       RoundRect GetDC(hwnd), ff.Left, ff.Top, ff.right, ff.bottom, 16, 16

      ( FillRect GetDC(hwnd), ff, GetSysColorBrush(16

            

        Sleep 100

       InvalidateRect hwnd, ff, 1

       UpdateWindow hwnd

       

      

         (ReleaseDC hwnd, GetDC(hwnd

     

     

       

   






UINT SetBoundsRect( HDC hdc, const RECT *lprect, 
(UINT flags : DCB_RESET ( Clear Bounding Rectangle 


(BOOL ValidateRect( HWND hWnd, const RECT *lpRect 

validates the client area within a rectangle by removing the rectangle from the update region of the specified window.

BOOL InvalidateRect( HWND hWnd, const RECT 
(*lpRect, BOOL bErase 

The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn.

(BOOL UpdateWindow( HWND hWnd 

The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty


(HDC GetDC( HWND hWnd 

The GetDC function retrieves a handle to a device context (DC) for the client area of a specified window or for the entire screen







BUTTON_CLICK ( ترسیم لبه در پنجره کلاس 32770# )



در BS_OWNERDRAW یا خود Button  کار نمی کند نتیجتا ترسیم شد ( منظور ناحیه ای که در تصویر پایین داخلش  تکست Inside ترسیم شده) .   DrawEdge و DrawTextA


dim rr as RECT

If wMsg = WM_PAINT Then


        z1.Left = 285 + GetSystemMetrics(SM_CYFRAME) * 3 ' 296

        z1.right = 348 + GetSystemMetrics(SM_CYFRAME) * 2 ' 355

        z1.Top = 63 + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) * 2 ' 95

        z1.bottom = 86 + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) + 2 ' 115

     

    (WindProc = DrawEdge(GetWindowDC(hwnd), z1, EDGE_RAISED, BF_RECT + BF_ADJUST

End If


If wMsg = WM_LBUTTONDOWN Then 'WM_MOUSEMOVE

       

       Dim cp As POINTAPI

SetRect rr, 285, 63, 348, 86

      

      GetCursorPos cp

      ScreenToClient hwnd, cp


rr.Left = rr.Left + 2

       rr.right = rr.right - 2

       rr.Top = rr.Top - cp.y + 2

       rr.bottom = rr.bottom - cp.y - 2



If PtInRect(rr, cp.x, cp.y) Then


End If 



اگر شکل را مشاهده کنید زمان فشردن باتن سمت چپ ماوس در مستطیل موردنظر با مختصات صفحه در قسمت کپشن ویندو هم IN ارسال میشود 

















MOUSEMOVE


کدام درست و منطقی تر است ؟


WM_MOUSEMOVE

   Dim rc As RECT
   Din pt As POINT

   SetRect rc, 0,0,5,5
   (Pt.x=LOWORD(LParam
   (Pt.y=HIWORD(LParam

   if PtInRect(rc,pt.x,pt.y)  Then 
      Msgbox "in"
  Else 
     Msgbox "Out"
  End If 



For x = rc.Left To rc.Right
For y = rc.Top To rc.Bottom

If PtInRect(rc, x, y) Then 
Msgbox "in"
Else
Msgbox "Out"
End If 

Next y
Next x




Dim mousept As POINTAPI
Dim winrect As RECT 
with winrect
left=5.
top=0.
right=5.
bottom=5.
End With 


GetCursorPos mousept
GetWindowRect hWnd, winrect'
SetRect 5,0,5,5?'
ScreenToClient ?'

(isinside=PtInRect(winrect, mousept.x, mousept.y

If isinside = 1 Then
  Debug.Print "The mouse cursor is currently inside 
".of Form1
Else
  Debug.Print "The mouse cursor is currently outside 
".of Form1
End If



Dim pt As POINTAPI
Dim BtnRect As RECT



WM_MOUSEMOVE

GetWindowRect BtnHwnd,BtnRect
(pt.x=loword(lparam
(pt.y=hiword(lparam
ClientToScreen BtnHwnd,pt

If PtInRect(BtnRect,pt.x,pt.y) Then 


پیام WM_MOUSEMOVE


     setcapture

releasecapture

getcapture

settimer

killtimer

wm-timer


nidEvent می تواند WM_MOUSELEAVE باشد یعنی SetTimer  در MOUSEMOVE تنظیم شود اگر Msg گرفته شده در TIMEPROC برابر MOUSELEAVE شد کاری انجام شده و بعد KillTimer اعمال گردد.