動いたスクロールバーを識別したい – 固定ページ 2 – プログラミング – Home

動いたスクロールバーを識別したい
 
通知
すべてクリア

[解決済] 動いたスクロールバーを識別したい

固定ページ 2 / 2

aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

>> # C++に不慣れとミタ。
> 愚痴っても仕方ないですが、不慣れなんてものじゃ無いです。

#慣れてから頑張れと言いたいところですが。

> CScrollBar* と*が後ろに付いているのは、
> コントロールクラスのポインタだからですか?

* がついてるのはポインタです。
コントロールクラスかどうかは、構文だけではわかりません。
これを調べるには、ヘルプを見ることです。

> CScrollBarはCWndの派生クラスです。

ってのは、「CScrollBar は CWnd の一種です」とか、もっと端的に言ってしまえば、
「CScrollBar は CWnd です」という意味です。
ですから、CWnd に対してできることは、必ず CScrollBar に対してもできます。

> CWnd::GetDlgCtrlID() を使えば良いのでしょうか?
> でも、どうやって使ったら良いのか、まだ考え中です。

もし、CScrollBar * ではなく CWnd * だったら(もし、OnHScroll の宣言が以下のよう
だったら…これは例であって、実際にはこのように書き換えろということではありませ
ん)、どうやって GetDlgCtrlID を使うかはわかりますか?

void CInterFaceView::OnHScroll(UINT nSBCode, UINT nPos, CWnd * pScrollBar)

これがわからないようだと、「慣れてから頑張れ」というアドバイスが正解のような気
がします。


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 20年前
投稿: 89
Topic starter  

>void CInterFaceView::OnHScroll(UINT nSBCode, UINT nPos, CWnd * pScrollBar)
>これがわからないようだと、「慣れてから頑張れ」というアドバイスが正解のような気
がします。

残念ながら、分かりませんでした。
実力からすると相当高度なコトをやりたいと言っていることがよく分かりました。
慣れてから頑張りたいのですが、状況が許してくれませんので・・・
やるしかない!! でしょう;
ココの掲示板は良く見させて頂いて、頼りにしていました。

void CInterFaceView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*
pScrollBar)
{
(中略)
 int SIndex, EIndex;
 SIndex = pScrollBar->GetDlgCtrlID();
EIndex = SIndex - (配列最初のIDの値);

UpdateData(true);
m_edtext_par[EIndex] = m_scroll_par[EIndex];
UpdateData(false);

pScrollBar->SetScrollPos(pos);
CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
}

でどうでしょうか?
まだ動作確認していませんが。


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 20年前
投稿: 89
Topic starter  

>* がついてるのはポインタです。

ポインタって *a というふうに、前に付くと思っていたので、
後ろについているので、ちょっととまどいました。

少し訂正して・・・

SIndex = pScrollBar->GetDlgCtrlID();
FIndex = (配列最初のID);
EIndex = SIndex - FIndex;

UpdateData(true);
m_edtext_par[EIndex].Format(%d,m_scroll_par[EIndex]);
UpdateData(false);

これで動きました。
とりあえず、自分の要求は満たせたようです。
皆様ありがとうございました。m(_ _)m


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

> 残念ながら、分かりませんでした。

ってことは、CScrollBar とかは一旦忘れて、例えば
「あるクラスのポインタを使って、そのメンバ関数を呼び出す方法」
とかいうレベルからわかんなかったりします?

もし CWnd だったら…の答えは、そのまんま

pScrollBar->GetDlgCtrlID();

でいいんですけども。

> でどうでしょうか?

GetDlgCtrlID の使い方に関しては正解です。

> m_edtext_par[EIndex] = m_scroll_par[EIndex];

これはエラーになる気がしますが。
ちなみに、m_edtext_par はエディットボックスに関連付けられた CString の配列、
m_scroll_par はスクロールバーに関連付けられた整数型変数の配列で間違いないです
か?

また、ここ

> EIndex = SIndex - (配列最初のIDの値);

が気になります。
このコードが機能するには、
・すべてのスクロールバーのIDは連続している
・すべてのエディットボックスのIDも連続している
・あるスクロールバーAのIDに+1したIDをもつスクロールバーBに
 関連付けられているエディットボックスのIDは、Aに関連付けられている
 エディットボックスのIDに+1したものである
上記3つの前提が必要ですが、これは間違いなく実現されていますか。
されているのならば構わないと思います。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

> これはエラーになる気がしますが。

既に解決されてましたか。失礼。


返信引用
Kon
 Kon
(@Kon)
ゲスト
結合: 20年前
投稿: 89
Topic starter  

>「あるクラスのポインタを使って、そのメンバ関数を呼び出す方法」
>とかいうレベルからわかんなかったりします?

う゛~ 分からないです。
とにかく、ポインタが出てきた時点で、脳みそが凍結します。
現在までにポインタが無くても済んでしまったので、
まだ、実感として身に付いていないのです。

使わないと動作が遅くなるみたいなので
いずれ乗り越えないとイケナイ壁なんですが・・・。

>・すべてのスクロールバーのIDは連続している
>・すべてのエディットボックスのIDも連続している
>・あるスクロールバーAのIDに+1したIDをもつスクロールバーBに
> 関連付けられているエディットボックスのIDは、Aに関連付けられている
> エディットボックスのIDに+1したものである

これは、DDX変数を配列にするときにえらく苦労してクリアしました。
全て順序通りに並んでいます。

ご親切にどうもありがとうございました。
今後ともよろしくお願いします。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

> 使わないと動作が遅くなるみたいなので
> いずれ乗り越えないとイケナイ壁なんですが・・・。

C / C++ を使う以上、いずれ乗り越えなければいけない壁ですが、理由は「動作が遅く
なる」というだけではありません。
言ってしまえば、C や C++ という言語自体が、ポインタの存在を前提にして設計されて
いるからです。
ポインタ不要論、ポインタ有害論というのもありますが、それはまた別の話。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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