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 2 của 2
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Sử dụng CFileDialog Trong MFC

    Khởi tạo và sử dụng CFileDialog
    Lớp CFileDialog gói gọn hộp thoại tập tin thông dụng của Windows. Những hộp thoại thông dụng cung cấp một cách thức dễ dàng để thực thi những hộp thoại như File Open và File Save As (cũng như các hộp thoại lựa chọn tập tin khác) với kiểu tùy thuộc vào các chuẩn hệ điều hành Windows.

    CFileDialogOpen

    Bạn có thể sử dụng CFileDialog với phương thức khởi tạo được cung cấp, hay bạn có thể thừa kế cho lớp hộp thoại của bạn từ CFileDialog và tạo phương thức khởi tạo phù hợp với các nhu cầu của bạn. Trong trường hợp này hay trường hợp kia, thì những hộp thoại này sẽ cư xử giống như những hộp thoại chuẩn MFC vì nó đều thừa kế từ lớp CCommonDialog.
    Để sử dụng đối tượng CFileDialog, đầu tiên ta tạo ra đối tượng dùng hàm khởi tạo CFileDialog. Sau khi hộp thoại được khởi tạo, bạn có thể thiết lập hay chỉnh sửa bất cứ giá trị nào trong biến cấu trúc m_ofn để khởi tạo các giá trị hay các tình trạng của những control trong hộp thoại. Cấu trúc của biến m_ofn là kiểu OPENFILENAME.

    Sau khi khởi tạo những điều khiển trong hộp thoại, ta gọi phương thức thành viên DoModal() để hiện hộp thoại lên và cho phép người dùng nhập vào đường dẫn và tên tập tin. Giá trị trả về của phương thức DoModal() là IDOK nếu người dùng nhấn nút OK hay IDCANCEL nếu người dùng nhấn nút Cancel.
    Nếu phương thức DoModal() trả về IDOK, bạn có thể dùng một trong các phương thức của lớp CFileDialog để nhận các thông tin mà người dùng chọn.
    CFileDialog bao gồm một vài phương thức thành viên thuộc dạng protected, cho phép tùy chỉnh handling (việc điểu khiển) các vi phạm, vi phạm tên tập tin, và thông báo thay đổi listbox. Những phương thức thành viên dạng protected này là các hàm callback (hàm được tự gọi bởi hệ điều hành) mà đa số các ứng dụng không cần dùng, kể từ khi việc điều khiển mặc định được tự động thực hiện. Những dòng ánh xạ thông điệp cho các hàm này là không cần thiết bởi vì chúng là các hàm ảo chuẩn.
    Bạn có thể dùng hàm CommDlgExtendedError của Windows để xác định xem có lỗi nào xảy ra trong suốt quá trình khởi tạo hộp thoại và hiểu biết thêm về lỗi đó.
    Phương thức hủy của những đối tượng thuộc lớp CFileDialog được điều khiển một cách tự động. Nó không nhất thiết phải gọi CDialog::EndDialog
    Để cho phép người sử dụng chọn nhiều tập tin, thiết lập giá trị cờ là OFN_ALLOWMULTISELECT trước khi gọi phương thức DoModal(). Bạn cần cung cấp một vùng đệm dành chứa tên các tập tin trong danh sách tên tập tin được trả về. Làm điều này bằng cách thay thế con trỏ m_ofn.lpstrFile bởi một con trỏ tới một vùng đệm đã được định sẵn, sau khi khởi tạo CFileDialog, nhưng trước khi gọi DoModal(). Thêm vào đó, bạn phải thiết lập m_ofn.nMaxFile với số lượng tập tin có thể lưu trữ được trong vùng đệm do con trỏ m_ofn.lpstrFile trỏ tới. Lớp CFileDialog nằm trong tập tin COMMDLG.DLL được tích hợp với Windows 3.1 và các phiên bản về sau, Windows CE.
    Nếu bạn thừa kế một lớp mới từ CFileDialog, bạn có thể dùng sơ đồ ánh xạ thông điệp để quản lý bất kỳ một thông điệp nào. Để mở rộng việc quản lý thông điệp mặc định, thừa kế một lớp từ CWnd, thêm một sơ đồ ánh xạ thông điệp cho lớp mới, và cung cấp các phương thức cho những thông điệp mới. Bạn không cần phải cung cấp hàm hook để tùy chỉnh hộp thoại.
    Để tùy chỉnh hộp thoại, thừa kế một lớp từ CFileDialog, cung cấp một mẫu (template) hộp thoại, và thêm vào một sơ đồ ánh xạ thông điệp để xử lý các thông điệp thông báo từ các control mở rộng. Bất kỳ những thông điệp không được xử lý nên được chuyển cho lớp cơ sở.
    Tùy chỉnh hàm hook không được khuyến khích. Tập tin tiêu đề là: #include<afxdlgs.h>
    Trong Windows CE, các hộp thoại tập tin không thể thiết lập hay kiểm tra tình trạng chỉ đọc của tập tin, một người dùng không thể chọn nhiều tập tin cùng một lúc và chiều dài tối đa cho tên một tập tin mà người dùng có thể nhập vào ô textbox là 255 ký tự. Hiện tại Windows CE không hỗ trợ việc kéo thả trong các hộp thoại Open và Save As.
    VD:
    Mã nguồn PHP:
    CFileDialog f (TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"All files (*.*)|*.*|CPP Files (*.cpp)|*.cpp|Library Files (*.h)|*.h");f.DoModal();  
    1. Hàm khởi tạo CFileDialog::CFileDialog: gọi hàm này để khởi tạo một đối tượng hộp thoại tập tin Windows chuẩn. Cả hộp thoại File Open hay File Save As đều được khởi tạo phụ thuộc vào giá trị của bOpenFileDialog
    CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );


    Trong đó:

    bOpenFileDialog


    Thiết lập là TRUE nếu muốn kơởi tạo hộp thoại File Open hay FALSE nếu muốn khởi tạo hộp thoại File Save As.
    lpszDefExt

    Đuôi mở rộng mặc định của tên tập tin. Nếu người dùng không nhập kèm đuôi mở rộng trong ô edit box của File name, phần mở rộng được chỉ định bởi lpszDefExt sẽ được tự động thêm vào tên của tập tin. Nếu giá trị này là NULL, sẽ không có phần mở rộng được thêm vào.
    lpszFileName


    Tên tập tin khởi tạo sẽ được xuất hiện trong ô edit box của File name. Nếu giá trị này là NULL, sẽ không có tên tập tin nào xuất hiện.
    dwFlags

    Một phép kết hợp của một hay nhiều biến cờ cho phép bạn tùy chỉnh hộp thoại. Nếu bạn chỉnh sửa biến thành viên cấu trúc m_ofn.Flags, dùng một toán tử OR trong những thay đổi của bạn để giữ những thiết lập mặc định không bị ảnh hưởng.
    lpszFilter


    Một dãy các cặp chuỗi chỉ định những bộ lọc bạn có thể áp dụng cho tập tin. Nếu bạn chỉ định bộ lọc tập tin, chỉ những tập tin có trong bộ lọc mới xuất hiện trong list box.
    pParentWnd


    Một con trỏ trỏ tới đối tượng hộp thoại tập tin là cha hay cửa sổ chủ.

    Để cho phép người dùng thay đổi kích thước một hộp thoại kiểu Explorer dùng cà chuột hay bàn phím, thiết lập cờ OFN_ENABLESIZING. Việc thiết lập biến cờ này là cần thiết chỉ khi bạn cung cấp một thủ tục Hook hay một template tùy chỉnh. Biến cờ hoạt động chỉ với một hộp thoại kiểu Explorer, những hộp thoại kiểu cũ khác không được phép thay đổi kích thước.

    Tham số lpszFilter được dùng để quyết định loại tên tập tin phải được thể hiện trong ô list box. Chuỗi đầu tiên trong cặp chuỗi mô tả tên bộ lọc; chuỗi thứ hai chỉ ra đuôi mở rộng được dùng. Nhiều đuôi mở rộng có thể được chỉ ra bằng cách dùng ';' như là dấu tách. Chuỗi kết thúc với hai ký tự '|', tham số này được cho phép NULL. Bạn có thể dùng một đối tượng CString cho tham số này.

    Sau đây là các phương thức thông dụng của lớp CFileDialog. Mọi người cùng tham khảo nhé!

    1.CFileDialog:[IMG]images/smilies/biggrin.png[/IMG]oModal


    virtual int DoModal();


    - Hàm trả về IDOK hay IDCANCEL. Nếu hàm trả về giá trị IDCANCEL, thì gọi hàm Windows sau CommDlgExtendedError để xác định xem có lỗi nào xảy ra hay không.

    - IDOK và IDCANCEL là các hằng chỉ ra là người dùng chọn nút OK hay nút Cancel.

    - Khi người dùng click nút OK hay Cancel, hay chọn chức năng Close từ đều khiển menu của hộp thoại, quyền điều khiển được trao lại cho ứng dụng của bạn. Sau đó, bạn có thể gọi các hàm thành viên khác để nhận về các thiết lập hay các thông tin mà người dùng nhập vào hộp thoại.

    DoModal là một hàm ảo kế thừa từ lớp CDialog.
    2. CFileDialog::GetPathName


    CString GetPathName() const;

    - Hàm này trả về đường dẫn đầy đủ của tập tin.

    - Gọi hàm này để nhận về đường dẫn đầy đủ của tập tin được nhập vào trong hộp thoại. Đường dẫn của tên tập tin này bao gồm tiêu đề của tập tin và đường dẫn của thư mục. Ví dụ: GetPathName sẽ trả về "C:\FILES\TEXT.DAT" cho tập tin C:\FILES\TEXT.DAT.

    - Nếu m_ofn.Flags có giá trị cờ là OFN_ALLOWMULTISELECT, chuỗi này sẽ chứa một dãy các chuỗi được kết thúc bằng ký tự NULL, với chuỗi đầu tiên sẽ là đường dẫn tới thư mục của nhóm tập tin được chọn, theo sau là tên của tất cả các tập tin được chọn bởi người dùng. Để nhận tên tập tin tiếp theo trong danh sách bạn có thể dùng phương thức thành viên GetStartPosition và GetNextPathName
    3. CFileDialog::GetFileName


    CString GetFileName() const;

    - Hàm trả về tên của tập tin.

    - Gọi hàm này để nhận về tên của tập tin được nhập trong hộp thoại. Tên của tập tin bao gồm cả tiền tố và phần mở rộng. Ví dụ: GetFileName sẽ trả về "TEXT.DAT" cho tập tin C:\FILES\TEXT.DAT.

    - Nếu thuộc tính m_ofn.Flags có chứa giá trị OFN_ALLOWMULTISELECT, bạn sẽ phải gọi GetStartPosition và GetNextPathName để nhận về tên của tập tin.
    4. CFileDialog::GetFileExt


    CString GetFileExt() const;

    - Hàm trả về phần mở rộng của tên tập tin.

    - Gọi hàm này để nhận về phần mở rộng của tên tập tin được nhập vào trong hộp thoại. Ví dụ: nếu tên của tập tin được nhập vào trong hộp thoại là DATA.TXT, GetFileExt trả về "TXT".
    5. CFileDialog::GetFileTitle


    CString GetFileTitle() const;

    - Hàm trả về tên của tập tin không bao gồm phần mở rộng.

    - Gọi hàm này để nhận về title của tập tin được nhập vào trong hộp thoại. Title chỉ bao gồm tiền tố của nó, không có chi tiết đường dẫn hay phần mở rộng. Ví dụ: GetFileTitle sẽ trả về TEXT cho tập tin C:\FILES\TEXT.DAT

    6. CFileDialog::GetNextPathName



    CString GetNextPathName(POSITION &pos) const;

    - Tham số: pos: Một tham chiếu tới một biến cấu trúc POSITION chứa giá trị sẽ được trả về bởi phương thức GetNextPathName hay GetStartPosition. Hàm trả về NULL nếu đã duyệt đến cuối danh sách.

    - Hàm trả về đường dẫn đầy đủ của tập tin.

    - Gọi hàm này để nhận về tên tập tin kế tiếp từ nhóm các tập tin đã được chọn trong hộp thoại. Đường dẫn của tên tập tin bao gồm title của tập tin và đường dẫn đầy đủ của thư mục. Ví dụ: GetNextPathName sẽ trả về "C:\FILES\TEXT.DAT" cho tập tin C:\FILES\TEXT.DAT. Bạn có thể dùng GetNextPathName trong một vòng lặp về trước nếu bạn thiết lập vị trí khởi tạo với lời gọi hàm GetStartPosition.

    - Nếu sự lựa chọn chỉ có một file thì tên của tập tin đó sẽ được trả về.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    vâng - thanks bác- mình mới học.
    thấy rất hay - vì chưa viết bài nào nên - ko nhấn thanks đc [IMG]images/smilies/biggrin.png[/IMG]
    bác viết thêm nhiều nữa đi ạ [IMG]images/smilies/smile.png[/IMG]

 

 

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
  •