• Thứ Ba, 19/06/2007 09:32 (GMT+7)

    Dùng VC++ tạo Treeview có checkbox trên mỗi node

    Câu hỏi :
    Xin hướng dẫn dùng VC++ tạo Treeview có checkbox trên mỗi node.


    Trả lời :

    TreeView là đối tượng giao diện cho phép hiển thị và xử lý thông tin dạng phân cấp. TreeView chứa các phần tử theo mối quan hệ phân cấp, mỗi phần tử có thể là nút lá hay nút nhánh. Nút nhánh là nút chứa từ 1 đến n nút con, còn nút lá là nút không chứa phần tử con nào. Lúc mới được tạo ra, TreeView chưa chứa phần tử nào cả. Muốn thêm 1 phần tử mới vào vị trí thích hợp trong TreeView, ta dùng tác vụ InsertItem(). Có nhiều biến thể của InsertItem(), nhưng thường dùng nhất là dạng:

    HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct);

    trong đó tham số lpInsertStruct là 1 record gồm nhiều field miêu tả các thông số của nút cần thêm vào TreeView. Ý tưởng chung để thêm 1 nút vào TreeView là thiết lập giá trị thích hợp cho 1 số field của record lpInsertStruct rồi gọi tác vụ InsertItem() để thêm nút được đặc tả bởi record lpInsertStruct vào TreeView. Cụ thể, đoạn code VC++ sau sẽ thiết lập nội dung của 1 TreeView gồm 1 nút gốc tên là "Nút gốc 1", nó chứa 2 nút con là "Nút nhánh 1" và "Nút nhánh 2", nút "Nút nhánh 1" chứa 2 nút con là "Nút lá 1" và "Nút lá 2".

     // giả sử tên biến nhận dạng TreeView là m_treeview
     //định nghĩa 1 số biến cần dùng

     TV_INSERTSTRUCT tvstruct;
     HTREEITEM hRoot, hNhanh;
     //thiết lập các thuộc tính của nút gốc
     tvstruct.hParent = NULL;
     tvstruct.hInsertAfter = TVI_LAST;
     tvstruct.item.pszText = _T("Nut goc 1");
     tvstruct.item.mask = TVIF_TEXT;
     //thêm nút gốc vào TreeView
     hRoot = m_treeview.InsertItem(&tvstruct);
     //thiết lập các thuộc tính của nút nhánh 1
     tvstruct.hParent = hRoot;
     tvstruct.item.pszText = _T("Nut nhanh 1");;
     //thêm nút nhánh 1 vào TreeView
     hNhanh = m_treeview.InsertItem(&tvstruct);
     //thiết lập các thuộc tính của nút nhánh 2
     tvstruct.item.pszText = _T("Nut nhanh 2");;
     //thêm nút nhánh 2 vào TreeView
     m_treeview.InsertItem(&tvstruct);
     //thiết lập các thuộc tính của nút lá 1
     tvstruct.hParent = hNhanh;
     tvstruct.item.pszText = _T("Nut la 1");;
     //thêm nút lá 1 vào TreeView
     m_treeview.InsertItem(&tvstruct);
     //thiết lập các thuộc tính của nút lá 2
     tvstruct.item.pszText = _T("Nut la 2");;
     //thêm nút lá 2 vào TreeView
     m_treeview.InsertItem(&tvstruct);
     ...

    Lưu ý khi hiển thị TreeView kết quả, mỗi nút nhánh (kể cả nút gốc) đều có 1 icon +/- cho phép người dùng mở rộng/thu nhỏ nội dung chi tiết của nút nhánh, mỗi nút đều có checkbox kèm theo. Đoạn code trên không liên quan đến các khả năng này. Thật vậy, để có được 2 khả năng vừa trình bày, cách dễ dàng nhất là bạn hãy thiết lập trực quan các thuộc tính tương ứng tại thời điểm thiết kế giao diện. Cụ thể khi vẽ đối tượng "Tree Control" trong form giao diện tại thời điểm thiết kế, bạn ấn phải chuột trên Tree Control và chọn mục Properties để hiển thị cửa sổ thuộc tính của đối tượng TreeView, chọn tab Styles và đánh dấu chọn vào các checkbox sau: "Has buttons", "Has Lines", "Lines at root". Chọn tab More Styles và đánh dấu chọn vào checkbox "Check boxes".

    Chuyên mục: Lập trình