by THEREMIN » 2007年12月03日(月) 13:09
リストビューに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 です。
どなたかご教授願えないでしょうか?
リストビューにUTF-16LE(XP標準文字コード)の文字列を追加したいと思っているのですが、
リストビューはUnicode対応しているのでしょうか?
コモンコントロールのソースを参考に、Unicode対応のListViewマクロを作って
UTF16文字列(WordPtr型)を指定して渡してみたのですが、文字化けしてしまいます。
具体的には、以下のようにSendMessageをSendMessageWにして
LVITEM構造体とLVCOLUMN構造体のpszTextをWordPtr型にした
WLVITEM構造体とWLVCOLUMN構造体というのを定義し、LPARAMに渡しています。
[code]/** 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[/code]実装例はこんな感じです。
toWCHAR("文字列")の部分は、実際には直でUnicode文字列が入ります。
[code]/** リストビューを作成 **/
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[/code]
*MultiByteToWideCharは定義してあります
toWCHAR()を外してコンパイルすると、警告(BytePtrからWordPtrに強制変換)が出ますが一応文字化けせずに表示できます。
環境は、WindowsXP SP2 HomeEdition / ActiveBasic Ver.4.24.00 です。
どなたかご教授願えないでしょうか?