• 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) ;
  • 相关阅读:
    【codevs1949】兔兔与蛋蛋的游戏
    【codevs1775】那些年
    【codevs3153】取石子
    [codevs1909]英语 博弈论
    spfa及slf优化
    [baoj3224]普通平衡树
    恋爱路上的几个叉
    考研之如何联系导师
    《C++程序设计语言(特别版)》忠告(advice)部分
    一位程序猿送给女朋友的礼物
  • 原文地址:https://www.cnblogs.com/kongtiao/p/2548038.html
Copyright © 2020-2023  润新知