我住包子山

this->blog.MoveTo("blog.baozishan.in")

获取给定路径的图标,演示SHGetFileInfo用法

建立的仍然是Win32 命令行的工程,所以入口点为main(),需要手动获取HINSTANCE结构。程序在WINXP+VS2005测试通过image
/********************************************************************
  created:  2008/05/02
  created:  2:5:2008   3:40
            main.cpp
  author:    Gohan
  purpose:  演示SHBrowseForFolder用法
            演示SHGetFileInfo获取路径图标   
            演示Picture Box在SDK里的使用方法
*********************************************************************/
#include <Windows.h>
#include <ShlObj.h>
#include "resource.h"
HICON g_icon;
RECT g_rect;
TCHAR g_path[MAX_PATH];
void OnInitDlg(HWND hwnd)
{
   
GetWindowRect(GetDlgItem(hwnd, IDC_ICON1), &g_rect);
   
MapWindowPoints(NULL, hwnd, (LPPOINT) &g_rect, 2);
   
DestroyWindow(GetDlgItem(hwnd, IDC_ICON1));
   
SetDlgItemText(hwnd,IDC_PATH,g_path);
}
void OnPaint(HWND hwnd)
{
   
PAINTSTRUCT ps;
   
HDC hdc = BeginPaint(hwnd, &ps);
   
DrawIcon(hdc,g_rect.left,g_rect.left,g_icon);
   
EndPaint(hwnd,&ps);
}
BOOL CALLBACK DlgProc (HWND hDlg, UINT message,
                           
WPARAM wParam, LPARAM lParam)
{
   
switch (message)
    {
   
case WM_INITDIALOG :
       
OnInitDlg(hDlg);
       
return TRUE ;
   
case WM_PAINT:
       
OnPaint(hDlg);
       
return TRUE;
   
case WM_COMMAND :
       
switch (LOWORD (wParam))
        {
       
case IDOK :
       
case IDCANCEL :
           
EndDialog (hDlg, 0) ;
           
return TRUE ;
        }
       
break ;
    }
   
return FALSE ;
}
int main()
{
   
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
   
BROWSEINFO bi;
   
ZeroMemory(&bi,sizeof(BROWSEINFO));
   
LPMALLOC pMalloc;
   
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
   
   
if(pidl != NULL)
    {
       
SHGetPathFromIDList(pidl,g_path);
       
SHFILEINFO sfi;
       
ZeroMemory(&sfi,sizeof(SHFILEINFO));
       
SHGetFileInfo(g_path,0,&sfi,sizeof(SHFILEINFO),SHGFI_ICON);
       
g_icon = sfi.hIcon;
       
DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, DlgProc) ;
       
//MessageBox(NULL,path,TEXT("Choose"),MB_OK);
        if(SUCCEEDED(SHGetMalloc(&pMalloc)))
        {
           
pMalloc->Free(pidl);
           
pMalloc->Release();
        }
    }
   
else
    {
       
MessageBox(NULL,TEXT("),TEXT("Choose"),MB_OK);
    }
}
/************************************************************************/
/* resource.h                                                           */
/************************************************************************/
#define IDD_DIALOG1                     101
#define IDC_PATH                        1001
#define IDC_ICON1                       1002
/************************************************************************/
/* demo.rc Microsoft Visual C++ generated resource script.              */
/************************************************************************/
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 126, 83
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP
FONT
8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,69,7,50,14
   
PUSHBUTTON      "取消",IDCANCEL,69,24,50,14
   
CONTROL         "",IDC_ICON1,"Static",SS_WHITEFRAME | SS_REALSIZEIMAGE,13,10,20,20,WS_EX_TRANSPARENT
    LTEXT           "静态",IDC_PATH,14,44,89,21,0,WS_EX_CLIENTEDGE
END


/////////////////////////////////////////////////////////////////////////////

posted on 2008-05-02 04:54 Gohan 阅读(7714) 评论(2)  编辑 收藏 引用 所属分类: C++PractiseMFC/SDK

Feedback

# re: 获取给定路径的图标,演示SHGetFileInfo用法 2008-11-20 21:56 FreeEIM 飞鸽传书

这篇文章很好,谢谢。  回复  更多评论   

# 企业即时通讯 2011-01-18 09:08 企业即时通讯

学习了,正在找这方面的例子,谢谢  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理