Visual C++位图操作

一.BitBlt

将一幅位图从一个设备场景复制到另一个,即复制像素,前面参数为目标,后者为源

case WM_PAINT:

               hdcClient = BeginPaint (hwnd, &ps) ;

               hdcWindow = GetWindowDC (hwnd) ;

               for (y = 0 ; y < cyClient ; y += cySource)

                   for (x = 0 ; x < cxClient ; x += cxSource)

                   {

                          BitBlt (hdcClient, x, y, cxSource, cySource,

                          hdcWindow, 0, 0, SRCCOPY) ;

                   }

               ReleaseDC (hwnd, hdcWindow) ;

               EndPaint (hwnd, &ps) ;

               return 0 ;

二.拉伸位图(会使图片不清晰)

使用StretchBlt函数,比BitBlt多了两个参数

case WM_PAINT:

               hdcClient = BeginPaint (hwnd, &ps) ;

               hdcWindow = GetWindowDC (hwnd) ;

              StretchBlt (hdcClient, 0, 0, cxClient, cyClient,

                    hdcWindow, 0, 0, cxSource, cySource, MERGECOPY) ;

               ReleaseDC (hwnd, hdcWindow) ;

               EndPaint (hwnd, &ps) ;

               return 0 ;

三.创建位图

3.1

hBitmap = CreateCompatibleBitmap (hdc, cx, cy) ; 

        //此函数建立了一个与设备兼容的位图 
hBitmap CreateBitmapIndirect (&bitmap) ;

//通过结构体创建 
  1. 先LoadBitmap 载入位图
  2. 然后创建CreateCompatibleDC
  3. BitBlt 拷贝像素
switch(message)

{

case WM_CREATE:

               hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;

               hBitmap = LoadBitmap (hInstance, TEXT ("Bricks")) ;

               GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;

               cxSource = bitmap.bmWidth ;

               cySource = bitmap.bmHeight ;

               return 0 ;

case WM_SIZE:

               cxClient = LOWORD (lParam) ;

               cyClient = HIWORD (lParam) ;

               return 0 ;

case WM_PAINT:

               hdc = BeginPaint (hwnd, &ps) ;

               hdcMem = CreateCompatibleDC (hdc) ;

               SelectObject (hdcMem, hBitmap) ;

               for (y = 0 ; y < cyClient ; y += cySource)

                   for (x = 0 ; x < cxClient ; x += cxSource)

                   {

                     BitBlt (hdc, x, y, cxSource, cySource, hdcMem, 0, 0, SRCCOPY) ;

                   }

               DeleteDC (hdcMem) ;

               EndPaint (hwnd, &ps) ;

               return 0 ;

case WM_DESTROY:

               DeleteObject (hBitmap) ;

               PostQuitMessage (0) ;

               return 0 ;

}

3.2用位图创建文字,用0和1表示,相当于画像素点的意思.

填充BITMAP的bmBits字段

 static BITMAP bitmap = {   0, 8, 8, 2, 1, 1 } ;

 static BYTE                   bits [8][2]={ 0xFF, 0, 0x0C, 0, 0x0C, 0, 0x0C, 0,

        

                                       0xFF, 0, 0xC0, 0, 0xC0, 0, 0xC0, 0 } ;

 static HBITMAP hBitmap ;

 static int cxClient, cyClient, cxSource, cySource ;

 HDC                           hdc, hdcMem ;

 int x, y ;

 PAINTSTRUCT                  ps ;

        

   

        

 switch (message)

        

{

        

 case WM_CREATE:

        

                bitmap.bmBits = bits ;

        

                hBitmap       = CreateBitmapIndirect (&bitmap) ;

        

                cxSource      = bitmap.bmWidth ;

        

                cySource      = bitmap.bmHeight ;

        

                return 0 ;

3.3使用位图创建笔刷

hBitmap = LoadBitmap (hInstance, TEXT ("Bricks"));

hBrush = CreatePatternBrush (hBitmap);

DeleteObject (hBitmap);

3.4在位图中绘图

用CreateCompatibleBitmap 创建一幅与设备兼容有关位图,然后选择位图,SelectObject (hdcMem, hBitmap)

hdc = GetDC (hwnd) ;

hdcMem  = CreateCompatibleDC (hdc) ;

GetTextExtentPoint32 (hdc, szText, lstrlen (szText), &size);

cxBitmap = size.cx ;

cyBitmap = size.cy;

hBitmap = CreateCompatibleBitmap (hdc, cxBitmap, cyBitmap);

ReleaseDC (hwnd, hdc) ;

SelectObject (hdcMem, hBitmap) ;

TextOut (hdcMem, 0, 0, szText, lstrlen (szText));

创建好以后就可以同上方法用BitBlt或者StretchBlt方法操作像素了

四.菜单插入位图

hBitmap = StretchBitmap (LoadBitmap (hInstance, TEXT ("BitmapFont"))) ;

AppendMenu (hMenu, MF_BITMAP | MF_POPUP, (int) hMenuPopup,

                   (PTSTR) (LONG) hBitmap) ;

你可能感兴趣的:(C++)