Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Làm thế nào để Load icon của một file bất kì trong Window và ánh xạ file mình chọn được với chương trình khởi chạy?

  1. #1
    Ngày gia nhập
    11 2011
    Bài viết
    8

    Mặc định Làm thế nào để Load icon của một file bất kì trong Window và ánh xạ file mình chọn được với chương trình khởi chạy?

    Mình đang cần load icon của một file khi mà truyền đường dẫn tới file đó (nếu là folder thì hiện icon folder như Window, .doc thì là icon MS Word) sau đó là việc ánh xạ để khởi chạy ứng dụng đó. VD: file .doc thì sẽ chạy MS Word với input là file đó,...!

    Mình code trên Win32 App (lập trình window C++), mong các bạn giúp đỡ.
    P/s: Sau khi load được icon thì làm sao add nó vào 1 item trong List ỏ Tree View!
    Cảm ơn các bạn và quangnh89!

  2. #2
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Có nhiều cách để lấy icon của 1 file
    Cách 1: Cách dễ nhất là dùng hàm SHGetFileInfo với đường dẫn file để lấy Hicon của nó, rồi từ HIcon có thể display ảnh của nó trong Listview hoặc treeview

    Cách 2 : AssocQueryString để lấy về chương trình được association với file type trong registry, và sau đó dùng SHGetFileInfo để lấy về Icon tương ứng và đưa vào list

    Cách 3: http://www.codeproject.com/Articles/...Associated-Ico

    Về cơ bản thì các cách trên đều dựa vào registry để tìm chương trình đã association với file, trả về icon của chương trình đó.

    Để đơn giản nhất có thể, ta sẽ dùng hàm SHGetFileInfo với đường dẫn file.
    Thứ tự làm như sau:
    - Tạo 1 file tạm với phần mở rộng có sẵn
    - Lấy icon của file tạm
    - Xóa file tạm
    Visual C++ Code:
    1. void CFileTypesAndIconsDlg::OnBnClickedAdd()
    2. {
    3.     int     index;
    4.     CString strFullName;
    5.     DWORD   dwRetVal = 0;
    6.     UINT    uRetVal   = 0;
    7.     HANDLE  hTempFile = INVALID_HANDLE_VALUE;
    8.     TCHAR   szTempFileName[MAX_PATH];  
    9.     TCHAR   lpTempPathBuffer[MAX_PATH];
    10.  
    11.     SHFILEINFO  shFileInfo = {0};
    12.     DWORD_PTR   dwRet;
    13.  
    14.  
    15.     UpdateData(TRUE);
    16.  
    17.     if (m_strName.IsEmpty())
    18.         return;
    19.  
    20.     index = m_strName.ReverseFind(TEXT('.'));
    21.     if (index == m_strName.GetLength() - 1)
    22.         return;
    23.  
    24.  
    25.     //  Gets the temp path env string (no guarantee it's a valid path).
    26.     dwRetVal = GetTempPath(MAX_PATH,          // length of the buffer
    27.         lpTempPathBuffer); // buffer for path
    28.  
    29.     if (dwRetVal > MAX_PATH || (dwRetVal == 0))
    30.     {
    31.         return;
    32.     }
    33.  
    34.     //  Generates a temporary file name.
    35.     uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files
    36.         TEXT("TYPE"),     // temp file name prefix
    37.         0,                // create unique name
    38.         szTempFileName);  // buffer for name
    39.     if (uRetVal == 0)
    40.     {
    41.         return;
    42.     }
    43.  
    44.     strFullName.Format(TEXT("%s.%s"), szTempFileName , m_strName);
    45.  
    46.     //  Creates the new file to write to for the upper-case version.
    47.     hTempFile = CreateFile( strFullName, // file name
    48.         GENERIC_WRITE,        // open for write
    49.         0,                    // do not share
    50.         NULL,                 // default security
    51.         CREATE_ALWAYS,        // overwrite existing
    52.         FILE_ATTRIBUTE_NORMAL,// normal file
    53.         NULL);                // no template
    54.  
    55.     if (hTempFile == INVALID_HANDLE_VALUE)
    56.     {
    57.         return;
    58.     }
    59.     CloseHandle(hTempFile );
    60.     dwRet = SHGetFileInfo(strFullName,  // file name
    61.         NULL,
    62.         &shFileInfo,
    63.         sizeof(SHFILEINFO),
    64.         SHGFI_SYSICONINDEX | SHGFI_SMALLICON); // info type
    65.     if (dwRet)
    66.     {
    67.         if (m_hImageList == NULL)
    68.         {
    69.             m_hImageList = (HIMAGELIST)dwRet;
    70.             ListView_SetImageList(m_ctrFileType.GetSafeHwnd(), m_hImageList, LVSIL_SMALL);
    71.         }
    72.  
    73.         m_ctrFileType.InsertItem( m_ctrFileType.GetItemCount(),
    74.             m_strName.Mid(index), shFileInfo.iIcon );
    75.     }
    76.     DeleteFile(strFullName); // file name
    77. }
    Attached Thumbnails Attached Thumbnails types.png  
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi quangnh89 : 10-04-2013 lúc 08:03 AM.

  3. #3
    Ngày gia nhập
    11 2011
    Bài viết
    8

    Cảm ơn bạn rất nhiều! Thế còn ở việc ánh xạ file đó đến chương trình thực thi của nó thì làm sao thế?
    VD file .pdf thì chương trình Foxit (Adobe) sẽ được chạy, file ảnh thì Paint sẽ được chạy , v.v...

    Mình có lấy icon thử nhưng một số icon nền đen vấn đề là sao thế, liệu có cách nào bỏ đi nền đen đó k?

  4. #4
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    bạn có thể tìm hiểu hàm ShellExecute hoặc explorer.exe
    http://support.microsoft.com/kb/152457

Các đề tài tương tự

  1. Trả lời: 4
    Bài viết cuối: 04-09-2013, 06:39 AM
  2. Làm sao để tạo icon cho file exe của mình trong resoure icon?
    Gửi bởi luongtankhang123 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 25-01-2012, 07:54 PM
  3. Load dữ liệu từ file .dict vào file .xml như thế nào?
    Gửi bởi hoathuongphuoc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 21-09-2011, 05:26 PM
  4. chạy file *.msstyles trên window xp sp3
    Gửi bởi zstar trong diễn đàn Thắc mắc chung
    Trả lời: 4
    Bài viết cuối: 05-09-2010, 01:08 PM
  5. Bài tập C Window tự động ngừng chạy file .exe, sau khi compile chương trình
    Gửi bởi svcntt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 24-07-2010, 09:32 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn