3

スピン (アップ/ダウン) コントロールに問題があります。スピン コントロールのプロパティで、"Set Buddy Integer" を true に設定しました。

私のdialogboxprocのWM_INITDIALOGでは、その仲間を静的テキストコントロールに設定しています:

SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETBUDDY, (WPARAM)GetDlgItem(hDlg, IDC_STATIC1), 0);

また、最小/最大範囲と開始位置を設定しています。

SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETRANGE, 0, MAKELPARAM(1, 1));
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETPOS, 0, 1);

ダイアログボックスで特定のボタンが押されると、範囲と位置が更新されます。

SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETRANGE, 0, MAKELPARAM(2, 1));
SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_SETPOS, 0, 2);

(変数を使用して範囲と位置を設定していましたが、問題があるため、投稿したばかりのように手動で設定しています。)

位置を設定した直後に、確認のために再確認します。

LRESULT lr = SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_GETPOS, 0, 0);
WORD pos = LOWORD(lr);

ちなみにポジションは2です。

次に、スピン コントロールの下矢印をクリックします。静的テキストの相棒が 2 から 1 に変わります。dialogboxproc 内の WM_NOTIFY コードは次のようになります。

case WM_NOTIFY:
        ncode = ((LPNMHDR)lParam)->code;

        switch(ncode)
        {
        case UDN_DELTAPOS:
            {
                LRESULT lr = SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_GETPOS, 0, 0);

                if(HIWORD(lr) == 0)
                {
                    WORD pos = LOWORD(lr);

                    //Other stuff here
                    return TRUE;
                }

下矢印を押して pos の値を確認した後、位置はまだ 2 です。以前に位置を 2 に設定して下矢印を押しました。この時点で位置は 1 ではないでしょうか。何が問題ですか?

4

3 に答える 3

2

解決策を見つけましたが、それが最善の方法であるか、意図した方法であるかはわかりません。lParam を LPNMUPDOWN 型にキャストする場合:

LPNMUPDOWN lpnmud  = (LPNMUPDOWN)lParam;

現在の位置と提案された位置の変更を取得できます。現在の位置と提案された変更を追加することにより、新しい位置がどうなるかを取得できます。

int newPos = lpnmud->iPos + lpnmud->iDelta;

次に、範囲を手動で取得し、新しい位置が範囲の境界内にあるかどうかを確認する必要があります。大変な作業のように思えますが、それが通常のやり方だと思います。

于 2012-11-17T23:06:41.160 に答える
1

変更を無視するようにコントロールに指示するハンドラーにTRUE戻ります。UDN_DELTAPOS代わりに、を返す必要がありますFALSE

于 2012-11-18T07:56:52.123 に答える
0

この行の後、私はあなたのコードを試しました:

LRESULT lr = SendMessage(GetDlgItem(hDlg, IDC_SPIN2), UDM_GETPOS, 0, 0);

HIWORD(lr) は常に 0 ではなく 1 であることがわかりました。MSDN によると、正しい結果は 0 です。理由もわかりません。

スピン コントロールの位置を取得する場合は、次の方法を試してください。

LPNMUPDOWN *lpnm;
lpnm=(LPNMUPDOWN)lParam;
WORD pos;
pos=lpnm->iPos;

ちなみに、lpnm->iDelta の符号を判断することで、Spin Control のどのキーが押されたかがわかります。

于 2016-09-30T05:48:01.100 に答える