Files
Client/Library/dxx8/samples/Multimedia/VBSamples/DirectInput/Scrawl/frmcanvas.frm
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

339 lines
8.9 KiB
Plaintext

VERSION 5.00
Object = "{1F6AF2BA-798F-4586-8F76-CD0DB05515D9}#1.0#0"; "vb_SubClass.OCX"
Begin VB.Form frmCanvas
AutoRedraw = -1 'True
BackColor = &H80000005&
Caption = "Visual Basic Scrawl Sample"
ClientHeight = 6150
ClientLeft = 165
ClientTop = 450
ClientWidth = 9990
Icon = "frmCanvas.frx":0000
LinkTopic = "Form1"
ScaleHeight = 410
ScaleMode = 3 'Pixel
ScaleWidth = 666
StartUpPosition = 2 'CenterScreen
Begin vbSubClass.SubClasser subClass
Left = 9360
Top = 60
_ExtentX = 900
_ExtentY = 873
End
Begin VB.Image imgPencil
Appearance = 0 'Flat
Height = 480
Left = 0
Picture = "frmCanvas.frx":0442
Top = 0
Width = 480
End
Begin VB.Menu mnuContext
Caption = "none"
Visible = 0 'False
Begin VB.Menu mnuAbout
Caption = "About..."
End
Begin VB.Menu Sep1
Caption = "-"
End
Begin VB.Menu mnuSpeed1
Caption = "Speed 1"
End
Begin VB.Menu mnuSpeed2
Caption = "Speed 2"
End
Begin VB.Menu mnuSpeed3
Caption = "Speed 3"
End
Begin VB.Menu Sep2
Caption = "-"
End
Begin VB.Menu mnuClear
Caption = "Clear"
End
Begin VB.Menu Sep3
Caption = "-"
End
Begin VB.Menu mnuSuspend
Caption = "Release Mouse"
End
End
End
Attribute VB_Name = "frmCanvas"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
'
' File: frmCanvas.frm
' Content: This Form holds the DirectInput callback for mouse messages
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit
Implements DirectXEvent8
Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)
' This is where we respond to any change in mouse state. Usually this will be an axis movement
' or button press or release, but it could also mean we've lost acquisition.
' Note: no event is signalled if we voluntarily Unacquire. Normally loss of acquisition will
' mean that the app window has lost the focus.
Dim diDeviceData(1 To BufferSize) As DIDEVICEOBJECTDATA
Dim NumItems As Integer
Dim i As Integer
Static OldSequence As Long
' Get data
On Error GoTo INPUTLOST
NumItems = objDIDev.GetDeviceData(diDeviceData, 0)
On Error GoTo 0
' Process data
For i = 1 To NumItems
Select Case diDeviceData(i).lOfs
Case DIMOFS_X
g_cursorx = g_cursorx + diDeviceData(i).lData * g_Sensitivity
' We don't want to update the cursor or draw a line is response to
' separate axis movements, or we will get a staircase instead of diagonal lines.
' A diagonal movement of the mouse results in two events with the same sequence number.
' In order to avoid postponing the last event till the mouse moves again, we always
' reset OldSequence after it's been tested once.
If OldSequence <> diDeviceData(i).lSequence Then
UpdateCursor
OldSequence = diDeviceData(i).lSequence
Else
OldSequence = 0
End If
Case DIMOFS_Y
g_cursory = g_cursory + diDeviceData(i).lData * g_Sensitivity
If OldSequence <> diDeviceData(i).lSequence Then
UpdateCursor
OldSequence = diDeviceData(i).lSequence
Else
OldSequence = 0
End If
Case DIMOFS_BUTTON0
If diDeviceData(i).lData And &H80 Then
Drawing = True
' Keep record for Line function
CurrentX = g_cursorx
CurrentY = g_cursory
' Draw a point in case button-up follows immediately
PSet (g_cursorx, g_cursory)
Else
Drawing = False
End If
Case DIMOFS_BUTTON1
If diDeviceData(i).lData = 0 Then ' button up
Popup
End If
End Select
Next i
Exit Sub
INPUTLOST:
' Windows stole the mouse from us. DIERR_INPUTLOST is raised if the user switched to
' another app, but DIERR_NOTACQUIRED is raised if the Windows key was pressed.
If (Err.Number = DIERR_INPUTLOST) Or (Err.Number = DIERR_NOTACQUIRED) Then
SetSystemCursor
Exit Sub
End If
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 93 ' AppMenu key
Popup
End Select
End Sub
Private Sub Form_Load()
subClass.Hook Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
' Restore the default window procedure
subClass.UnHook
If EventHandle <> 0 Then objDX.DestroyEvent EventHandle
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim didevstate As DIMOUSESTATE
' We want to force acquisition of the mouse whenever the context menu is closed,
' whenever we switch back to the application, or in any other circumstance where
' Windows is finished with the cursor. If a MouseMove event happens,
' we know the cursor is in our app window and Windows is generating mouse messages, therefore
' it's time to reacquire.
' Note: this event is triggered whenever the window gets the mouse, even when there's no mouse
' activity -- for example, when we have just Alt+Tabbed back, or cancelled out of the context
' menu with the Esc key.
If Suspended Then Exit Sub ' Allow continued use of Windows cursor
' This event gets called again after we acquire the mouse. In order to prevent the cursor
' position being set to the middle of the window, we check to see if we've already acquired,
' and if so, we don't reposition our private cursor. The only way to find out if the mouse
' is acquired is to try to retrieve data.
On Error GoTo NOTYETACQUIRED
Call objDIDev.GetDeviceStateMouse(didevstate)
On Error GoTo 0
Exit Sub
NOTYETACQUIRED:
Call AcquireMouse
End Sub
Sub AcquireMouse()
Dim CursorPoint As POINTAPI
' Move private cursor to system cursor.
Call GetCursorPos(CursorPoint) ' Get position before Windows loses cursor
Call ScreenToClient(hWnd, CursorPoint)
On Error GoTo CANNOTACQUIRE
objDIDev.Acquire
g_cursorx = CursorPoint.x
g_cursory = CursorPoint.y
UpdateCursor
frmCanvas.imgPencil.Visible = True
On Error GoTo 0
Exit Sub
CANNOTACQUIRE:
Exit Sub
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
' Allows user to resume by clicking on the canvas.
If Button = 1 Then Suspended = False
End Sub
Private Sub mnuAbout_Click()
Call frmAbout.Show(vbModal, Me)
End Sub
Private Sub mnuClear_Click()
Cls
End Sub
Private Sub mnuSpeed1_Click()
g_Sensitivity = 1
mnuSpeed1.Checked = True
mnuSpeed2.Checked = False
mnuSpeed3.Checked = False
End Sub
Private Sub mnuSpeed2_Click()
g_Sensitivity = 2
mnuSpeed2.Checked = True
mnuSpeed1.Checked = False
mnuSpeed3.Checked = False
End Sub
Private Sub mnuSpeed3_Click()
g_Sensitivity = 3
mnuSpeed3.Checked = True
mnuSpeed1.Checked = False
mnuSpeed2.Checked = False
End Sub
Private Sub mnuSuspend_Click()
Suspended = Not Suspended
imgPencil.Visible = Not Suspended
End Sub
Public Sub UpdateCursor()
' Update the position of our private cursor
If g_cursorx < 0 Then g_cursorx = 0
If g_cursorx >= frmCanvas.ScaleWidth Then g_cursorx = frmCanvas.ScaleWidth - 1
If g_cursory < 0 Then g_cursory = 0
If g_cursory >= frmCanvas.ScaleHeight Then g_cursory = frmCanvas.ScaleHeight - 1
frmCanvas.imgPencil.Left = g_cursorx
frmCanvas.imgPencil.Top = g_cursory
If Drawing Then
Line -(g_cursorx, g_cursory)
End If
End Sub
Public Sub Popup()
objDIDev.Unacquire
SetSystemCursor
Call PopupMenu(mnuContext)
End Sub
Public Sub SetSystemCursor()
' Get the system cursor into the same position as the private cursor,
' and stop drawing
Dim point As POINTAPI
imgPencil.Visible = False
Drawing = False
point.x = g_cursorx
point.y = g_cursory
Call ClientToScreen(hWnd, point)
Call SetCursorPos(point.x, point.y)
End Sub
Private Sub subClass_WindowsMessage(ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
' This procedure intercepts Windows messages and looks for any that might encourage us
' to Unacquire the mouse.
If (uMsg = WM_ENTERMENULOOP) And (Not Suspended) Then
objDIDev.Unacquire
SetSystemCursor
End If
End Sub