Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Đang ở
    24 Rạch Bùng Binh , P10,Q3 , HCM
    Bài viết
    0

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Có hai cách để xài tab control.
    1.Thứ nhất là xài Property Sheet.
    - Hình thức này rất phổ biến trong windows, như System Property, Display Property....
    - Dạng tab bao gồm 1 tab control chiếm gần hết window, và 4 nút là OK,Apply,Cancel,Help(có hoặc ko).
    2. Tự tạo, bài cách xài Tab Control, và khá cầu kì.

    Về cách 1: (Chi tiết thì nên tham khảo msdn, Property Sheet)
    + Đầu tiên là phải xác định cần bao nhiêu tab, để tạo ra số lượng các Dialog tương ứng cho mỗi tab trong resource.
    + Định nghĩa PROPSHEETPAGE.
    + Định nghĩa PROPSHEETHEADER.
    + Gọi hàm PropertySheet.

    Ví dụ:
    PROPSHEETPAGE psp[2];
    psp[0].dwSize = sizeof(PROPSHEETPAGE);
    psp[0].dwFlags = PSP_USETITLE;
    psp[0].hInstance = hInstance;
    psp[0].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG1);
    psp[0].pszIcon = NULL;
    psp[0].pfnDlgProc = Dia1_Prog;
    psp[0].pszTitle = MAKEINTRESOURCE(IDS_STRING1);
    psp[0].lParam = 0;
    psp[0].pfnCallback = NULL;

    psp[1].dwSize = sizeof(PROPSHEETPAGE);
    psp[1].dwFlags = PSP_USETITLE;
    psp[1].hInstance = hInstance;
    psp[1].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG2);
    psp[1].pszIcon = NULL;
    psp[1].pfnDlgProc = Dia2_Prog;
    psp[1].pszTitle = MAKEINTRESOURCE(IDS_STRING2);
    psp[1].lParam = 0;
    psp[1].pfnCallback = NULL;

    PROPSHEETHEADER psh;
    psh.dwSize = sizeof(PROPSHEETHEADER);
    psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE;
    psh.hwndParent = NULL;
    psh.hInstance = hInstance;
    psh.hIcon = (HICON)MAKEINTRESOURCE(IDI_ICON2);
    psh.pszCaption = (LPTSTR)"congdongcviet.com";
    psh.nPages = sizeof(psp)/sizeof(PROPSHEETPAGE);
    psh.nStartPage = 0;
    psh.ppsp =(LPPROPSHEETPAGE) psp;
    psh.pfnCallback =NULL;

    PropertySheet(&psh);

    Hai dialog IDD_DIALOG1,IDD_DIALOG2 đã dc tạo trong resource.
    Cần tạo thêm 2 DlgProg Để xử lý sự kiện.

    Để xài bạn phải include Prsht.h, và thêm thư viện commctrl.lib
    2. Xài Tab Control
    Khi tạo ra tab control trong resource.
    Đầu tiên bạn phải add vài tab cho cho tab control thông wa macro TabCtrl_InsertItem(index,TCITEM);
    Mã:
    typedef struct tagTCITEM {  
        UINT mask;
    #if (_WIN32_IE >= 0x0300)
        DWORD dwState;
        DWORD dwStateMask;
    #else
        UINT lpReserved1;
        UINT lpReserved2;
    #endif
        LPTSTR pszText;
        int cchTextMax;
        int iImage;
        LPARAM lParam;
    } TCITEM, *LPTCITEM;
    Sau đó là dựa vào sự kiện mà tab control gởi đến cửa sổ để xử lí việc show các dialog trong tab.
    Khi người sữ dụng click vào tab, nó sẽ gởi đến cửa số cha thông điệp TCN_SELCHANGE thông wa WM_NOTIFY
    lParam này hold 1 con trỏ, trỏ đến NMHDR
    typedef struct tagNMHDR {
    HWND hwndFrom;
    UINT_PTR idFrom;
    UINT code;
    } NMHDR;

    code chứa mã của thông điệp gồm có TCN_SELCHANGE.
    Ta có thể lấy dc index của tab thông wa macro TabCtrl_GetCurSel
    Có dc index, bạn xác định dialog nào sẽ dc nhét vào tab Control. Và tiến hành show nó ra.

    Bạn nên tham khảo chi tiết tại đây để hiểu rỏ hơn
    http://msdn2.microsoft.com/en-us/lib...05(VS.85).aspx
    Và đây http://msdn2.microsoft.com/en-us/lib...04(VS.85).aspx

    Cách 2 có vẻ khá rườm rà. Tôi nghĩ bạn nên chọn cách 1 để làm. Thông thường tab control dc xài khi cấu hình hệ thống, bạn sẽ bắt gặp nó rât rất thường xuyên trong các Option, Reference của các phần mềm windows.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cám ơn bác đã trả lời.
    Nhưng em vẫn chưa hiểu :

    "Về cách 1: (Chi tiết thì nên tham khảo msdn, Property Sheet)
    + Đầu tiên là phải xác định cần bao nhiêu tab, để tạo ra số lượng các Dialog tương ứng cho mỗi tab trong resource.
    + Định nghĩa PROPSHEETPAGE.
    + Định nghĩa PROPSHEETHEADER.
    + Gọi hàm PropertySheet."
    thì định nghĩa ở đâu trong chương trình chính hay phải add thêm 1 lớp nữa.

    "Đầu tiên bạn phải add vài tab cho cho tab control thông wa macro TabCtrl_InsertItem(index,TCITEM);"

    khi add thêm tab control có thể sử dụng nút bấm tab control được ko?

    Bác có thể làm một ví dụ đơn giản về tab control rồi úp mã nguồn lên giúp e được ko zậy. Thanks bác rất nhiều

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn có thể tham khảo code này :http://www.sendspace.com/file/tdyyik

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi dinhthanhtung
    Cám ơn bác đã trả lời.
    Nhưng em vẫn chưa hiểu :

    "Về cách 1: (Chi tiết thì nên tham khảo msdn, Property Sheet)
    + Đầu tiên là phải xác định cần bao nhiêu tab, để tạo ra số lượng các Dialog tương ứng cho mỗi tab trong resource.
    + Định nghĩa PROPSHEETPAGE.
    + Định nghĩa PROPSHEETHEADER.
    + Gọi hàm PropertySheet."
    thì định nghĩa ở đâu trong chương trình chính hay phải add thêm 1 lớp nữa.

    "Đầu tiên bạn phải add vài tab cho cho tab control thông wa macro TabCtrl_InsertItem(index,TCITEM);"

    khi add thêm tab control có thể sử dụng nút bấm tab control được ko?

    Bác có thể làm một ví dụ đơn giản về tab control rồi úp mã nguồn lên giúp e được ko zậy. Thanks bác rất nhiều
    Về cái property sheet, bạn muốn đặt nó ở đâu, sao hỏa cũng dc. miễn sao bạn hiểu là cần cung cấp các thông số gì cho nó.

    Thực ra cái macro TablCtrl_InsertItem nó gởi 1 thông msg TCM_INSERTITEM, trong đó, wParam hold index, và lParam hold cai LPTCITEM.

    Tôi nghĩ bạn nên làm việc với các control đơn giả, và dần hiểu về windows hơn. Rồi làm việc với tab, bởi nó chẳng wa chỉ là vài cái nút, và ko có hổ trở gì thêm trong việc nhét 1 cái dialog vào trong đó.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Có nhiều cách dùng đối tượng TabControl, trong đó cách dễ dàng nhất là dùng nó thông qua 2 đối tượng MFC là CPropertySheet và CPropertyPage. CPropertySheet là đối tượng chứa nhiều trang thuộc tính (form), mỗi trang thuộc tính là đối tượng CPropertyPage. Sau đây là qui trình điển hình để tạo 1 form chứa 1 sheet gồm 3 trang thuộc tính như sau:

    1. Chạy VC++, tạo project mới để quản lý ứng dụng theo dạng "Dialog Based". Form giao diện chính của ứng dụng được để trống (bạn nên xóa 2 button và 1 label do VC++ tạo sẵn).
    2. Thiết kế trực quan trang thuộc tính đầu tiên cần dùng. Để tạo 1 trang thuộc tính mới, bạn chọn menu Insert.Resource.Dialog.New. Sau khi 1 dialog mới được tạo ra, bạn hãy thiết kế trực quan các phần tử giao diện mong muốn trong dialog đó y như thiết kế dialog chính của chương trình. Lưu ý rằng kích thước của các trang thuộc tính được dùng chung trong 1 TabControl nên giống nhau. Để tạo ra class miêu tả dialog vừa thiết kế, bạn hãy nhấn kép chuột trên dialog tương ứng, cửa sổ "Add a class" sẽ xuất hiện, bạn hãy đặt tên cho class miêu tả dialog này (thí dụ như CPage1), lưu ý duyệt danh sách các "base class" và chọn CPropetyPage làm "base class" cho class cần tạo ra. Ngoài ra lưu ý rằng nội dung thuộc tính "Caption" của dialog sẽ trở thành tên "tab" tương ứng trong TabControl chứa dialog này.
    3. Lặp lại bước 2 cho các trang thuộc tính cần dùng còn lại (thí dụ tên là CPage2, CPage3).
    4. Tạo class PropertySheet chứa các trang thuộc tính. Vào menu View.ClassWizard, chọn button "Add class.New" để mở cửa sổ tạo class mới, đặt tên cho class (thí dụ như CProgSheet), duyệt danh sách các "base class" và chọn CPropetySheet làm "base class" cho class cần tạo ra.
    5. Mở file đặc tả class của form chương trình (thí dụ tên là TestTabCtrlDlg.h), thêm các thuộc tính sau để quản lý các đối tượng trang thuộc tính và đối tượng sheet:
    CPage1* m_page1;
    CPage2* m_page2;
    CPage3* m_page3;
    CProgSheet* m_pPropSheet;
    6. Mở file hiện thực class miêu tả form chương trình (thí dụ tên là TestTabCtrlDlg.cpp), duyệt tìm hàm OnInitDialog() và thêm đoạn code sau vào vị trí được VC++ đề nghị (sau hàng chú thích "// TODO: Add extra initialization here") :
    BOOL CTestTabCtrlDlg::OnInitDialog() {
    //đoạn code đã được tạo sẵn bởi VC++
    ...
    // TODO: Add extra initialization here
    // tạo các trang thuộc tính
    m_page1 = new CPage1;
    m_page2 = new CPage2;
    m_page3 = new CPage3;
    // tạo đối tượng PropertySheet
    m_pPropSheet = new Sheet(IDS_CAPSHEET, GetActiveWindow(), IDD_PROPPAGE1);
    // "add" từng trang thuộc tính vào sheet
    m_pPropSheet->AddPage(m_page1);
    m_pPropSheet->AddPage(m_page2);
    m_pPropSheet->AddPage(m_page3);
    // thiết lập chế độ "modeless" cho trang thuộc tính
    if (!m_pPropSheet->Create(this,
    DS_CONTEXTHELP | DS_SETFONT | WS_CHILD | WS_VISIBLE)) {
    DestroyWindow();
    return FALSE;
    }
    //thiết lập vị trí và kích thước cho sheet
    m_pPropSheet->SetWindowPos(NULL, 0, 0, 0, 0,
    SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
    //thiết lập style hiển thị cho sheet
    m_pPropSheet->ModifyStyle(WS_BORDER|WS_CAPTION,
    &n
    bsp; (WS_BORDER|WS_CAPTION));
    //hiệu chỉnh kích thước của Form theo kích thước của Sheet
    CRect rectSize;
    m_pPropSheet->GetWindowRect(rectSize);
    MoveWindow (0,0,rectSize.Width()+10,rectSize.Height()+30,TRUE );
    return TRUE; // return TRUE unless you set the focus to a control
    }
    7. Dịch và thử chạy ứng dụng để kiểm tra kết quả.

    Source: goctinhoc.com

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cảm ơn bạn "void main ()" nhé.
    Ví dụ của bạn rất rõ ràng nhưng bạn có thể giải thích thêm cho mình việc tạo tabby.cpp được không? Nó sử dụng để thêm các tab vào tabcontrol nhưng mình phải khai báo việc sử dụng tabbly.cpp trong TabDialog.cpp như thế nào zậy?

    Bác cuxu nói :
    "Tôi nghĩ bạn nên làm việc với các control đơn giả, và dần hiểu về windows hơn. Rồi làm việc với tab, bởi nó chẳng wa chỉ là vài cái nút, và ko có hổ trở gì thêm trong việc nhét 1 cái dialog vào trong đó."
    theo em thì tabcontrol cũng là một control cơ bản cần phải nắm được và nó hoàn toàn có thể chèn các dialog vào(như ví dụ của bạn "void main()") chứ ko chỉ là vài cái nút.Thanks bác đã góp ý.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •