2

簡単な質問...

win32 (VC++) でツリービューを使用しています。

ツリービューに用意されている選択機能を削除したい。ツリービューのonAfterSelectイベントに投稿されたウィンドウメッセージを誰でも知ることができますか。

テレビにもチェックボックスがあります。したがって、マウスクリックを無効にすることはオプションではありません...

前もって感謝します...

- ヴァルン

詳細情報 別のポイントで立ち往生しています。私のwin32アプリケーションは基本的にモードレスダイアログです - CreateDialogとShowWindowを使用しています。TVN_SELCHANGING を取得した後、1 を返すと機能しません。Windowsメッセージをバイパスする前に、デフォルトのwndprocが呼び出されていると思います。私は今どうすればいい?

4

3 に答える 3

3

私はこの問題を抱えていて、すでに行われていた選択を元に戻しました。とにかく、それに反応しない場合でも、副作用はないはずです.

case WM_NOTIFY:     
    {
        if(wParam == IDC_TREE_MC)
        {
            LPNMHDR lpnmh = (LPNMHDR) lParam;
            TVHITTESTINFO ht = {0};

            if ((lpnmh->code  == NM_CLICK) && (lpnmh->idFrom == IDC_TREE_MC)) // For Treeview Check Box Check Event
            {
                DWORD dwpos = GetMessagePos();

                ht.pt.x = GET_X_LPARAM(dwpos);
                ht.pt.y = GET_Y_LPARAM(dwpos);
                MapWindowPoints(HWND_DESKTOP, lpnmh->hwndFrom, &ht.pt, 1);

                TreeView_HitTest(lpnmh->hwndFrom, &ht);

                if(TVHT_ONITEMSTATEICON & ht.flags)
                    PostMessage(hDlg, UM_CHECKSTATECHANGE, (WPARAM)lpnmh->hwndFrom, (LPARAM)ht.hItem);
                else
                    TreeView_SelectItem(lpnmh->hwndFrom, NULL);
            }
            else if ((lpnmh->code  == TVN_SELCHANGED ) && (lpnmh->idFrom == IDC_TREE_MC))
                TreeView_SelectNode(lpnmh->hwndFrom, NULL);
        }
        break;
    }
于 2014-01-03T22:08:03.980 に答える
0

int CALLBACK WinMain(HINSTANCE hInstance、HINSTANCE hPrevInstance、LPSTR lpCmdLine、int nCmdShow){hWndDialog = CreateDialog(hInstance、MAKEINTRESOURCE(IDD_MAIN)、NULL、WndProc);

if (hWndDialog != NULL)
{
    ShowWindow(hWndDialog, SW_SHOW);
}

while(GetMessage(&Msg, NULL, 0, 0))
{
    if(!IsDialogMessage(hWndDialog, &Msg))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
}
return 0;

}

INT_PTR CALLBACK WndProc(HWND hDlg、UINTメッセージ、WPARAM wParam、LPARAM lParam){UNREFERENCED_PARAMETER(lParam); スイッチ(メッセージ){ケースWM_INITDIALOG:return(INT_PTR)TRUE;

case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDC_BTN_REFRESH:
        RefreshButtonHandler();             
        break;
    case IDC_BTN_ADD_INSTALL:
        AddInstallBtnHandler();
        break;
    case IDOK:
    case IDCANCEL:
        DestroyWindow(hDlg);
        PostQuitMessage(0);
        return (INT_PTR)TRUE;
        break;  
    }
case WM_NOTIFY:     
    {
        if(wParam == IDC_TREE_MC)
        {
            LPNMHDR lpnmh = (LPNMHDR) lParam;
            TVHITTESTINFO ht = {0};

            if ((lpnmh->code  == NM_CLICK) && (lpnmh->idFrom == IDC_TREE_MC)) // For Treeview Check Box Check Event
            {
                DWORD dwpos = GetMessagePos();

                ht.pt.x = GET_X_LPARAM(dwpos);
                ht.pt.y = GET_Y_LPARAM(dwpos);
                MapWindowPoints(HWND_DESKTOP, lpnmh->hwndFrom, &ht.pt, 1);

                TreeView_HitTest(lpnmh->hwndFrom, &ht);

                if(TVHT_ONITEMSTATEICON & ht.flags)
                    PostMessage(hDlg, UM_CHECKSTATECHANGE, (WPARAM)lpnmh->hwndFrom, (LPARAM)ht.hItem);
                else
                    TreeView_SelectItem(lpnmh->hwndFrom, NULL);
            }
            else if ((lpnmh->code  == TVN_SELCHANGING ) && (lpnmh->idFrom == IDC_TREE_MC))
                return (INT_PTR)TRUE;
        }
        break;
    }
case UM_CHECKSTATECHANGE:
    {
        //Handle TreeView Check State Event
    }
    break;
}
return (INT_PTR)FALSE;

}

フォーマットが悪いのでごめんなさい...私は睡眠不足です:-)

于 2013-01-10T10:30:13.710 に答える
0

ツリービュー用に提供されている選択機能を削除する

これを明確にしていただけませんか?

ユーザーが選択を変更できないようにしますか?

本当にやりたい場合は、親ウィンドウにWM_NOTIFYケースハンドラーを挿入し、NMTREEVIEWコードメンバーを確認します(lParamはNMTREEVIEWへのポインターです)。

コードがTVN_SELCHANGINGの場合、選択の変更を防ぎたい場合は1を返します。0を返すと、選択の変更が遅くなります。

于 2013-01-09T01:11:35.740 に答える