• <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>
            隨筆 - 224  文章 - 41  trackbacks - 0
            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            享受編程

            常用鏈接

            留言簿(11)

            隨筆分類(159)

            隨筆檔案(224)

            文章分類(2)

            文章檔案(4)

            經(jīng)典c++博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            VC下顯示位圖的幾種方法
            總結(jié)一下關(guān)于位圖的幾種用法。
            說到這還是開頭給大家介紹一下,有關(guān)位圖的知識(shí)吧,以及對(duì)于我們比較有用的幾個(gè)關(guān)于位圖的結(jié)構(gòu)體。
            一.位圖結(jié)構(gòu)如下:
             
            ---- 一、BMP文件結(jié)構(gòu) 
            ---- 1. BMP文件組成 
            ---- BMP文件由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù)四部分組成。 
            ---- 2. BMP文件頭 
            ---- BMP文件頭數(shù)據(jù)結(jié)構(gòu)含有BMP文件的類型、文件大小和位圖起始位置等信息。 
            ---- 其結(jié)構(gòu)定義如下:  
            typedef struct tagBITMAPFILEHEADER
            {
            WORDbfType;   // 位圖文件的類型,必須為BM
            DWORD   bfSize;   // 位圖文件的大小,以字節(jié)為單位
            WORDbfReserved1;  // 位圖文件保留字,必須為0
            WORDbfReserved2;  // 位圖文件保留字,必須為0
            DWORD   bfOffBits; // 位圖數(shù)據(jù)的起始位置,以相對(duì)于位圖
            // 文件頭的偏移量表示,以字節(jié)為單位
            } BITMAPFILEHEADER;
            ---- 3. 位圖信息頭  
            BMP位圖信息頭數(shù)據(jù)用于說明位圖的尺寸等信息。
            typedef struct tagBITMAPINFOHEADER{
               DWORD  biSize;   // 本結(jié)構(gòu)所占用字節(jié)數(shù)
               LONGbiWidth;  // 位圖的寬度,以像素為單位
               LONGbiHeight; // 位圖的高度,以像素為單位
               WORD   biPlanes; // 目標(biāo)設(shè)備的級(jí)別,必須為1
               WORD   biBitCount// 每個(gè)像素所需的位數(shù),必須是1(雙色),
              // 4(16色),8(256色)或24(真彩色)之一
               DWORD  biCompression;   // 位圖壓縮類型,必須是 0(不壓縮),
              // 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
               DWORD  biSizeImage; // 位圖的大小,以字節(jié)為單位
               LONGbiXPelsPerMeter; // 位圖水平分辨率,每米像素?cái)?shù)
               LONGbiYPelsPerMeter;  // 位圖垂直分辨率,每米像素?cái)?shù)
               DWORD  biClrUsed;// 位圖實(shí)際使用的顏色表中的顏色數(shù)
               DWORD  biClrImportant;// 位圖顯示過程中重要的顏色數(shù)
            } BITMAPINFOHEADER; 
            ---- 4. 顏色表  
                顏色表用于說明位圖中的顏色,它有若干個(gè)表項(xiàng),每一個(gè)表項(xiàng)是一個(gè)RGBQUAD類型的結(jié)構(gòu),定義一種顏色。RGBQUAD結(jié)構(gòu)的定義如下: 
            typedef struct tagRGBQUAD {
            BYTErgbBlue;// 藍(lán)色的亮度(值范圍為0-255)
            BYTErgbGreen;   // 綠色的亮度(值范圍為0-255)
            BYTErgbRed; // 紅色的亮度(值范圍為0-255)
            BYTErgbReserved;// 保留,必須為0
            } RGBQUAD;
            顏色表中RGBQUAD結(jié)構(gòu)數(shù)據(jù)的個(gè)數(shù)有biBitCount來確定:
            當(dāng)biBitCount=1,4,8時(shí),分別有2,16,256個(gè)表項(xiàng);
            當(dāng)biBitCount=24時(shí),沒有顏色表項(xiàng)。
               位圖信息頭和顏色表組成位圖信息,BITMAPINFO結(jié)構(gòu)定義如下:
            typedef struct tagBITMAPINFO {
               BITMAPINFOHEADER bmiHeader;   // 位圖信息頭
               RGBQUAD  bmiColors[1];  // 顏色表
            } BITMAPINFO;
            下面我們介紹第一種辦法:
            //第一種方法,使用WM__CTRLCOLOR來實(shí)現(xiàn)
            /*******************OnCtlColor中添加的代碼*****************/
            HBRUSH CDemoBitmapDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
            {
             HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
             
             // TODO: Change any attributes of the DC here
             //第一種實(shí)現(xiàn)方法
             if(nCtlColor=CTLCOLOR_DLG)
             {
              return brush;
             }
             // TODO: Return a different brush if the default is not desired
             return hbr;
            }
            BOOL CDemoBitmapDlg::OnInitDialog()
            {
             //第一種方法,使用wm_ctlcolor來實(shí)現(xiàn)
             CBitmap bitmap;
             bitmap.LoadBitmap(IDB_BITMAP1);
             brush.CreatePatternBrush(&bitmap);//brush定義在頭文件中CBrush burush
             bitmap.DeleteObject();
            }
            第二種方法使用資源文件中導(dǎo)入的IDB_BITMAP來實(shí)現(xiàn)
            第一步先在資源中導(dǎo)入一個(gè)位圖:IDB_BITMAP1
            void CDemoBitmapDlg::OnBtnBitmap() 
            {
             // TODO: Add your control notification handler code here
             /***************顯示BITMAP的第二種方法**********************/
             HBITMAP hBitmap;
             CBitmap bitmap;
             CClientDC *pDC;
             pDC=new CClientDC(this);
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             bitmap.Attach(hBitmap);
             CDC CDCompatible;
             CDCompatible.CreateCompatibleDC(pDC);//創(chuàng)建兼容DC
             CDCompatible.SelectObject(&bitmap);
             /*********其它幾種顯示方式********/
            /* pDC->BitBlt(0,0,200,200,&CDCompatible,0,0,SRCCOPY);
             CDCompatible.SetBkMode(TRANSPARENT);
             pDC->StretchBlt(0,0,352,288,&CDCompatible,0,0,352,288,SRCCOPY);
                CDCompatible.CreateCompatibleDC(this->GetDC());
                CDCompatible.SelectObject(&bitmap); */ //選擇繪圖對(duì)象
             BITMAP bmp;
             bitmap.GetBitmap(&bmp);
                pDC->StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&CDCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); 
                CDCompatible.DeleteDC();  
                ::DeleteObject(&bitmap); 
            }
            第三種方法是通過讀取指定目錄中的位圖文件來顯示(這里分別把它們顯示在Picture控件和Static上面這也是大家通常要用到的):
            void CDemoBitmapDlg::OnBtnPic() 
            {
             // TODO: Add your control notification handler code here
             /****************向PICTURE控件中動(dòng)態(tài)添加位圖****************************/
             HBITMAP hBitmap;
             CBitmap bitmap;
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             bitmap.Attach(hBitmap);
             m_Pic.SetBitmap(hBitmap);
            }
            /****************在STATIC中顯示位圖*********************/
            void CDemoBitmapDlg::OnBtnStatic() 
            {
             // TODO: Add your control notification handler code here
             CBitmap hbmp;
             HBITMAP hbitmap;
             //將pStatic指向要顯示的地方
             CStatic *pStaic;
             pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);
            // pStaic=(CStatic*)GetDlgItem(IDC_BUTTON1);
             //裝載資源 MM.bmp是我的一個(gè)文件名,用你的替換
             hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"NetFriend.bmp",
              IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
             
             hbmp.Attach(hbitmap);
             //獲取圖片格式
             BITMAP bm;
             hbmp.GetBitmap(&bm);
             CDC dcMem;
             dcMem.CreateCompatibleDC(GetDC());
             CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);
             CRect lRect;
             pStaic->GetClientRect(&lRect);
             //顯示位圖
             pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),  &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
             dcMem.SelectObject(&poldBitmap);
            }
            /*****************向BUTTON中添加ICON*****************************/
            //方法和導(dǎo)入其它位圖類似,在這里就只做一個(gè)說明一下就是了。 
            HICON hIco;
             hIco=AfxGetApp()->LoadIcon(IDI_ICON1);
             m_BtnBitmap.SetIcon(hIco);
            第四種讀取位圖文件來顯示位圖:
            void CDemoBitmapDlg::OnBtnBtmfile() 
            {
             // TODO: Add your control notification handler code here
             /*******************通過讀取位圖文件來顯示位圖**********************/
             CString strFileName;
             strFileName.Format("%s","NetFriend.bmp");
             //成位圖信息BITMAPINFO
             BITMAPINFO *bitmapinfo=NULL;
             BYTE *BmpData=NULL;
             CFile file;//讀取位圖信息
             //設(shè)置文件的打開方式
             if(!file.Open(strFileName,Cfile::modeRead|Cfile::typeBinary))
             {
              return;
             }
             //BITMAP文件頭結(jié)構(gòu)體
             BITMAPFILEHEADER BitmapHead;
             //讀取位圖文件頭
             if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
             {
              MessageBox("讀取文件頭失敗!");
              return;
             }
             if(BitmapHead.bfType!=0x4d42)
             {
              MessageBox("對(duì)不起,您讀取的不是位圖文件!");
              return;
             }
             //位圖信息
             BITMAPINFOHEADER  BitmapInfo;
             if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
             {
              MessageBox("讀取位圖信息失敗!");
              return;
             }
             if(BitmapInfo.biBitCount!=24)
             {
              MessageBox("對(duì)不起,當(dāng)前程序只支持24位位圖信息!");
              return;
             }
             bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
             if(!bitmapinfo)
             {
              MessageBox("內(nèi)存分配失敗!");
              return;
             }
             /*把BMP位圖信息頭中的數(shù)據(jù)讀取到位圖信息結(jié)構(gòu)中去.*/
             memcpy(bitmapinfo,&BitmapInfo,sizeof(BITMAPINFOHEADER));
             /*用來得到位圖文件的大小*/
             DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;
             BmpData=(BYTE*)new char[dataByte];
             if(!BmpData)
             {
              MessageBox("內(nèi)存分配失敗!");
              delete bitmapinfo;
              delete BmpData;
              return;
             }
             if(file.Read(BmpData,dataByte)!=dataByte)
             {
              MessageBox("讀取位圖數(shù)據(jù)失敗!");
              return;
             }
             file.Close();
             CClientDC *pDC=new CClientDC(this);
             pDC->SetStretchBltMode(COLORONCOLOR);
             StretchDIBits(pDC->GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight,  0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);
            }
            最后給大家介紹兩個(gè)顯示位圖的特效的例子更多的特效顯示
            1> 水平交錯(cuò)顯示位圖
            void CListBmap::OnButton1() 
            {
             // TODO: Add your control notification handler code here
             HBITMAP hBitmap;
             CBitmap cBitmap;
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",  IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             cBitmap.Attach(hBitmap);
             cBitmap.GetBitmap(&bitmap);
             int i=0,j=0;
             CClientDC *pDC=new CClientDC(this);
             CDC memDC;
             memDC.CreateCompatibleDC(GetDC());
             memDC.SelectObject(&cBitmap);
             for(i=0;i<bitmap.bmHeight;i+=2)
             {
              j=i;
              while(j>0)
              {
               pDC->StretchBlt(0,j-1,bitmap.bmWidth,1,&memDC,0,bitmap.bmHeight-(i-j+1),    bitmap.bmWidth,1,SRCCOPY);
               pDC->StretchBlt(0,bitmap.bmHeight-j,bitmap.bmWidth,1,&memDC,0,i-j,    bitmap.bmWidth,1,SRCCOPY);
               j-=2;
              }
              Sleep(50);
             }
            }
            2>雨點(diǎn)顯示:
            void CListBmap::OnButton2() 
            {
             // TODO: Add your control notification handler code here
             HBITMAP hBitmap;
             CBitmap cBitmap;
             hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",  IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
             cBitmap.Attach(hBitmap);
             cBitmap.GetBitmap(&bitmap);
             int i=0,j=0;
             CClientDC *pDC=new CClientDC(this);
             CDC memDC;
             memDC.CreateCompatibleDC(GetDC());
             memDC.SelectObject(&cBitmap);
             for ( i=0; i<=bitmap.bmHeight; i++ )   
             {
              for ( j=0; j<=bitmap.bmHeight-i; j++ )  
               pDC->StretchBlt(  
               0,j,  
               //目標(biāo)設(shè)備邏輯橫、縱坐標(biāo)  
               bitmap.bmWidth,1,  
               //顯示位圖的像素寬、高度 
               &memDC,  
               //源位圖設(shè)備情境對(duì)象 
               0,bitmap.bmHeight-i,  
               //源位圖的起始橫、縱坐標(biāo)  
               bitmap.bmWidth,1,  
               //源位圖的像素寬、高度  
               SRCCOPY);  
              Sleep(20);  
             }
            }
            posted on 2010-01-24 15:36 漂漂 閱讀(1369) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 深入vc++
            国产精品福利一区二区久久| 色综合久久中文色婷婷| 久久SE精品一区二区| 国产成人精品综合久久久久| 久久午夜羞羞影院免费观看| 性做久久久久久久| 99久久婷婷国产综合精品草原| 午夜精品久久久久成人| 97久久超碰成人精品网站| 久久精品亚洲精品国产欧美| 婷婷久久久亚洲欧洲日产国码AV| 91精品国产色综久久| 久久精品国产99国产精品亚洲| 久久伊人精品青青草原高清| 97久久国产露脸精品国产| 久久久久久久亚洲精品| 97久久综合精品久久久综合| A级毛片无码久久精品免费| 久久久久国产| 久久99精品国产麻豆婷婷| 婷婷综合久久中文字幕蜜桃三电影| 精品无码久久久久久久动漫| 国产精品无码久久综合| 欧美成人免费观看久久| 久久久WWW免费人成精品| 69SEX久久精品国产麻豆| 久久久久久久精品妇女99| 久久免费视频6| 久久久久国产精品三级网| 久久久WWW成人| 亚洲午夜久久久| 欧美精品福利视频一区二区三区久久久精品 | 国产成人精品久久| 国产精品久久新婚兰兰| 狠狠色丁香久久婷婷综合蜜芽五月| 欧美亚洲另类久久综合| 嫩草影院久久99| 久久久99精品一区二区| 久久免费香蕉视频| 一级女性全黄久久生活片免费| 久久99精品久久久久久野外 |