- ベストアンサー
解像度が変わるとEditコントロールの位置がずれる
- 解像度が変わるとエディット・コントロールの位置がずれる問題についての質問です。
- クリックした行にエディット・コントロールを張り付かせる方法について教えてください。
- 特定の解像度では正常に動作するが、他の解像度ではずれる問題について質問します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
WND_TOPは座標とは無関係です これはウィンドウの表示の高さ(重なり具合)を決定します 表示する座標付近のコントロールより(Z軸での)上に表示させるためです ListViewの矩形領域をGetWindowRectで取得して ScreenToClientでクライアント座標に変換した時のtopを足してやればいいと思いますよ // ListViewの領域取得 ::GetwindowRect( ::GetDlgItem( m_hWnd, IDC_LIST ), &rect1 ); // ダイアログの領域取得 ::GetwindowRect( m_hWnd, &rect2 ); // ダイアログのクライアント座標に変換 this->ScrenToClient( &rect1 ); this->ScrenToClient( &rect2 ); int x = rect1.left - rect2.left; としておいて ::SetWindowPos(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow), HWND_TOP,rect.left + x, rect.top + rect1.top + 2, 17, 12 ,NULL); といった具合で出来ると思いますよ
その他の回答 (1)
- popombmb1013
- ベストアンサー率11% (2/18)
特にディスプレイの解像度と、そのファイルの「標準」スタイルのフォントサイズから影響を受けます。(「標準」スタイルのフォントサイズと印刷結果の縦横比との間に比例関係はないようです) 例えば、解像度が 96dpi の場合は「標準」スタイルのフォントサイズが11ポイントの方が、10ポイントや9ポイントのときよりも変化が小さくなります。解像度が 120dpi の場合は「標準」スタイルのフォントサイズが9ポイントの方が、10ポイントや11ポイントのときよりも変化が小さくなります。 グラフシートではオブジェクトは指定した大きさで印刷できるようです。 今後編集する必要がない場合や、セルに合わせてサイズ変更する必要がない場合は、コピーして拡張メタファイルとして貼り付けると、指定した大きさで印刷できるようになります。 [挿入]-[オブジェクト] でMicrosoft Word 図 や Microsoft Draw などのオブジェクトを作成し、その中にオートシェイプを作成する方法も有効です。(ただし、挿入後に Excel の操作で図の大きさを変更すると指定した大きさでは印刷されません。シート上の図の大きさの倍率は必ず100%にして、大きさの変更はオブジェクトを編集するアプリケーション側で行うようにします。また、図の書式設定で「セルに合わせて移動やサイズ変更をしない」または「セルに合わせて移動するがサイズ変更はしない」を設定する必要があります)
お礼
ありがとうございました。今後の参考にさせていただきます。
補足
>解像度が 96dpi の場合は「標準」スタイルのフォントサイズが11ポイントの方が、10ポイントや9ポイントのときよりも変化が小さくなります。 >解像度が 120dpi の場合は「標準」スタイルのフォントサイズが9ポイントの方が、10ポイントや11ポイントのときよりも変化が小さくなります。 難しいんですね。 今回の問題は、Windows7マシンを新調していなければ、全く気が付かなかったかもしれません。 ■モニタの物理解像度を得る(Win32API) http://oshiete.goo.ne.jp/qa/6417189.html 上の過去ログも参考になるかもしれませんね。 Excel と連携する事もできるのですね。Excel 版の同じ機能のVBAも作っているので、連携できれば面白そうです。ただし、余談ですが、エクセル2007、2010になってから、互換モードでも実行となってしまい、処理が重く、実用に耐えなくなってしまいました(>_<") VBAのソースコードはそのままで、2007以上にネイティブ?にできるのでしょうか?拡張子は変わるでしょうが、、、ちょっとカテゴリ違いですがυ 印刷は、HTMLに出力して、IE任せですが、自分でも作ってみるつもりです! アドバイスありがとうございましたm(_ _)m
お礼
助かりました。ありがとうございました。
補足
// ▼ここから教えて頂いた部分▼ //Get the Rectange of the listControl ListView_GetSubItemRect(hWnd1,nItem, nSubItem,LVIR_BOUNDS,&rect); CString str = m_xcList.GetItemText(nItem,nSubItem); //現在のセルの文字を取得 RECT rect1; RECT rect2; // ListViewの領域取得 ::GetWindowRect( ::GetDlgItem( m_hWnd, IDC_LIST ), &rect1 ); //wを大文字にしました。あげ足とりですみません。 // ダイアログの領域取得 ::GetWindowRect( m_hWnd, &rect2 ); // ダイアログのクライアント座標に変換 this->ScreenToClient( &rect1 ); //Scren → Screen に直しました、すべて記憶で打ってる所が凄いです! this->ScreenToClient( &rect2 ); int x = rect1.left - rect2.left; if(nItem != -1) ::SetWindowPos(::GetDlgItem(m_hWnd,IDC_EDIT_Item), //HWND_TOP,rect.left+x,rect.top+4,//変更前 HWND_TOP,rect.left + x, rect.top + rect1.top + 2, 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)); //Set the listItem text in the EditBox ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_Item),str); if(nItem != -1) ::SetWindowPos(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow), HWND_TOP,rect.left + x - 17, rect.top + rect1.top + 4, 17, 12 ,NULL); ::ShowWindow(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),SW_SHOW);//追加2011.10.08 // ▲ここまで教えて頂いた部分▲ void CFileListCreatorDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult) 関数内でも同じような処理をしているのですが、青色の矢印アイコンの上にグリッド線を描画してしまいます。なんとか、直してみます。 BOOL CFileListCreatorDlg::PreTranslateMessage(MSG* pMsg) 内の WM_LBUTTONUP とかでできるかも知れません。上下左右の矢印キーによる移動の時は、問題なしです。XPでは完全に自分が望む機能ができました。Vistaでは欠けます。 XP→Vista→7 と解像度が上がると、少しずつ表示位置の不具合が出てきます。 ただ、欠ける現象は、Vistaのみでした。不思議です。 横幅も合わせたり、色々してたので、御礼が遅くなってすみません。 ほぼ解決ですが、今回は、横幅に関しては、付け焼刃で作ってしまいました。横幅固定で。時間があるときに、各セルの幅を%で作ってみます。 ■DrawTextでの描画(過去ログ) http://oshiete.goo.ne.jp/qa/5022902.html >この方式の弱点は 2回のDrawTextを実行するといった点です > 一度目は DT_CENTER | DT_CALCRECT ... 領域計算 > 二度目は DT_CENTER ... こちらで実際に描画 > になりますす これも使ったほうがいいですね。 ご回答ありがとうございました!