質問者
ユニコードライブラリを使った場合のCreateDragImageの異常

質問
-
.NET2005/VISTAです。
2つのリストビュー間で、複数の列がある1行を、そっくりドラッグ&ドロップをする場合に、ユニコードにしてTCHAR型を使うと、文字列のイメージをうまく取得できません。
マウスポインタをドラッグしている時に、1列目の文字列しかついてきません。
しかも文字列の部分の背景色が半透明のグレイになってしまいます。
たとえぱ、1行が3列で、入っている文字列が、aaa bbb ccc の行をドラッグしようとすると、マウスポインタに aaa しかついてきません。
アプリを新たに作るとき、アプリケーションウイザードで、「ユニコードライブラリを使用する」のチェックを外し、char型をつかうと、3列の文字列とも、きれいについてくるので、文字型の問題だと思うのです。
コードは下記です。
アドバイスをお願いいたします。
リストビュー m_list1 から m_list2 にドラッグ&ドロップさせるコードで、m_list1をサブクラス化(CmyListCtrl)しています。
CImageList* m_pDragImage;
BOOL m_bDrag;
HTREEITEM m_hitemDrag;
int iRow, nLen, nIndex;
CPoint nPo, pPo;
として
void CmyListCtrl:nLButtonDown(UINT nFlags, CPoint point)
{
iRow = HitTest(point);
nLen = point.x;
CListCtrl:nLButtonDown(nFlags, point);
}
void CmyListCtrl:nMouseMove(UINT nFlags, CPoint point)
{
POINT pt;
if (m_bDrag) {
pt.x = point.x-nLen; pt.y = point.y;
ClientToScreen( &pt );
CImageList:ragMove(pt);
}
CListCtrl:nMouseMove(nFlags, point);
}
void CmyListCtrl:nLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
if( !(m_pDragImage = CreateDragImage(iRow, &pPo)) ) {return; }
m_bDrag = TRUE;
m_pDragImage->BeginDrag(0, CPoint(0, 0));
ClientToScreen( &pPo );
m_pDragImage->DragEnter(NULL, pPo);
SetCapture();
*pResult = 0;
}
すべての返信
-
提示されているコードだけでは、ちょっと分かりませんが、
以下のような文字列を取得するようなAPIを呼び出す場合に、
文字数ではなくバイト数を呼び出したりしていませんか?
BOOL GetHoge(LPCTSTR szHoge, int nLength);
#if 0 // バイト数
TCHAR szHoge[16] = { 0 };
BOOL br = ::GetHoge(szHoge, sizeof(zHoge));
#else // 文字数
TCHAR szHoge[16] = { 0 };
BOOL br = ::GetHoge(szHoge, (sizeof(zHoge) / sizeof(TCHAR)));
#endif -
社本 ワック さん、、ありがとうございます。
BOOL GetHoge(LPCTSTR szHoge, int nLength); というような関数は作っていません。
以前ネットで見つけたコードをもとにしているのですが、ユニコードを使わなければ、
CreateDragImage(iRow, &pPo)) だけで、1行分の文字列がイメージに入るようです。
掲載していないのは、OnLButtonUp(UINT nFlags, CPoint point) だけで、これはドロップの部分なので、
関係ないと思います。
あくまでイメージの問題だけで、ドロップは正しく行われています。
-
-
とっちゃんさん、ありがとうございます。
。。。なかなかメッセージの文字サイズがうまくいきません。
リストの描画のコードは下記です。
というか、アプリのコードがこれで全部です。
OnLButtonUpの中身は全部コメントアウトしました。
試しに、TCHARでなく、wchar_tに置き換えてみましたが、やはりダメでした。
どこか、おかしいでしょうか。
wchar_t mych1[30];
LVCOLUMN myColumn; myColumn.mask = LVCF_TEXT|LVCF_WIDTH;
myColumn.cx = 90;
myColumn.pszText = L"0列目"; m_list1.InsertColumn(0,&myColumn);
myColumn.cx = 90;
myColumn.pszText = L"1列目";
m_list1.InsertColumn(1,&myColumn);
myColumn.cx = 90;
myColumn.pszText = L"2列目";
m_list1.InsertColumn(2,&myColumn);
static LVITEM myITEM;
for (int i=0; i<=9; i++) {
myITEM.mask = LVIF_TEXT; myITEM.iItem = i; myITEM.iSubItem = 0;
wcscpy_s( mych1, L"テスト0" ); myITEM.pszText = mych1;
m_list1.InsertItem(&myITEM);
myITEM.iItem = i; myITEM.iSubItem = 1;
wcscpy_s( mych1, L"テスト1" ); myITEM.pszText = mych1;
m_list1.SetItem(&myITEM);
myITEM.iItem = i; myITEM.iSubItem = 2;
wcscpy_s( mych1, L"テスト2" ); myITEM.pszText = mych1;
m_list1.SetItem(&myITEM);
}m_list1.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_TWOCLICKACTIVATE | LVS_EX_GRIDLINES);
long state; state = ::GetWindowLong(m_list1.GetSafeHwnd(),GWL_STYLE);
:
etWindowLong(m_list1.GetSafeHwnd(),GWL_STYLE,(state & ~LVS_TYPEMASK)|LVS_REPORT);