zoukankan      html  css  js  c++  java
  • 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) ;
  • 相关阅读:
    Vasya and Endless Credits CodeForces
    Dreamoon and Strings CodeForces
    Online Meeting CodeForces
    数塔取数 基础dp
    1001 数组中和等于K的数对 1090 3个数和为0
    1091 线段的重叠
    51nod 最小周长
    走格子 51nod
    1289 大鱼吃小鱼
    POJ 1979 Red and Black
  • 原文地址:https://www.cnblogs.com/kongtiao/p/2548038.html
Copyright © 2011-2022 走看看