リストビューのUnicode版について

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
THEREMIN
記事: 36
登録日時: 2007年2月11日(日) 01:52
お住まい: HYOGO pref.

リストビューのUnicode版について

#1 投稿記事 by THEREMIN »

リストビューにUTF-16LE(XP標準文字コード)の文字列を追加したいと思っているのですが、
リストビューはUnicode対応しているのでしょうか?
コモンコントロールのソースを参考に、Unicode対応のListViewマクロを作って
UTF16文字列(WordPtr型)を指定して渡してみたのですが、文字化けしてしまいます。

具体的には、以下のようにSendMessageをSendMessageWにして
LVITEM構造体とLVCOLUMN構造体のpszTextをWordPtr型にした
WLVITEM構造体とWLVCOLUMN構造体というのを定義し、LPARAMに渡しています。

コード: 全て選択

/** Unicode版リストビューの構造体 **/
Type WLVITEM
	mask As DWord
	iItem As Long
	iSubItem As Long
	state As DWord
	stateMask As DWord
	pszText As WordPtr
	cchTextMax As Long
	iImage As Long
	lParam As LPARAM
	iIndent As Long
End Type
TypeDef LPWLVITEM = *WLVITEM

Type WLVCOLUMN
	mask As DWord
	fmt As Long
	cx As Long
	pszText As WordPtr
	cchTextMax As Long
	iSubItem As Long
	iImage As Long
	iOrder As Long
End Type
TypeDef LPWLVCOLUMN = *WLVCOLUMN

/** Unicode版リストビュー **/
Function ListView_SetItemW(hwnd As HWND, ByRef ref_lvItem As WLVITEM) As Long
	ListView_SetItemW=SendMessageW(hwnd,LVM_SETITEM,0,VarPtr(ref_lvItem) As LPARAM) As Long
End Function

Function ListView_InsertItemW(hwnd As HWND, ByRef ref_lvItem As WLVITEM) As Long
	ListView_InsertItemW=SendMessageW(hwnd,LVM_INSERTITEM,0,VarPtr(ref_lvItem) As LPARAM) As Long
End Function

Function ListView_GetColumnW(hwnd As HWND, iCol As Long, ByRef ref_col As WLVCOLUMN) As BOOL
	ListView_GetColumnW=SendMessageW(hwnd,LVM_GETCOLUMN,iCol,VarPtr(ref_col) As LPARAM) As BOOL
End Function

Function ListView_SetColumnW(hwnd As HWND, iCol As Long, ByRef ref_col As WLVCOLUMN) As BOOL
	ListView_SetColumnW=SendMessageW(hwnd,LVM_SETCOLUMN,iCol,VarPtr(ref_col) As LPARAM) As BOOL
End Function

Function ListView_InsertColumnW(hWnd As HWND, iCol As Long, ByRef ref_lvColumn As WLVCOLUMN) As Long
	ListView_InsertColumnW=SendMessageW(hWnd,LVM_INSERTCOLUMN ,iCol As WPARAM,VarPtr(ref_lvColumn) As LPARAM) As Long
End Function
実装例はこんな感じです。
toWCHAR("文字列")の部分は、実際には直でUnicode文字列が入ります。

コード: 全て選択

/** リストビューを作成 **/
Sub CreateListView()
	Dim hList As HWND
	hList = GetDlgItem(hMainWnd, ListView1)
	Dim lvcol As WLVCOLUMN
	With lvcol
	' 全列共通設定
		.mask	= LVCF_FMT or LVCF_WIDTH or LVCF_TEXT or LVCF_SUBITEM
		.fmt	= LVCFMT_LEFT
	' 1列目
		.pszText = toWCHAR("*")	' これは文字化けしない
		.cx = 25
	ListView_InsertColumnW(hList, 0, lvcol)
	' 2列目
		.pszText = toWCHAR("文字列")
		.cx = 200
	ListView_InsertColumnW(hList, 1, lvcol)
	End With
End Sub

' SHIFT-JISをUTF-16LEに変換
Function toWCHAR(CSTRING As String) As *WCHAR
	Dim W_Len As Long, cLen As Long
	cLen = Len(CSTRING)
	W_Len = MultiByteToWideChar(CP_ACP,0,CSTRING,cLen,0,0)
	toWCHAR = calloc((W_Len+1) <<1)
	MultiByteToWideChar(CP_ACP,0,CSTRING, -1, toWCHAR, W_Len)
End Function
*MultiByteToWideCharは定義してあります
toWCHAR()を外してコンパイルすると、警告(BytePtrからWordPtrに強制変換)が出ますが一応文字化けせずに表示できます。

環境は、WindowsXP SP2 HomeEdition / ActiveBasic Ver.4.24.00 です。
どなたかご教授願えないでしょうか?
sn*gr

#2 投稿記事 by sn*gr »

LVM_INSERTITEMW(&H104d)ではどうでしょうか

ちなみにVer4のABでもUnicode型のリテラル文字列はEx表記を応用すれば使えます
"文字列"→Ex"\x87eW[\x17R\0\0"
THEREMIN
記事: 36
登録日時: 2007年2月11日(日) 01:52
お住まい: HYOGO pref.

動作チェックOK

#3 投稿記事 by THEREMIN »

返信が遅れてすみませんでした。

>LVM_INSERTITEMW(&H104d)ではどうでしょうか
探したらこんなwebページもあったので、全部定数定義してやってみました。
http://lldev.jp/hsp/script/h_messages_listview.html
無事Unicode文字列を設定することができました。ありがとうございます。
メッセージにもUnicode版とANSI版があったのですね。
返信する