Ignore:
Timestamp:
Jul 13, 2008, 1:47:20 PM (16 years ago)
Author:
イグトランス (egtra)
Message:

キー関連とCreateイベントの追加

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/ablib/src/Classes/ActiveBasic/Windows/UI/Forms/Control.ab

    r542 r544  
    1414Class Control
    1515Public
    16 
    17 '1
    18 
    1916    Sub Control()
    2017    End Sub
     
    4744
    4845'--------------------------------
    49 ' 1 ウィンドウ作成
     46' ウィンドウ作成
    5047/*
    5148    Function Create(
     
    9087Public
    9188    Virtual Function WndProc(msg As DWord, wp As WPARAM, lp As LPARAM) As LRESULT
    92 /*
    93         Select Case msg
    94             Case WM_MOUSELEAVE
    95                 OnMouseLeave(makeMouseEventFromWPLP(wp, lp))
    96                 mouseEntered = False
    97             Case WM_KEYDOWN
    98                 OnKeyDown(New KeyEventArgs(makeKeysFormWPLP(wp, lp)))
    99             Case WM_KEYUP
    100                 OnKeyUp(New KeyEventArgs(makeKeysFormWPLP(wp, lp)))
    101             Case WM_CHAR
    102                 OnKeyPress(New KeyPressEventArgs(wp As Char))
    103 '           Case WM_CREATE
    104             Case WM_DESTROY
    105                 OnDestroy(EventArgs.Empty)
    106             Case Else
    107                 WndProc = DefWndProc(msg, wp, lp)
    108         End Select
    109 */
    11089        Dim h = Nothing As MessageEventHandler
    11190        Dim b = messageMap.TryGetValue(Hex$(msg), h)
     
    126105
    127106Private
    128     Static Function makeKeysFormWPLP(wp As WPARAM, lp As LPARAM) As Keys
     107    Static Function makeKeysFormMsg(e As MessageEventArgs) As Keys
    129108        Dim t As DWord
    130         t = wp And Keys.KeyCode
     109        t = e.WParam And Keys.KeyCode
    131110        t Or= (GetKeyState(VK_SHIFT) As Word And &h8000) << 1
    132111        t Or= (GetKeyState(VK_CONTROL) As Word And &h8000) << 2
    133112        t Or= (GetKeyState(VK_MENU) As Word And &h8000) << 3
    134         makeKeysFormWPLP = t As Keys
    135     End Function
    136 
    137     Static Function makeMouseEventFromWPLP(wp As WPARAM, lp As LPARAM) As MouseEventArgs
    138         makeMouseEventFromWPLP = New MouseEventArgs(LOWORD(wp) As MouseButtons, 1, GET_X_LPARAM(lp), GET_Y_LPARAM(lp), 0)
     113        makeKeysFormMsg = t As Keys
     114    End Function
     115
     116    Static Function makeMouseEventFromMsg(e As MessageEventArgs) As MouseEventArgs
     117        Dim wp = e.WParam
     118        Dim lp = e.LParam
     119        makeMouseEventFromMsg = New MouseEventArgs(LOWORD(wp) As MouseButtons, 1, GET_X_LPARAM(lp), GET_Y_LPARAM(lp), 0)
    139120    End Function
    140121
     
    146127    Sub StartWndProc()
    147128        Dim t = This '#177対策
    148         messageMap = New System.Collections.Generic.Dictionary<Object, MessageEventHandler>
    149129        AddMessageEvent(WM_ERASEBKGND, AddressOf(t.OnEraseBackground))
    150130        Dim md = New MessageEventHandler(AddressOf(t.OnMouseDownBase))
     
    163143        AddMessageEvent(WM_MBUTTONDBLCLK, mu)
    164144        AddMessageEvent(WM_XBUTTONDBLCLK, mu)
     145
     146        AddMessageEvent(WM_MOUSELEAVE, AddressOf(t.OnMouseLeaveBase))
    165147        AddMessageEvent(WM_PAINT, AddressOf(t.OnPaintBase))
     148        AddMessageEvent(WM_KEYDOWN, AddressOf(t.OnKeyDownBase))
     149'       AddMessageEvent(WM_CHAR, AddressOf(t.OnChar))   
     150        AddMessageEvent(WM_CREATE, AddressOf(t.OnCreateBase))
    166151    End Sub
    167152
     
    174159
    175160    Sub OnMouseDownBase(sender As Object, e As MessageEventArgs)
    176         OnMouseDown(makeMouseEventFromWPLP(e.WParam, e.LParam))
     161        OnMouseDown(makeMouseEventFromMsg(e))
    177162    End Sub
    178163
    179164    Sub OnMouseUpBase(sender As Object, e As MessageEventArgs)
    180         Dim me = makeMouseEventFromWPLP(e.WParam, e.LParam)
     165        Dim me = makeMouseEventFromMsg(e)
    181166        If doubleClickFired = False Then
    182             OnClick(EventArgs.Empty)
     167'           OnClick(System.EventArgs.Empty)
    183168            OnMouseClick(me)
    184169            doubleClickFired = False
     
    188173
    189174    Sub OnMouseDblClkBase(sender As Object, e As MessageEventArgs)
    190         Dim me = makeMouseEventFromWPLP(e.WParam, e.LParam)
     175        Dim me = makeMouseEventFromMsg(e)
    191176        doubleClickFired = True
    192177        OnMouseDown(me)
    193         OnDoubleClick(EventArgs.Empty)
     178'       OnDoubleClick(System.EventArgs.Empty)
    194179        OnMouseDoubleClick(me)
    195180    End Sub
    196181
    197182    Sub OnMouseMoveBase(sender As Object, e As MessageEventArgs)
    198         Dim me = makeMouseEventFromWPLP(e.WParam, e.LParam)
     183        Dim me = makeMouseEventFromMsg(e)
    199184        If mouseEntered Then
    200185            OnMouseMove(me)
     
    205190    End Sub
    206191
     192    Sub OnMouseLeaveBase(sender As Object, e As MessageEventArgs)
     193        Dim me = makeMouseEventFromMsg(e)
     194        OnMouseLeave(me)
     195        mouseEntered = False
     196    End Sub
     197
    207198    Sub OnPaintBase(sender As Object, e As MessageEventArgs)
    208199        Dim ps As PAINTSTRUCT
    209200        BeginPaint(hwnd, ps)
    210 '       Try
    211 '           OnPaintDC(New PaintDCEventArgs(ps.hdc, ps.rcPaint))
    212 '       Finally
     201        Try
     202            OnPaintDC(New PaintDCEventArgs(ps.hdc, ps.rcPaint))
     203        Finally
    213204            EndPaint(hwnd, ps)
    214 '       End Try
    215     End Sub
    216 
     205        End Try
     206    End Sub
     207
     208    Sub OnKeyDownBase(sender As Object, e As MessageEventArgs)
     209        OnKeyDown(New KeyEventArgs(makeKeysFormMsg(e)))
     210    End Sub
     211
     212    Sub OnKeyUpBase(sender As Object, e As MessageEventArgs)
     213        OnKeyUp(New KeyEventArgs(makeKeysFormMsg(e)))
     214    End Sub
     215
     216'   コメントアウト解除のときはStartWndProcのコメントアウト解除も忘れないこと
     217'   Sub OnChar(sender As Object, e As MessageEventArgs)
     218'       OnKeyPress(New KeyPressEventArgs(e.WParam As Char))
     219'   End Sub
     220
     221    Sub OnCreateBase(sender As Object, e As MessageEventArgs)
     222        OnCreate(New CreateEventArgs(e.LParam As *CREATESTRUCT))
     223    End Sub
    217224
    218225    messageMap As System.Collections.Generic.Dictionary<Object /*DWord*/, MessageEventHandler>
     
    260267'--------
    261268'イベント
    262 ' 3
    263269
    264270#include "ControlEvent.sbp"
    265271
    266272'--------------------------------
    267 ' 1 インスタンスメンバ変数
     273' インスタンスメンバ変数
    268274Private
    269275    hwnd As HWND
     
    281287
    282288'--------------------------------
    283 ' 1 初期ウィンドウクラス
     289' 初期ウィンドウクラス
    284290Private
    285291    Static Function WndProcFirst(hwnd As HWND, msg As DWord, wp As WPARAM, lp As LPARAM) As LRESULT
     
    339345
    340346'--------------------------------
    341 ' 1 初期化終了関連(特にウィンドウクラス)
     347' 初期化終了関連(特にウィンドウクラス)
    342348Private
    343349    'ウィンドウ作成時にウィンドウプロシージャへThisを伝えるためのもの
     
    450456    Inherits Form
    451457Public
    452     Sub NcDestory(sender As Object, et As EventArgs)
     458    Sub t()
     459        Dim f = This
     460        f.AddMessageEvent(WM_DESTROY, AddressOf (f.Destory))
     461        f.AddPaintDC(AddressOf (f.Paint))
     462    End Sub
     463
     464    Sub Destory(sender As Object, e As EventArgs)
     465        OutputDebugString(Ex"Destory\r\n")
    453466        PostQuitMessage(0)
    454467    End Sub
     468
     469    Sub Paint(sender As Object, e As PaintDCEventArgs)
     470        TextOut(e.Handle, 10, 10, "Hello world!", 12)
     471    End Sub
    455472End Class
    456473
    457474Dim f = New MyForm
     475f.t()
    458476f.Create()
    459 Dim h = New MessageEventHandler(AddressOf (f.NcDestory))
    460 f.AddMessageEvent(WM_NCDESTROY, h)
    461477ShowWindow(f.Handle, SW_SHOW)
    462478
     
    481497
    482498End
    483 
Note: See TracChangeset for help on using the changeset viewer.