轉(zhuǎn)自http://blog.csdn.net/wallimn/article/details/3068643
/************************************************************/
VC IPicture
顯示網(wǎng)絡(luò)圖片 顯示遠(yuǎn)程圖片 顯示URL指定的圖片
通過HTTP下載顯示圖片 顯示網(wǎng)上廣告圖片
上面是我羅列的關(guān)鍵字,我找這個文章?lián)Q了好幾種關(guān)鍵字寫法,才找到,
為了方便它人,我把關(guān)鍵字全部寫上。
/************************************************************/
文章很不錯,正好解決了我的問題。感謝作者。這是個用SDK(沒有使用MFC)開發(fā)的程序。
如果對SDK開發(fā)方式不是很熟,只看ShowPic函數(shù)就以了。
- #include <windows.h> // Windows SDK 要用到的
- #include <commdlg.h> // 打開文件的窗口要包含這個頭文件
-
- //用到了 IPicture 接口,要包含下面兩個 頭文件
- #include <ocidl.h>
- #include <olectl.h>
-
- // 聲明窗口函數(shù)的原型
- LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);
-
- // 聲明顯示圖片的函數(shù)原型
- HRESULT ShowPic(char *lpstrFile,HWND hWnd) ;
-
- //圖片文件名
- char lpstrFile[MAX_PATH]="";
-
-
- int WINAPI WinMain (HINSTANCE hThisInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpszArgument,
- int nFunsterStil)
-
- {
- // 窗口類名
- char szClassName[ ] = "ShowPicture";
-
- WNDCLASSEX windclass;
-
- //用描述主窗口的參數(shù)填充 WNDCLASSEX 結(jié)構(gòu)
- windclass.cbSize = sizeof(windclass); //結(jié)構(gòu)大小
- windclass.hInstance = hThisInstance; //實(shí)例句酚
- windclass.lpszClassName = szClassName;
- windclass.lpfnWndProc = MainWndProc; //窗口函數(shù)指針
- windclass.style = CS_DBLCLKS; //捕獲雙擊事件
- windclass.cbSize = sizeof (WNDCLASSEX);
-
- windclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //使用預(yù)定義圖標(biāo)
- windclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); //使用預(yù)定義類的小圖標(biāo)
- windclass.hCursor = LoadCursor (NULL, IDC_ARROW); //使用預(yù)定義光標(biāo)
- windclass.lpszMenuName = NULL; //不指定主菜單
- windclass.cbClsExtra = 0; //沒有額外的類內(nèi)存
- windclass.cbWndExtra = 0; //沒有額外的窗口內(nèi)存
-
- windclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND; //使用預(yù)定義背景畫刷
-
- //注冊這個窗口類,如果失敗直接退出程序
- if (!RegisterClassEx (&windclass))
- return 0;
-
- //創(chuàng)建主窗口
- HWND hWnd = CreateWindowEx (
- 0, //dwExStyle, 擴(kuò)展樣式
- szClassName, //lpClassName, 類名
- "顯示圖片 -- 鼠標(biāo)雙擊瀏覽圖片文件 -- Author:Unmi", //lpWindowName, 標(biāo)題
- WS_OVERLAPPEDWINDOW, //dwStyle, 窗口風(fēng)格
- CW_USEDEFAULT, //X, 初始 X 坐標(biāo)
- CW_USEDEFAULT, //Y, 初始 YX 坐標(biāo)
- 640, //nWidth, 寬度
- 480, //nHeight, 高度
- HWND_DESKTOP, //hWndParent, 父窗口句柄
- NULL, //hMenu, 菜單句柄
- hThisInstance, //hInstance, 程序?qū)嵗浔?nbsp;
- NULL //lpParam, 用戶數(shù)據(jù)
- );
-
- //顯示窗口,刷新窗口客戶區(qū)
- ShowWindow (hWnd, nFunsterStil);
-
- // 從消息隊(duì)列中取出消息,交給窗口函數(shù)處理
- // 直到 GetMessage 取出的消息是 WM_QUIT,即FALSE,則結(jié)束消息循環(huán)
- MSG messages;
- while (GetMessage (&messages, NULL, 0, 0))
- {
- //轉(zhuǎn)換鍵盤消息,把虛擬鍵轉(zhuǎn)換為字符消息
- TranslateMessage(&messages);
-
- //將消息發(fā)送到相應(yīng)的窗口函數(shù)
- DispatchMessage(&messages);
- }
-
- // GetMessage 返回 FALSE,程序結(jié)束 PostQuitMessage() 發(fā)出這一消息
- return messages.wParam;
- }
-
-
- // 窗口函數(shù),消息由 DispatchMessage 派發(fā)
- LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message) //處理消息
- {
- case WM_DESTROY:
- //向消息隊(duì)列投遞一個 WM_QUIT 消息,促使 GetMessage 函數(shù)返回0,結(jié)束消息循環(huán)
- PostQuitMessage (0);
- break;
- case WM_LBUTTONDBLCLK:
- {
- OPENFILENAME file = {0};
- file.lStructSize = sizeof(file);
- file.lpstrTitle = "請選擇一個圖片文件";
- file.lpstrFile = lpstrFile;
- file.nMaxFile = MAX_PATH;
- file.lpstrFilter = "Pictures(*.jpg,*.gif,*.bmp)/0*.jpg;*.gif;*.bmp/0/0";
- if(::GetOpenFileName(&file))
- {
- //清除原來的圖像
- HDC hdc=GetDC(hWnd);
- RECT rect;
- ::GetWindowRect(hWnd,&rect);
- ::FillRect(hdc,&rect,(HBRUSH) COLOR_BACKGROUND);
-
- ::SendMessage(hWnd,WM_PAINT,NULL,NULL);
- }
- }
- break;
- case WM_PAINT:
- ShowPic(lpstrFile,hWnd);
- break;
- default:
-
- //將我們不處理的消息交給系統(tǒng) 做默認(rèn)處理
- return DefWindowProc (hWnd, message, wParam, lParam);
- }
-
- return 0;
- }
- // 顯示圖片, lpstrImgUrl 為圖片URL地址,hWnd 為窗口句柄
- HRESULT Utils::ShowPic(char *lpstrImgUrl,HWND hWnd)
- {
- HDC hDC_Temp=GetDC(hWnd);
-
- IPicture *pPic;
- IStream *pStm;
-
- BOOL bResult;
-
- DWORD dwFileSize,dwByteRead;
-
- //讀取網(wǎng)頁上圖片文件,實(shí)際是個CHttpFile指針
- CInternetSession session("HttpClient");
- CFile* httpFile = (CFile*)session.OpenURL(lpstrImgUrl);
-
- if (httpFile!=INVALID_HANDLE_VALUE)
- {
- dwFileSize= httpFile->GetLength();//獲取文件字節(jié)數(shù)
-
- if (dwFileSize==0xFFFFFFFF)
- return E_FAIL;
- }
- else
- {
- return E_FAIL;
- }
-
-
- //分配全局存儲空間
- HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
- LPVOID pvData = NULL;
-
- if (hGlobal == NULL)
- return E_FAIL;
-
- if ((pvData = GlobalLock(hGlobal)) == NULL)//鎖定分配內(nèi)存塊
- return E_FAIL;
-
- //把文件讀入內(nèi)存緩沖區(qū)
- dwByteRead = httpFile->Read(pvData,dwFileSize);
-
- GlobalUnlock(hGlobal);
-
- CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
-
- //裝入圖形文件
- bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
-
- if(FAILED(bResult))
- return E_FAIL;
-
- OLE_XSIZE_HIMETRIC hmWidth; //圖片的真實(shí)寬度, 單位為英寸
- OLE_YSIZE_HIMETRIC hmHeight; //圖片的真實(shí)高度, 單位為英寸
- pPic->get_Width(&hmWidth);
- pPic->get_Height(&hmHeight);
-
- //轉(zhuǎn)換hmWidth和hmHeight為pixels距離,1英寸=25.4毫米
- int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
- int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
-
- //將圖形輸出到屏幕上(有點(diǎn)像BitBlt)
- bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,
- 0,hmHeight,hmWidth,-hmHeight,NULL);
-
- pPic->Release();
-
- httpFile->Close();//關(guān)閉打開的文件
-
- if (SUCCEEDED(bResult))
- {
- return S_OK;
- }
- else
- {
- return E_FAIL;
- }
- }
補(bǔ)充說明:
原文的程序是使用SDK方式開發(fā)的,可能會有些人不習(xí)慣,我使用MFC方式驗(yàn)證調(diào)試了一下,效果還不錯。如需要源碼的,請到http://wallimn.ys168.com(我的網(wǎng)絡(luò)硬盤)下載。
我的程序是個很簡單的程序,沒有考慮重繪、圖片大小的處理等問題,僅體現(xiàn)編程思想及方法。