こんにちは
balと申します
過去レスに一致するものがございませんでしたので質問させて頂きます
開発環境はWin2000、VC++6.0、MFC、ダイアログベースです
1つのダイアログボックスの中にエディットコントロールを2つ横に並べ
チェックボックスにより連動/非連動でスクロールさせたいと考えております
ところが、スクロールの連動はするのですが問題点が2つ発生してしまいました
1.スクロールバーは連動するがエディットボックス内の内容はスクロールしない
2.クリックアンドドラッグでスクロールバーを移動すると連動しない
説明がわかりにくくて申し訳ございませんが、何卒ヒントの程宜しくお願い致します。
連動させる部分のソースコードがないと、何とも言えません。
dairygoods様:
申し訳ございません
早速ソースコードを載せておきます
if (IsDlgButtonChecked(IDC_CHECK_SCR) != 0)
{
int hpos = GetDlgItem(IDC_EDIT_B)->GetScrollPos(SB_HORZ);
int vpos = GetDlgItem(IDC_EDIT_B)->GetScrollPos(SB_VERT);
GetDlgItem(IDC_EDIT_A)->SetScrollPos(SB_HORZ, hpos, TRUE);
GetDlgItem(IDC_EDIT_A)->SetScrollPos(SB_VERT, vpos, TRUE);
}
GetScrollPos()はスクロールバーの位置を変える関数で、
スクロールバーが操作されたことがEDITに伝えられるわけではないと思います。
WM_VSCROLL,WM_HSCROLLメッセージをEDITに送って
擬似的にスクロールバー操作イベントを発生させてはどうでしょう。
>2.クリックアンドドラッグでスクロールバーを移動すると連動しない
上記処理がどこにあるのかわかりませんが、
スクロール操作のイベントを捕まえたいなら、
EDITをサブクラス化してWM_VSCROLL,WM_HSCROLLを処理すればよいでしょう。
dairygoods様:
早速のご回答、有難うございます。
再度検討し、解決次第ここに載せたいと思っております。
解決しました!
1つ目の問題は以下のような処理で実装できました
*****************************************************************************
m_LenB = (エディットボックスの横の最大値)
m_LineB = (エディットボックスの行数)
m_ScrFlg = OFF;
・
・
・
if (m_ScrFlg == OFF) {
m_ScrFlg = ON;
// 現在の水平スクロールバーの位置取得
int hpos = GetDlgItem(IDC_EDIT_A)->GetScrollPos(SB_HORZ);
// 現在の垂直スクロールバーの位置取得
int vpos = GetDlgItem(IDC_EDIT_A)->GetScrollPos(SB_VERT);
// カーソルの原点復帰
GetDlgItem(IDC_EDIT_B)->SendMessage(EM_LINESCROLL, 0 - m_LenB, 0 - m_LineB);
// カーソルの移動
GetDlgItem(IDC_EDIT_B)->SendMessage(EM_LINESCROLL, hpos, vpos);
m_ScrFlg = OFF;
}
**************************************************************************
2つ目の問題は以下のような処理で実装できました
*****************************************************************************
// 現在の水平スクロールバーの位置取得
int hpos = GetScrollPos(SB_HORZ);
// 現在の垂直スクロールバーの位置取得
int vpos = GetScrollPos(SB_VERT);
// 操作されたエディットの判定
int contid = GetDlgCtrlID();
// 変換前エディットの操作
if (contid == IDC_EDIT_B)
{
// カーソルの原点復帰
pRDlg->GetDlgItem(IDC_EDIT_A)->SendMessage(EM_LINESCROLL,
0 - pRDlg->m_VA, 0 - pRDlg->m_HA);
// カーソルの移動
pRDlg->GetDlgItem(IDC_EDIT_A)->SendMessage(EM_LINESCROLL,
hpos, vpos);
// 変換後エディットの操作
} else
{
// カーソルの原点復帰
pRDlg->GetDlgItem(IDC_EDIT_B)->SendMessage(EM_LINESCROLL,
0 - pRDlg->m_VB, 0 - pRDlg->m_HB);
// カーソルの移動
pRDlg->GetDlgItem(IDC_EDIT_B)->SendMessage(EM_LINESCROLL,
hpos, vpos);
}