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

    Cách lấy Icon của file dựa trên phần mở rộng của file ấy?

    Mình đang làm 1 FTP client , nhưng vướng vấn đề về hiển thị icon trong listview

    FTP server khi được yêu cầu bằng lệnh List sẽ trả về danh sách các file hiện có trong 1 thư mục nào đấy. dựa vào danh sách file này mình muốn lấy ra Icon của chương trình mở file đó trên máy tính hiện tại, giống như cửa sổ Local trong hình vẽ.
    Hiện tại giải pháp của mình đang là dùng hàm 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

    Nói dài dòng là thế, tóm tắt lại là: mình muốn cái icon bên Remote giống như bên Local cho đẹp [IMG]images/smilies/applause.gif[/IMG] Mọi người xem hình đi kèm sẽ hiểu.

    Với đa số các file là ổn nhưng với các file như EXE, BAT thì lại không thành công do tham số trả về là %1. hiện tại mình chưa biết làm thế nào, nhờ anh chị em giúp cho [IMG]images/smilies/biggrin.png[/IMG]

    Qua tìm hiểu thì các icon này đều nằm trong shell32.dll, nhưng chẳng nhẽ cứ so sánh xâu rồi tìm và hiển thị, thủ công quá.

    Bên local sử dụng đường dẫn file và hàm SHGetFileInfo nên không vấn đề gì


    Đây là bài tập lớn của mình, mình phải nộp trong 2 tuần nữa nên rất mong mọi người hồi âm sớm. Cám ơn mọi người.

    Mã:
      i = strList.ReverseFind(_T('.'));if (i!= -1){    cbSize = sizeof(szExePath);    hr = AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_EXECUTABLE, m_strLog, _T( "open" ), szExePath, &cbSize );//lấy file Exe để mở định dạng file     if( hr == S_OK)    {        if( SHGetFileInfo(szExePath, NULL, &shFileInfo, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON))  //lấy icon file exe kia            pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList, shFileInfo.iIcon); //thêm vào list với icon         else pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList);// thêm vào list và không icon    }    else     pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList);// thêm vào list và không icon}else pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList);// thêm vào list và không icon

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cậu dùng hàm SHGetFileInfo với đường dẫn file PE để lấy Hincon của nó, rồi từ HICOn có thể display dễ dàng zồi
    tớ cho cậu 1 ví dụ tớ đã viết hồi trước nè

    Mã:
    int CLView::GetFileIconIndex(const TCHAR *FileName)
    {
    	SHFILEINFO FI = {0};
    	SHGetFileInfo(FileName, FILE_ATTRIBUTE_NORMAL, &FI, sizeof(FI), SHGFI_SMALLICON | SHGFI_ICON );
    
        int i = 0;
        if (FI.hIcon)
            i = this->m_ImgList.Add(FI.hIcon);
    	DestroyIcon(FI.hIcon);
    
    	return i;
    }

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình thấy cách này khá ổn

    http://www.codeproject.com/KB/cs/Get...peAndIcon.aspx

  4. #4
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    Cám ơn 2 bạn đã trả lời, cách của bạn Alex và gianghoplus mình đã đọc rồi , cơ bản dùng cách của Alex là ổn
    hôm nay mình làm được rồi, đơn giản thôi:
    - dùng GetTempPath để lấy được đường dẫn thư mục tạm
    - Tạo 1 file tạm có phần mở rộng tương ứng
    - dùng SHGetFileInfo
    - Xóa file tạm

    Làm thế này tiện hơn, đơn giản thế này mà hôm qua mình ko nghĩ ra, lại đi lập thread [IMG]images/smilies/biggrin.png[/IMG]

    Cám ơn mọi người đã quan tâm[IMG]images/smilies/clap_grin.gif[/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
  •