by 7 » 2006年5月21日(日) 21:52
> 何とか番号を表示するようにはなったのですが、肝心の文字が打てません。
> 打ち込むにはどうすればいいでしょうか。
ユーザーがキーボードを押した時の処理も全部自分で実装しなくてはなりません。
> また、改行したときに、番号もそれにあわせて、増えていくようにするにはどうすれば
> いいですかね。
例えば、ユーザーが改行するたびに行数をカウントアップしてその数だけ番号を描写したらいいんじゃないでしょうかねぇ。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim OEditWC As WNDCLASSEX
Dim hEdit As HWND
Dim editString As LPSTR
Dim nLineCount As Long
Dim nLineIndex As Long
Dim nLineDigit As Long
Dim hBackBrush[1] As HBRUSH
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
Select Case dwMsg
Case WM_ACTIVATE
SetFocus(hEdit)
Exit Function
End Select
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
Function OEditProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
Select Case dwMsg
Case WM_ERASEBKGND
OEditProc=TRUE
Exit Function
Case WM_CHAR
Select Case wParam
Case 8
' 現在参照している位置までの文字数を取得する必要がある。
' 消そうとしている文字が2バイト文字であるか判断する必要がある。
editString[lstrlen(editString)-1]=NULL
If nLineDigit>0 Then
nLineDigit--
End If
Case 13 , 10
If lstrlen(editString)>1023 Then Exit Function
nLineCount++
nLineIndex++
nLineDigit=0
lstrcat(editString,Ex"\r\n")
Case Else
If lstrlen(editString)>1023 Then Exit Function
nLineDigit++
lstrcat(editString,Chr$(wParam))
End Select
SetCaretPos(43+(nLineDigit*8),5+(nLineIndex*20))
InvalidateRect(hEdit,ByVal NULL,TRUE)
Case WM_KEYDOWN
Select Case wParam
Case 37 ' ←
If nLineDigit>0 Then
nLineDigit--
End If
Case 38 ' ↑
If nLineIndex>0 Then
nLineIndex--
End If
Case 39 ' →
' 参照している行の文字数を取得する必要がある。
' If nLineDigit<nLineLength Then
nLineDigit++
' End If
Case 40 ' ↓
If nLineCount>nLineIndex Then
nLineIndex++
End If
End Select
SetCaretPos(43+(nLineDigit*8),5+(nLineIndex*20))
Case WM_SETFOCUS
MainEdit_SetFocus()
Case WM_KILLFOCUS
MainEdit_KillFocus()
Case WM_PAINT
Dim ps As PAINTSTRUCT
Dim hDC As HDC
hDC=BeginPaint(hWnd,ps)
MainEdit_Paint(hDC)
EndPaint(hWnd,ps)
Case Else
OEditProc=DefWindowProc(hWnd,dwMsg,wParam,lParam)
Exit Function
End Select
OEditProc=0
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
free(editString)
DeleteObject(hBackBrush[0])
DeleteObject(hBackBrush[1])
abc_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
With OEditWC
.cbSize=SizeOf(WNDCLASSEX)
.hInstance=GetModuleHandle(0)
.style=CS_HREDRAW or CS_VREDRAW
.hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_IBEAM))
.lpszClassName="OEDIT"
.lpfnWndProc=AddressOf(OEditProc)
End With
RegisterClassEx(OEditWC)
hEdit=CreateWindowEx(
WS_EX_CLIENTEDGE,
"OEDIT",
"",
WS_CHILD or WS_VISIBLE or ES_AUTOHSCROLL or WS_HSCROLL or WS_VSCROLL,
0,0,0,0,
hMainWnd,
0,
GetModuleHandle(0),
0)
UpdateWindow(hEdit)
hBackBrush[0]=CreateSolidBrush(RGB(0,0,0))
hBackBrush[1]=CreateSolidBrush(RGB(220,220,220))
CreateCaret(hEdit,0,1,16)
SetCaretPos(43,5+(nLineCount*20))
ShowCaret(hEdit)
' エディットコントロールに入力できるのは 1024 バイト
editString=calloc(1025)
End Sub
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
MoveWindow(hEdit,0,0,cx,cy,TRUE)
End Sub
Sub MainEdit_SetFocus()
CreateCaret(hEdit,0,1,16)
ShowCaret(hEdit)
End Sub
Sub MainEdit_KillFocus()
DestroyCaret()
End Sub
Sub MainEdit_Paint(ByVal hDC As HDC)
Dim rc As RECT
Dim cnt As Long
Dim line[256] As Byte
GetClientRect(hEdit,rc)
rc.right=40
FillRect(hDC,rc,hBackBrush[1])
GetClientRect(hEdit,rc)
rc.left=40
FillRect(hDC,rc,hBackBrush[0])
SetTextColor(hDC,RGB(0,0,0))
SetBkColor(hDC,RGB(220,220,220))
For cnt=0 To nLineCount
lstrcpy(line,Str$(cnt)+":")
TextOut(hDC,5,5+(cnt*20),line,lstrlen(line))
Next
SetTextColor(hDC,RGB(255,255,255))
SetBkColor(hDC,RGB(0,0,0))
rc.left+=5
rc.top+=5
DrawText(hDC,editString,-1,rc,DT_EDITCONTROL Or DT_LEFT)
End Sub
随分と手抜きで間の抜けた作りなので参考程度にしかなりません。
このサイトを参考にご自分で頑張っては如何でしょう。
http://vivi.dyndns.org/tech/tech.phtml
自分は「行単位双方向リンク」という項目に悩んでます...。
所でエディットボックスに行数を表示する機能を考えて思いついたんですけど、エディットボックスを2つ用意して1つは行数だけ表示してれば良さそうですよね。
もう1つが改行するたびに行数を増やして。(意味不明かな...?)
入力するエディットボックスに同期させないと無理なんですけどねぇ。
> 何とか番号を表示するようにはなったのですが、肝心の文字が打てません。
> 打ち込むにはどうすればいいでしょうか。
ユーザーがキーボードを押した時の処理も全部自分で実装しなくてはなりません。
> また、改行したときに、番号もそれにあわせて、増えていくようにするにはどうすれば
> いいですかね。
例えば、ユーザーが改行するたびに行数をカウントアップしてその数だけ番号を描写したらいいんじゃないでしょうかねぇ。
[hide][code]'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim OEditWC As WNDCLASSEX
Dim hEdit As HWND
Dim editString As LPSTR
Dim nLineCount As Long
Dim nLineIndex As Long
Dim nLineDigit As Long
Dim hBackBrush[1] As HBRUSH
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
Select Case dwMsg
Case WM_ACTIVATE
SetFocus(hEdit)
Exit Function
End Select
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
Function OEditProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
Select Case dwMsg
Case WM_ERASEBKGND
OEditProc=TRUE
Exit Function
Case WM_CHAR
Select Case wParam
Case 8
' 現在参照している位置までの文字数を取得する必要がある。
' 消そうとしている文字が2バイト文字であるか判断する必要がある。
editString[lstrlen(editString)-1]=NULL
If nLineDigit>0 Then
nLineDigit--
End If
Case 13 , 10
If lstrlen(editString)>1023 Then Exit Function
nLineCount++
nLineIndex++
nLineDigit=0
lstrcat(editString,Ex"\r\n")
Case Else
If lstrlen(editString)>1023 Then Exit Function
nLineDigit++
lstrcat(editString,Chr$(wParam))
End Select
SetCaretPos(43+(nLineDigit*8),5+(nLineIndex*20))
InvalidateRect(hEdit,ByVal NULL,TRUE)
Case WM_KEYDOWN
Select Case wParam
Case 37 ' ←
If nLineDigit>0 Then
nLineDigit--
End If
Case 38 ' ↑
If nLineIndex>0 Then
nLineIndex--
End If
Case 39 ' →
' 参照している行の文字数を取得する必要がある。
' If nLineDigit<nLineLength Then
nLineDigit++
' End If
Case 40 ' ↓
If nLineCount>nLineIndex Then
nLineIndex++
End If
End Select
SetCaretPos(43+(nLineDigit*8),5+(nLineIndex*20))
Case WM_SETFOCUS
MainEdit_SetFocus()
Case WM_KILLFOCUS
MainEdit_KillFocus()
Case WM_PAINT
Dim ps As PAINTSTRUCT
Dim hDC As HDC
hDC=BeginPaint(hWnd,ps)
MainEdit_Paint(hDC)
EndPaint(hWnd,ps)
Case Else
OEditProc=DefWindowProc(hWnd,dwMsg,wParam,lParam)
Exit Function
End Select
OEditProc=0
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
free(editString)
DeleteObject(hBackBrush[0])
DeleteObject(hBackBrush[1])
abc_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
With OEditWC
.cbSize=SizeOf(WNDCLASSEX)
.hInstance=GetModuleHandle(0)
.style=CS_HREDRAW or CS_VREDRAW
.hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_IBEAM))
.lpszClassName="OEDIT"
.lpfnWndProc=AddressOf(OEditProc)
End With
RegisterClassEx(OEditWC)
hEdit=CreateWindowEx(
WS_EX_CLIENTEDGE,
"OEDIT",
"",
WS_CHILD or WS_VISIBLE or ES_AUTOHSCROLL or WS_HSCROLL or WS_VSCROLL,
0,0,0,0,
hMainWnd,
0,
GetModuleHandle(0),
0)
UpdateWindow(hEdit)
hBackBrush[0]=CreateSolidBrush(RGB(0,0,0))
hBackBrush[1]=CreateSolidBrush(RGB(220,220,220))
CreateCaret(hEdit,0,1,16)
SetCaretPos(43,5+(nLineCount*20))
ShowCaret(hEdit)
' エディットコントロールに入力できるのは 1024 バイト
editString=calloc(1025)
End Sub
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
MoveWindow(hEdit,0,0,cx,cy,TRUE)
End Sub
Sub MainEdit_SetFocus()
CreateCaret(hEdit,0,1,16)
ShowCaret(hEdit)
End Sub
Sub MainEdit_KillFocus()
DestroyCaret()
End Sub
Sub MainEdit_Paint(ByVal hDC As HDC)
Dim rc As RECT
Dim cnt As Long
Dim line[256] As Byte
GetClientRect(hEdit,rc)
rc.right=40
FillRect(hDC,rc,hBackBrush[1])
GetClientRect(hEdit,rc)
rc.left=40
FillRect(hDC,rc,hBackBrush[0])
SetTextColor(hDC,RGB(0,0,0))
SetBkColor(hDC,RGB(220,220,220))
For cnt=0 To nLineCount
lstrcpy(line,Str$(cnt)+":")
TextOut(hDC,5,5+(cnt*20),line,lstrlen(line))
Next
SetTextColor(hDC,RGB(255,255,255))
SetBkColor(hDC,RGB(0,0,0))
rc.left+=5
rc.top+=5
DrawText(hDC,editString,-1,rc,DT_EDITCONTROL Or DT_LEFT)
End Sub[/code][/hide]
随分と手抜きで間の抜けた作りなので参考程度にしかなりません。
このサイトを参考にご自分で頑張っては如何でしょう。
[url]http://vivi.dyndns.org/tech/tech.phtml[/url]
自分は「行単位双方向リンク」という項目に悩んでます...。
所でエディットボックスに行数を表示する機能を考えて思いついたんですけど、エディットボックスを2つ用意して1つは行数だけ表示してれば良さそうですよね。
もう1つが改行するたびに行数を増やして。(意味不明かな...?)
入力するエディットボックスに同期させないと無理なんですけどねぇ。