エディットボックスのスクロールの連動について – プログラミング – Home

エディットボックスのスクロールの連動に...
 
通知
すべてクリア

[解決済] エディットボックスのスクロールの連動について


bal
 bal
(@bal)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

こんにちは
balと申します

過去レスに一致するものがございませんでしたので質問させて頂きます
開発環境はWin2000、VC++6.0、MFC、ダイアログベースです

1つのダイアログボックスの中にエディットコントロールを2つ横に並べ
チェックボックスにより連動/非連動でスクロールさせたいと考えております
ところが、スクロールの連動はするのですが問題点が2つ発生してしまいました
1.スクロールバーは連動するがエディットボックス内の内容はスクロールしない
2.クリックアンドドラッグでスクロールバーを移動すると連動しない

説明がわかりにくくて申し訳ございませんが、何卒ヒントの程宜しくお願い致します。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

連動させる部分のソースコードがないと、何とも言えません。


返信引用
bal
 bal
(@bal)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

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);
}


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

GetScrollPos()はスクロールバーの位置を変える関数で、
スクロールバーが操作されたことがEDITに伝えられるわけではないと思います。

WM_VSCROLL,WM_HSCROLLメッセージをEDITに送って
擬似的にスクロールバー操作イベントを発生させてはどうでしょう。

>2.クリックアンドドラッグでスクロールバーを移動すると連動しない

上記処理がどこにあるのかわかりませんが、
スクロール操作のイベントを捕まえたいなら、
EDITをサブクラス化してWM_VSCROLL,WM_HSCROLLを処理すればよいでしょう。


返信引用
bal
 bal
(@bal)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

dairygoods様:
早速のご回答、有難うございます。
再度検討し、解決次第ここに載せたいと思っております。


返信引用
bal
 bal
(@bal)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

解決しました!
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);
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました