重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

親ウインドーからクリエイトしたエディトウインドーにスクロールバーを取り付けるのですが、WM_VSCROLLが発生しません。
親ウインドー自体にエディトウインドーを取り付けるとWM_VSCROLLが発生しています。
子ウインドーでもWM_VSCROLLが発生する方法を教えてください。

1、親ウインドークリエイト
2、WM_CREATE発生
3、以下WM_CREATE内処理
3-1、h_エディトウインドー = CreateWindow("EDIT", "",・・・WS_VSCROLL・・・);
3-2、親ウインドーにスクロールバーSetScrollInfo(hwnd, SB_VERT , &scr , TRUE);


結果、スクロールバーは親とエディトボックスにそれぞれ2組のスクロールバーができますが
ツマミの移動でWM_CREATEが発生するのは親のツマミだけです。
3-2を記述しない場合は、子にバーは出来ますがWM_CREATE発生しません。

質問者からの補足コメント

  • 先の返事で
    >このh3画面でスクロール処理はできるが、h3で登録したウインドープロシージャーでWM_VSCROLLが発生しない

    と書きましたが、これは登録名をEDITにした場合で、登録名をh3で登録したウインドープロシージャーにした場合はWM_VSCROLLが発生しますが、エディトボックスではありません。
    h3画面をエディトボックスにする方法を教えてください。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/11/24 09:40

A 回答 (5件)

>>  if (HIWORD(wParam) == EN_VSCROLL)


>のEN_VSCROLLは(HMENU)ID_xxxにしないといけないようです。

HIWORD()とLOWORD()の違いは確認した方がよい…かと。
https://docs.microsoft.com/en-us/windows/desktop …

>ツマミをドラッグした時の位置が来ません、
>scr.nTrackPosには全く何も反応がありません。

https://docs.microsoft.com/en-us/windows/desktop …
SIF_TRACKPOSが必要かと思いますが、設定していますか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
私が間違っていました、
case WM_COMMAND:
if(HIWORD(wp) == EN_VSCROLL)
{・・・}
で反応がありました、これからSIF_TRACKPOSを攻めてみます。

お礼日時:2018/11/26 12:11

実験してみました。



EditBoxはスクロールの情報を親ウィンドウへ通知はしない…ようですな。
EN_VSCROLLは通知されるので、GetScrollInfo()で自分で取得しに行く…くらいしかできないかと。

 case WM_COMMAND:
  if (HIWORD(wParam) == EN_VSCROLL)
  {
   SCROLLINFO scr = { sizeof(SCROLLINFO), SIF_POS | SIF_RANGE | SIF_PAGE };

   GetScrollInfo((HWND)lParam, SB_VERT, &scr);
  }

こんな感じ?
nMaskは適当に設定してください。

さもなければ…サブクラス化してメッセージの横取り(のぞき見?)するしかないかと。
    • good
    • 0
この回答へのお礼

ありがとうございます。
>  if (HIWORD(wParam) == EN_VSCROLL)
のEN_VSCROLLは(HMENU)ID_xxxにしないといけないようです。
ただ
GetScrollInfoのscr.nPosにはスクロールバーの位置は取れますが、
ツマミをドラッグした時の位置が来ません、
scr.nTrackPosには全く何も反応がありません。

よろしくお願いします。
WM_VSCROLLは魅力的ですから!!

お礼日時:2018/11/26 11:30

>h3 = CreateWindow("EDIT",・・・ WS_CHILD | WS_VISIBLE


>| ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_HSCROLL | WS_VSCROLL
>,0,0,0,0,h2, (HMENU)1, Instance, NULL);

親ウィンドウはh2ということなので、VM_VSCROLLが送られるとするとダイアログプロシージャになると思いますが、
WM_VSCROLLが受けられないと言っているのは「どのプロシージャ」です?
    • good
    • 0
この回答へのお礼

はい、
h3のテキストエディトのプロシージャーですが、
h3 = CreateWindow("EDIT",・・・の場合にVM_VSCROLLが来ません。
h3 = CreateWindow("登録名",・・・の場合は登録名の登録時に設定したプロシージャーにVM_VSCROLLが来ます。
"EDIT"にした場合は、テキストが開きますが、何処にもVM_VSCROLLが来ません。

"登録名"にした場合はテキストとして画面が開けませんがVM_VSCROLLが来ます。

テキスト画面でのVM_VSCROLLが欲しいのです。
よろしくお願いします。

お礼日時:2018/11/25 08:44

>スクロールバーが作られるだけで、WM_VSCROLLが発生しません。



CreateWindow()はどう記述しています?
省略なしで。

EN_VSCROLLでは…スクロール位置が取れませんしねぇ。
EN_VSCROLLでGetScrollInfo()で取れるんかなぁ。
この回答への補足あり
    • good
    • 0
この回答へのお礼

またまた、お返事が遅くなり申し訳ありません。

ウィンメイン関数で記述
h1 = CreateWindow(ClassName1,・・・HWND_DESKTOP, NULL, Instance, NULL);

メッセージループ処理での記述
h2 = CreateDialog(Instance, "登録名", h1, NULL);

メッセージループ処理での記述で登録したウインドープロシージャーのWM_CREATEで記述
h3 = CreateWindow("EDIT",・・・ WS_CHILD | WS_VISIBLE
| ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_HSCROLL | WS_VSCROLL
,0,0,0,0,h2, (HMENU)1, Instance, NULL);


このh3画面でスクロール処理はできるが、h3で登録したウインドープロシージャーでWM_VSCROLLが発生しない

お礼日時:2018/11/24 09:31

WinAPIで…なんてのは、ここ数年触っていませんけども。



>3-1、h_エディトウインドー = CreateWindow("EDIT", "",・・・WS_VSCROLL・・・);
>3-2、親ウインドーにスクロールバーSetScrollInfo(hwnd, SB_VERT , &scr , TRUE);

子ウィンドウに対してSetScrollInfo()はしないのですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
返事遅くなり申し訳ありません。
>子ウィンドウに対してSetScrollInfo()はしないのですか?
していますが、スクロールバーが作られるだけで、WM_VSCROLLが発生しません。

お礼日時:2018/11/23 08:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!