国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
VC 中用 IPicture 在窗口中顯示圖片文件

VC 中用 IPicture 在窗口中顯示圖片文件

2008-12-09 16:30:07 閱讀(232) 評(píng)論(1) 發(fā)表評(píng)論

  想做個(gè)東西,用VC,希望是在程序界面上能把指定 URL 的圖片顯示出來,還沒找到如何顯示 HTTP 資源的圖片,先還是讓本地圖片能在 VC 的窗口(包括各種控件)中顯示出來吧。在網(wǎng)上搜索了一番,大家代碼都如出一轍,我也不能生搬硬載,不由又親手實(shí)踐了一下,并連同原來學(xué)過的 Window SDK 做窗口程序也復(fù)習(xí)了一遍,沒有使用到 MFC,只需存成單個(gè)源文件,甚至用 CL 命令來編譯都無須打開 VC 的,在 VC6 中測(cè)試通過。

  效果圖如下:

  代碼如下:(僅需關(guān)鍵最后一個(gè)方法 ShowPic(char *lpstrFile, HWND hWnd))




#include <windows.h> // Windows SDK 要用到的 
#include <commdlg.h> // 打開文件的窗口要包含這個(gè)頭文件 
 
//用到了 IPicture 接口,要包含下面兩個(gè) 頭文件 
#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ù)定義背景畫刷 
   
  //注冊(cè)這個(gè)窗口類,如果失敗直接退出程序  
  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ū)嵗浔?/code>
    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ì)列投遞一個(gè) WM_QUIT 消息,促使 GetMessage 函數(shù)返回0,結(jié)束消息循環(huán) 
    PostQuitMessage (0); 
    break; 
  case WM_LBUTTONDBLCLK: 
    { 
      OPENFILENAME file = {0}; 
      file.lStructSize = sizeof(file); 
      file.lpstrTitle = "請(qǐng)選擇一個(gè)圖片文件"; 
      file.lpstrFile = lpstrFile; 
      file.nMaxFile = MAX_PATH; 
      file.lpstrFilter = "Pictures(*.jpg,*.gif,*.bmp)*.jpg;*.gif;*.bmp"; 
      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; 
} 
 
// 顯示圖片,此文的重點(diǎn)之所在了, lpstrFile 為圖片文件名,hWnd 為窗口句柄 
HRESULT ShowPic(char *lpstrFile,HWND hWnd)  
{  
  HDC hDC_Temp=GetDC(hWnd);  
   
  IPicture *pPic;  
  IStream *pStm;  
   
  BOOL bResult;  
   
  HANDLE hFile=NULL;  
  DWORD dwFileSize,dwByteRead;  
   
  //打開圖形文件  
  hFile=CreateFile(lpstrFile,GENERIC_READ,  
    FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
   
  if (hFile!=INVALID_HANDLE_VALUE)  
  {  
    dwFileSize=GetFileSize(hFile,NULL);//獲取文件字節(jié)數(shù)  
     
    if (dwFileSize==0xFFFFFFFF)  
      return E_FAIL;  
  }  
  else  
  {  
    return E_FAIL;  
  }  
   
   
  //分配全局存儲(chǔ)空間  
  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;  
   
  ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件讀入內(nèi)存緩沖區(qū)  
   
  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();  
   
  CloseHandle(hFile);//關(guān)閉打開的文件  
   
  if (SUCCEEDED(bResult))  
  {  
    return S_OK;  
  }  
  else  
  {  
    return E_FAIL;  
  }  
} 函數(shù) HRESULT ShowPic(char *lpstrFile,HWND hWnd) 是本日志要義之所在,傳入文件名和窗口句柄(比如按或者靜態(tài)文本框的句柄亦可),然后會(huì)在指定窗口中按圖片實(shí)際尺寸顯示出來。

  注意,必須包含頭文件 ocidl.h 和 olectl.h 。關(guān)鍵的方法只有 ShowPic,其余的代碼只不過為我練手之用,權(quán)可當(dāng)是累贅。以上實(shí)現(xiàn)的是在主窗口中顯示圖片,圖片格式暫定為允許選擇JPG/GIF/BMP三種,其他沒一一嘗試,不過我想只要 IE 中能支持的圖片式在此應(yīng)無問題。

  操作方法是:在窗口中雙擊鼠標(biāo)左鍵就會(huì)彈出圖片選擇窗口,選擇適當(dāng)?shù)膱D片就會(huì)在窗口中顯示。目前只是讀取圖片文件顯示,期待中的是下一步顯示內(nèi)存中的圖片數(shù)據(jù)字節(jié)數(shù)組或流,進(jìn)而給個(gè) HTTP 協(xié)議的圖片 URL 就能正確顯示,那么在這個(gè)小范圍內(nèi)的研究對(duì)我說算是一個(gè)小突破。

  現(xiàn)在想來,好像都不是問題,只是不同的 File HANDLE 而已,通過 CInternetSession 讀取圖片 URL 也會(huì)是生成一個(gè) FILE HANDLE,交給 ReadFile 去讀取就行了,晚上回去試一試。


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Windows程序設(shè)計(jì)——GDI字符及圖形標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)輸出
VC中通過修改注冊(cè)表來修改Path后的奇怪問題
VC編程小技巧之框架窗口及其他
孫鑫VC視頻教程筆記之第一課“Windows程序的內(nèi)部運(yùn)行原理”
VC中定時(shí)器的使用_VC技術(shù)文章_VC_軟件編程
VC小技巧20個(gè)-C/C++
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服