エディット ボックスで

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

エディット ボックスで

#1 投稿記事 by Toshi »

エディット ボックスにフォーカスがあるときに、
「Delete キーを押したときにカーソルの右の1文字を削除する処理」
という本来は普通の処理を「自前で行う必要が出て来た」のでやってみました。

keybd_event API で Delete キーを送ると WM_KEYDOWN や WM_KEYUP メッセージが送られるのですが、
そういったメッセージを送らないで処理をさせたいのです;;
一体どうすれば良いのでしょうか...
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: エディット ボックスで

#2 投稿記事 by NoWest »

> エディット ボックスにフォーカスがあるときに、
> 「Delete キーを押したときにカーソルの右の1文字を削除する処理」
> という本来は普通の処理を「自前で行う必要が出て来た」のでやってみました。
>
> keybd_event API で Delete キーを送ると WM_KEYDOWN や WM_KEYUP メッセージが送られるのですが、
> そういったメッセージを送らないで処理をさせたいのです;;
> 一体どうすれば良いのでしょうか...
エディットボックスの文字列を取得し、カーソルの位置を取得して
文字列とカーソル位置の次の文字を消去した後、再び文字列をエディットボックスにセットすれば良いでしょう。

ただし、全角文字は2Byte分消去しないといけないという問題はありますが。。。


SendMessageWを使ってUnicodeで処理すれば楽かもしれませんね。
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#3 投稿記事 by Toshi »

教えてくださった「取得→加工→設定」の方法は出来そうです。
SendMessageW API での方法とはどのようなものなのでしょうか?
どちらかに絞っていこうと思います。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#4 投稿記事 by NoWest »

> 教えてくださった「取得→加工→設定」の方法は出来そうです。
> SendMessageW API での方法とはどのようなものなのでしょうか?
> どちらかに絞っていこうと思います。
基本的にWIN32APIはANSI文字用とUNICODE文字用の2つが用意されています。
一般にANSI系の文字列では全角文字は2Byteなので単純に文字列をエディットボックスから取得して1文字消すと文字化けする恐れがあります。そこで文字列を最初から2Byte区切りで操作して文字化けを防ごうということです。手順は全く同じです。

コード: 全て選択

Declare Function SendMessageW Lib "user32" Alias "SendMessageW" (hWnd As HWND, wMsg As DWord, wParam As DWord, lParam As DWord) As Long

文字列操作は下のAPIを使えばよいでしょう。

コード: 全て選択

Declare Function lstrcatW Lib "kernel32" Alias "lstrcatW" (lpString1 As WordPtr, lpString2 As WordPtr) As WordPtr
Declare Function lstrcmpW Lib "kernel32" Alias "lstrcmpW" (lpString1 As WordPtr, lpString2 As WordPtr) As Long
Declare Function lstrcmpiW Lib "kernel32" Alias "lstrcmpiW" (lpString1 As WordPtr, lpString2 As WordPtr) As Long
Declare Function lstrcpyW Lib "kernel32" Alias "lstrcpyW" (lpString1 As WordPtr, lpString2 As WordPtr) As WordPtr
Declare Function lstrlenW Lib "kernel32" Alias "lstrlenW" (lpString As WordPtr) As Long


見て分かるようにこれらのAPIはByte配列ではなくWord配列を使用します。
String型とは互換性が無いので注意する必要があります。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

9xでのUnicode API

#5 投稿記事 by イグトランス »

ただしUnicodeに完全対応しているのはNT系とCEだけです。9xは壊滅的です。
SendMessageWも勿論9xでは使えません。

一応lstr系も書いておきます。
lstrlenWは数少ない9xでも使える関数です。
lstrcatWとlstrcpyWは98/MEでは使えますが95では使えません。
あとのlstr系は全部9xでは使えません。
Toshi
記事: 98
登録日時: 2005年7月19日(火) 19:47
お住まい: 山形県
連絡する:

#6 投稿記事 by Toshi »

機種依存しない「取得→加工→設定」を使おうと思います。
また、 Unicode についても勉強になりました。
ありがとうございました。
返信する