• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            yehao's Blog

            VC使用IPicture顯示網上圖片(通過URL指定)

            轉自http://blog.csdn.net/wallimn/article/details/3068643

            /************************************************************/
            VC IPicture
            顯示網絡圖片 顯示遠程圖片 顯示URL指定的圖片 
            通過HTTP下載顯示圖片 顯示網上廣告圖片
            上面是我羅列的關鍵字,我找這個文章換了好幾種關鍵字寫法,才找到,
            為了方便它人,我把關鍵字全部寫上。
            /************************************************************/
            文章很不錯,正好解決了我的問題。感謝作者。這是個用SDK(沒有使用MFC)開發的程序。
            如果對SDK開發方式不是很熟,只看ShowPic函數就以了。
            1. #include <windows.h>  // Windows SDK 要用到的   
            2. #include <commdlg.h>  // 打開文件的窗口要包含這個頭文件   
            3.   
            4. //用到了 IPicture 接口,要包含下面兩個 頭文件   
            5. #include <ocidl.h>    
            6. #include <olectl.h>    
            7.   
            8. // 聲明窗口函數的原型   
            9. LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);   
            10.   
            11. // 聲明顯示圖片的函數原型   
            12. HRESULT ShowPic(char *lpstrFile,HWND hWnd) ;   
            13.   
            14. //圖片文件名   
            15. char lpstrFile[MAX_PATH]="";   
            16.   
            17.   
            18. int WINAPI WinMain (HINSTANCE hThisInstance,   
            19.                     HINSTANCE hPrevInstance,   
            20.                     LPSTR lpszArgument,   
            21.                     int nFunsterStil)   
            22.                        
            23. {   
            24.     // 窗口類名   
            25.     char szClassName[ ] = "ShowPicture";   
            26.        
            27.     WNDCLASSEX windclass;   
            28.        
            29.     //用描述主窗口的參數填充 WNDCLASSEX 結構   
            30.     windclass.cbSize = sizeof(windclass);  //結構大小   
            31.     windclass.hInstance = hThisInstance;   //實例句酚   
            32.     windclass.lpszClassName = szClassName;   
            33.     windclass.lpfnWndProc = MainWndProc;   //窗口函數指針   
            34.     windclass.style = CS_DBLCLKS;          //捕獲雙擊事件   
            35.     windclass.cbSize = sizeof (WNDCLASSEX);   
            36.        
            37.     windclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //使用預定義圖標   
            38.     windclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); //使用預定義類的小圖標   
            39.     windclass.hCursor = LoadCursor (NULL, IDC_ARROW); //使用預定義光標   
            40.     windclass.lpszMenuName = NULL;                 //不指定主菜單   
            41.     windclass.cbClsExtra = 0;                      //沒有額外的類內存   
            42.     windclass.cbWndExtra = 0;                      //沒有額外的窗口內存   
            43.        
            44.     windclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND; //使用預定義背景畫刷   
            45.        
            46.     //注冊這個窗口類,如果失敗直接退出程序    
            47.     if (!RegisterClassEx (&windclass))   
            48.         return 0;   
            49.        
            50.     //創建主窗口   
            51.     HWND hWnd = CreateWindowEx (   
            52.         0,                   //dwExStyle, 擴展樣式   
            53.         szClassName,         //lpClassName, 類名   
            54.         "顯示圖片 -- 鼠標雙擊瀏覽圖片文件      -- Author:Unmi", //lpWindowName, 標題   
            55.         WS_OVERLAPPEDWINDOW, //dwStyle, 窗口風格   
            56.         CW_USEDEFAULT,       //X, 初始 X 坐標   
            57.         CW_USEDEFAULT,       //Y, 初始 YX 坐標   
            58.         640,                 //nWidth, 寬度   
            59.         480,                 //nHeight, 高度   
            60.         HWND_DESKTOP,        //hWndParent, 父窗口句柄   
            61.         NULL,                //hMenu, 菜單句柄   
            62.         hThisInstance,       //hInstance, 程序實例句柄   
            63.         NULL                 //lpParam, 用戶數據   
            64.         );   
            65.        
            66.     //顯示窗口,刷新窗口客戶區   
            67.     ShowWindow (hWnd, nFunsterStil);   
            68.        
            69.     // 從消息隊列中取出消息,交給窗口函數處理   
            70.     // 直到 GetMessage 取出的消息是 WM_QUIT,即FALSE,則結束消息循環   
            71.     MSG messages;       
            72.     while (GetMessage (&messages, NULL, 0, 0))   
            73.     {   
            74.         //轉換鍵盤消息,把虛擬鍵轉換為字符消息   
            75.         TranslateMessage(&messages);   
            76.            
            77.         //將消息發送到相應的窗口函數   
            78.         DispatchMessage(&messages);   
            79.     }   
            80.        
            81.     // GetMessage 返回 FALSE,程序結束 PostQuitMessage() 發出這一消息   
            82.     return messages.wParam;   
            83. }   
            84.   
            85.   
            86. // 窗口函數,消息由 DispatchMessage 派發   
            87. LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)   
            88. {   
            89.     switch (message) //處理消息   
            90.     {   
            91.     case WM_DESTROY:   
            92.         //向消息隊列投遞一個 WM_QUIT 消息,促使 GetMessage 函數返回0,結束消息循環   
            93.         PostQuitMessage (0);   
            94.         break;   
            95.     case WM_LBUTTONDBLCLK:   
            96.         {   
            97.             OPENFILENAME file = {0};   
            98.             file.lStructSize = sizeof(file);   
            99.             file.lpstrTitle = "請選擇一個圖片文件";   
            100.             file.lpstrFile = lpstrFile;   
            101.             file.nMaxFile = MAX_PATH;   
            102.             file.lpstrFilter = "Pictures(*.jpg,*.gif,*.bmp)/0*.jpg;*.gif;*.bmp/0/0";   
            103.             if(::GetOpenFileName(&file))   
            104.             {          
            105.                 //清除原來的圖像   
            106.                 HDC hdc=GetDC(hWnd);    
            107.                 RECT rect;   
            108.                 ::GetWindowRect(hWnd,&rect);   
            109.                 ::FillRect(hdc,&rect,(HBRUSH) COLOR_BACKGROUND);   
            110.                    
            111.                 ::SendMessage(hWnd,WM_PAINT,NULL,NULL);   
            112.             }   
            113.         }   
            114.         break;   
            115.     case WM_PAINT:   
            116.         ShowPic(lpstrFile,hWnd);   
            117.         break;   
            118.     default:   
            119.            
            120.         //將我們不處理的消息交給系統 做默認處理   
            121.         return DefWindowProc (hWnd, message, wParam, lParam);   
            122.     }   
            123.        
            124.     return 0;   
            125. }   
            126. // 顯示圖片, lpstrImgUrl 為圖片URL地址,hWnd 為窗口句柄      
            127. HRESULT Utils::ShowPic(char *lpstrImgUrl,HWND hWnd)       
            128. {       
            129.     HDC hDC_Temp=GetDC(hWnd);       
            130.        
            131.     IPicture *pPic;       
            132.     IStream *pStm;       
            133.        
            134.     BOOL bResult;       
            135.        
            136.     DWORD dwFileSize,dwByteRead;       
            137.        
            138.     //讀取網頁上圖片文件,實際是個CHttpFile指針   
            139.     CInternetSession session("HttpClient");   
            140.     CFile* httpFile = (CFile*)session.OpenURL(lpstrImgUrl);   
            141.        
            142.     if (httpFile!=INVALID_HANDLE_VALUE)       
            143.     {       
            144.         dwFileSize=  httpFile->GetLength();//獲取文件字節數       
            145.            
            146.         if (dwFileSize==0xFFFFFFFF)       
            147.             return E_FAIL;       
            148.     }       
            149.     else       
            150.     {       
            151.         return E_FAIL;       
            152.     }       
            153.        
            154.        
            155.     //分配全局存儲空間       
            156.     HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);       
            157.     LPVOID pvData = NULL;       
            158.        
            159.     if (hGlobal == NULL)       
            160.         return E_FAIL;       
            161.        
            162.     if ((pvData = GlobalLock(hGlobal)) == NULL)//鎖定分配內存塊       
            163.         return E_FAIL;       
            164.        
            165.     //把文件讀入內存緩沖區       
            166.     dwByteRead = httpFile->Read(pvData,dwFileSize);   
            167.        
            168.     GlobalUnlock(hGlobal);       
            169.        
            170.     CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);       
            171.        
            172.     //裝入圖形文件       
            173.     bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);       
            174.        
            175.     if(FAILED(bResult))       
            176.         return E_FAIL;       
            177.        
            178.     OLE_XSIZE_HIMETRIC hmWidth; //圖片的真實寬度, 單位為英寸      
            179.     OLE_YSIZE_HIMETRIC hmHeight; //圖片的真實高度, 單位為英寸      
            180.     pPic->get_Width(&hmWidth);       
            181.     pPic->get_Height(&hmHeight);       
            182.        
            183.     //轉換hmWidth和hmHeight為pixels距離,1英寸=25.4毫米      
            184.     int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);      
            185.     int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);      
            186.        
            187.     //將圖形輸出到屏幕上(有點像BitBlt)       
            188.     bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,       
            189.         0,hmHeight,hmWidth,-hmHeight,NULL);       
            190.        
            191.     pPic->Release();       
            192.        
            193.     httpFile->Close();//關閉打開的文件       
            194.        
            195.     if (SUCCEEDED(bResult))       
            196.     {       
            197.         return S_OK;       
            198.     }       
            199.     else       
            200.     {       
            201.         return E_FAIL;       
            202.     }       
            203. }   

            補充說明:
              原文的程序是使用SDK方式開發的,可能會有些人不習慣,我使用MFC方式驗證調試了一下,效果還不錯。如需要源碼的,請到http://wallimn.ys168.com(我的網絡硬盤)下載。
              我的程序是個很簡單的程序,沒有考慮重繪、圖片大小的處理等問題,僅體現編程思想及方法。

            posted on 2014-07-11 15:36 厚積薄發 閱讀(612) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            国产精品久久久久久福利69堂| 国产亚洲精午夜久久久久久| 亚洲中文字幕伊人久久无码 | 国产亚洲美女精品久久久2020| 人人狠狠综合88综合久久| 久久国产欧美日韩精品免费| 亚洲av伊人久久综合密臀性色| 久久久久久毛片免费播放| 99久久亚洲综合精品成人| 国产精品99久久久久久宅男小说| 欧洲成人午夜精品无码区久久| 久久国产高清字幕中文| 亚洲国产精品无码久久久久久曰 | 久久93精品国产91久久综合| 久久天天躁狠狠躁夜夜av浪潮| 亚洲∧v久久久无码精品| 国产精品日韩深夜福利久久| 国产成年无码久久久免费| 99久久精品免费国产大片| 久久精品免费全国观看国产| 色综合久久精品中文字幕首页| 思思久久好好热精品国产| 国产一区二区精品久久凹凸| 久久精品国产亚洲av高清漫画| 亚洲国产成人久久综合一区77 | 天天做夜夜做久久做狠狠| 免费精品99久久国产综合精品| 午夜精品久久久久久中宇| 久久福利资源国产精品999| 国产精品无码久久久久| 婷婷综合久久中文字幕| …久久精品99久久香蕉国产| 色欲综合久久中文字幕网| 亚洲熟妇无码另类久久久| 久久精品国产亚洲av麻豆蜜芽| 久久国产综合精品五月天| 国产亚洲精午夜久久久久久| 久久久久久免费一区二区三区| 久久精品国产精品国产精品污| 久久精品国产亚洲AV无码娇色 | 93精91精品国产综合久久香蕉 |