解像度が変わると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を参考にしました。)
画像を初めて添付しますが、文字が小さいなどの不具合があったら、すみません。
(画像は帳尻あわせをして、正常に動いている時のものです。)
お礼
回答ありがとう御座います。 おっしゃる通り、下記コードの見落としでした。 void CTestDlg::OnDestroy() //付箋 { CDialog::OnDestroy(); // 終了直前に現在の座標を覚える GetWindowRect( &m_rect ); } ウィンドウの場合も同様に以下のようにしてみました。 下記関数内では正しい座標が取得できています。 void CMyWnd::OnDestroy() //付箋 { CWnd::OnDestroy(); // 終了直前に現在の座標を覚える GetWindowRect( &m_rect ); delete this; } しかしながら、 TRACE ( "X1(%d) Y1(%d) X2(%d) Y2(%d)\n", pDlg->m_rect.left, pDlg->m_rect.top, pDlg->m_rect.right, pDlg->m_rect.bottom ); の時点では、明らかに違う値に変わっています。(でたらめな値になっている) また、行き詰りました。 助言ください。お願いいたします。
補足
どうも付箋が破棄された時点で座標データも消えてしまってるようです。 これは当然のことなのでしょうか? そうだとすると、ダイアログの場合はどうして消えないのでしょうか? よろしくお願いいたします。