解像度が変わるとEditコントロールの位置がずれる
いつも皆様、お世話になっております。
一つ教えてください。
解像度が変わるとエディット・コントロールの位置がずれるのですが、
ずばりクリックした行にエディット・コントロールを張り付かせたいです。
EditCellShow 関数は、セルを↑↓←→で移動した場合 や リストコントロールをスクロールした時などに呼び出されます。
(最後にクリックした行、列は、正しく拾えているものとします。)
(そして、workRow、workColumnに代入されます。)
例えば、1280 × 800 ピクセル (Windows Vista 32bit)では、以下のコードで正常に動作します。
1920 × 1080 ピクセル (Windows7 64bit)では、上にずれます。
もし解像度の問題でなければすみません、でも他のXPマシンや Windows7 マシンでも正常に動作しました。
void CFileListCreatorDlg::EditCellShow(int workRow,int workColumn)
{
if (m_xvChkEditCellMode == TRUE){
CFileListCreatorDlg::StatusStringSet(_T("ファイル名 や 備考欄 の 編集モードになりました (セルをクリックするか、クリック後 矢印キーで素早く移動、Enterで確定)"),0,FALSE);
//StatusStringSet()関数は、ステータス文字を画面上部に表示し、警告音を鳴らすユーザー関数
}
::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT_Item),SW_HIDE);
::ShowWindow(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),SW_HIDE);//追加2011.10.08
::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_Item),_T(""));
//m_xcListは、IDC_LISTの変数名
m_xcList.SetItemState(workRow, // フォーカス&非選択状態にしたいアイテムのインデックス
!LVIS_FOCUSED | !LVIS_SELECTED, // 状態
LVIS_FOCUSED | LVIS_SELECTED); // マスク
//UpdateWindow();
HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST);
RECT rect;
int nItem;
int nSubItem;
//何回も代入していますが、特に意味はありません、参考サイトのまま ソースコードを使いたかったので、それに合わせました。
nItem = workRow;
nSubItem = workColumn;
LastSelectedRow = nItem;
LastSelectedColumn = nSubItem;
////0:ファイル重複識別ナンバー 1:通し番号 2:フルパス 3:ファイル名 4:おおよそのデータサイズ 5:データサイズ 6:修正日 7:修正時間 8:備考欄 9:書式情報
if((nSubItem == 0 || nSubItem == -1 || nItem == -1) || (nSubItem != 3 && nSubItem != 8)){ //2011.09.22変更
//ファイル名と備考欄のみ編集可能に、他のカラムがクリックされた場合は、ファイル名編集欄に移動
nSubItem = 3;
LastSelectedColumn = nSubItem;
}
CFileListCreatorDlg::m_xcList.EnsureVisible(nItem, FALSE);
CString str = m_xcList.GetItemText(nItem,nSubItem);
ListView_GetSubItemRect(hWnd1,nItem,nSubItem,LVIR_BOUNDS,&rect);
if(nItem != -1)
::SetWindowPos(::GetDlgItem(m_hWnd,IDC_EDIT_Item),
HWND_TOP,rect.left + (18),rect.top + 4 + ( 16*5+2 ), //追加2011.09.22 //(18)と( 16*5+2 )は、帳尻あわせ //HWND_TOPは、IDC_LISTのTOPを取っているのか?
rect.right-rect.left - 3,
rect.bottom-rect.top -1,NULL);
::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT_Item),SW_SHOW);
::SetFocus(::GetDlgItem(m_hWnd,IDC_EDIT_Item));
::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_Item),str);
::SetWindowPos(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),//追加2011.10.08
HWND_TOP,rect.left + (18) -17 ,rect.top + 4 + ( 16*5+2 ), //追加2011.09.22 //(18)と( 16*5+2 )は、帳尻あわせ //HWND_TOPは、IDC_LISTのTOPを取っているのか?
17,
12 ,NULL);
::ShowWindow(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),SW_SHOW);//追加2011.10.08
}
参考サイト: http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx?display=Print
(主に、項番10を参考にしました。)
画像を初めて添付しますが、文字が小さいなどの不具合があったら、すみません。
(画像は帳尻あわせをして、正常に動いている時のものです。)
お礼
丁寧に説明していただきありがとうございます。 おかげで、カーソル位置にアイコン中心が来るようになりました。 ただ、未だに、ドラッグイメージのアイコン位置と文字位置との ズレが生じたままでしたので、もう少し調べてみます。