• LoadImage 和 BitBlt


      1 #include <windows.h>
      2 
      3 #define WINDOWCLASS TEXT("Test")
      4 #define WNDTITLE TEXT("Test")
      5 
      6 #define WINDOW_WIDTH 480 
      7 #define WINDOW_HIGHT 420 
      8 
      9 LRESULT CALLBACK WndProc(HWND hWnd,UINT meg,WPARAM wParam,LPARAM lParam);
     10 void Clear();
     11 
     12 
     13 HDC hMemoryDC;
     14 HDC hDC;
     15 HBITMAP hBitMap;
     16 
     17 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
     18 {
     19     HWND hWnd;
     20     WNDCLASSEX wndClassEx =
     21     {
     22         sizeof(WNDCLASSEX),
     23         CS_HREDRAW | CS_VREDRAW,
     24         WndProc,
     25         0,0,
     26         hInstance,
     27         LoadIcon(NULL,IDI_APPLICATION),
     28         LoadCursor(NULL,IDC_ARROW),
     29         (HBRUSH)GetStockObject(WHITE_BRUSH),
     30         NULL,
     31         WINDOWCLASS,
     32         LoadIcon(NULL,IDI_WINLOGO)
     33     };
     34 
     35     RegisterClassEx(&wndClassEx);
     36     hWnd = CreateWindowEx(
     37         0,
     38         WINDOWCLASS,
     39         WNDTITLE,
     40         WS_OVERLAPPEDWINDOW,
     41         CW_USEDEFAULT,
     42         CW_USEDEFAULT,
     43         WINDOW_WIDTH,
     44         WINDOW_HIGHT,
     45         NULL,
     46         NULL,
     47         hInstance,
     48         NULL
     49         );
     50 
     51     if (NULL == hWnd)
     52     {
     53         return 0;
     54     }
     55 
     56 
     57 //    4 个步骤:
     58 //    1,创建设备上下文。
     59 //    2,创建GDI对象。
     60 //    3,将GDI对象赋给设备上下文。
     61 //  4,BitBlt位块传输给其他设备,以用显示。
     62 
     63 
     64     hDC = GetDC(hWnd);        // 先将图片放入内存,在从内存放入屏幕,GetDC(hWnd) 得到窗口上下文的句柄
     65     hMemoryDC = CreateCompatibleDC(hDC); // 为了读进内存,先建立与屏幕相兼容内存上下文
     66     // 得到HBITMAP 对象 是一个HGDIOBJ 
     67     hBitMap = (HBITMAP)LoadImage(NULL,TEXT("C:\Users\boiceliu\Pictures\girl.bmp"),IMAGE_BITMAP, WINDOW_WIDTH,WINDOW_HIGHT ,LR_LOADFROMFILE); 
     68     //hBitMap = (HBITMAP)LoadImage(NULL,TEXT("C:\Users\boiceliu\Pictures\girl.bmp"),IMAGE_BITMAP,480,400,LR_LOADFROMFILE); 
     69     // 经测试LoadImage 的参数int cx,int cy 代表要将图片写入分辨率为cx * cy的内存区,如果和图片原始分辨率不同的话,你懂的。
     70     
     71     if (NULL == hBitMap)
     72     {
     73         MessageBox(NULL,TEXT("NULL == hBitMap"),TEXT("ERROR"),MB_OK);
     74         return 0;
     75     }
     76     SelectObject(hMemoryDC,hBitMap); // 将HBITMAP 作为内存上下文的GDI对象。
     77 
     78     ShowWindow(hWnd,nShowCmd);
     79     UpdateWindow(hWnd);
     80 
     81     MSG msg;
     82 
     83     while (true)
     84     {
     85         if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
     86         {
     87             if (WM_QUIT == msg.message)
     88             {
     89                 break;
     90             }
     91             TranslateMessage(&msg);
     92             DispatchMessage(&msg);
     93         }
     94     }
     95     return msg.wParam;
     96 }
     97 
     98 void Clear()
     99 {
    100     //ReleaseDC(hWnd,hDC);
    101     //ReleaseDC(hWnd,hMemoryDC);
    102     DeleteDC(hDC);
    103     DeleteDC(hMemoryDC);
    104 }
    105 
    106 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg,WPARAM wParam,LPARAM lParam)
    107 {
    108     HDC hDC;
    109     PAINTSTRUCT ps;
    110 
    111     switch (msg)
    112     {
    113     case WM_SIZE:
    114 
    115     case WM_PAINT:
    116         {
    117             hDC = BeginPaint(hWnd,&ps);
    118 
    119             // SRCCOPY 表示直接用源像素替换目的像素,这里还可以是一些其他的操作
    120             // 大多位运算,以确定像素是怎样写入的。这些操作可以实现一些特效。
    121             BitBlt(hDC,0,0,WINDOW_WIDTH,WINDOW_HIGHT,hMemoryDC,0,0,SRCCOPY);
    122             EndPaint(hWnd,&ps);
    123         }
    124         break;
    125     case WM_KEYDOWN:
    126         {
    127             if (VK_ESCAPE == wParam )
    128             {
    129                 DestroyWindow(hWnd);
    130             }
    131         }
    132         break;
    133     case WM_CLOSE:
    134         {
    135             Clear();
    136             DestroyWindow(hWnd);
    137         }
    138         break;
    139     case WM_DESTROY:
    140         {
    141             PostQuitMessage(0);
    142         }
    143         break;
    144     default:
    145         return DefWindowProc(hWnd,msg,wParam,lParam);
    146     }
    147     return 0;
    148 }
    View Code
  • 相关阅读:
    CSS宽高背景介绍
    js控制iframe高度自动撑开
    点击除指定元素以外的任意地方隐藏js
    es6中对象转数组,转map
    JavaScript常用方法(工具类的封装)
    h5端提示下载app
    web端调百度地图页面
    前端分享功能
    手机注册发送验证码倒计时
    判断滚动条滑到底部触发事件
  • 原文地址:https://www.cnblogs.com/lc-cnblong/p/3307577.html
Copyright © 2020-2023  润新知