1)只要你GetDC或者 CreateComplateDC  就得释放,否则,你的内存就会崩掉,因为,DC不释放,就会一直CreateDC

2)CASE WM_PAINT  --->意思是窗口重绘,创建HDC和 位图加载的过程 发生在这个里面。

    就好比 你 拖拽你新创建的窗口,窗口随着你的拖拽  变大或者变小  都是  窗口重绘

3)贴图片固定的就是那几步骤:
      所有绘图的操作都要用到HDC,这个HDC是啥:

       

1 HDC--->环境设备句柄
 2 这个HDC就相当于  咱们的绘图板  画板上有  画笔  背景图 还有颜色等等
 3 HDC  hdc=::GetDC(hWnd);       ReleaseDC()
 4 就是取我窗口的一个设备,拿到我这个窗口的画板,获取窗口的这个DC的里面的那张图片,要是你没有贴图,这个图片就是那个背景
 5 
 6 
 7 得到已经创建好的DC
 8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 9 CreateCompatibleDC(dc)        DeleteDC(DC);
10  兼容性DC,
11  创建一个新的
12 我创建的这个是没有位图的,所以需要我选入一个位图,所以  就有了这个
13 SelectObject(hdn_jianrong, hBitMap);
14 
15 ~~~~~~~~~~~~~~~~
16 贴图片,拷贝位图
17 ~~~~~~~~~~~~~~
18 情况类比:加入  我们拿一张白纸去拷贝一张位图,也得两张纸,一张是带图的,一张是白纸,然后去拷贝
19 
20 所以  贴图片一定需要2个DC,一个叫目标,一个是源,
21 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22 
23 你要往窗口上放,目标DC就是窗口
24 HDC hdc=::GetDC(hWnd);
25 
26 然后你再需要一个白纸,用来装刚刚画的那个位图。
27 HDC hdc_jianrong=::CreateCompatibleDC(hdc);
28 
  先把我刚刚画的那个资源视图加载过来
  HBITMAP hBitMap=::LoadBitMap(hIns,hBitMap);
29 给这张白纸贴那个图片
30 SelectObject(hdc_jianrong,hBitMap);
31 
32 贴图啦
33 BitBlt(hdc,0,0,500,500,hdn_jianrong,0,0,SRCCOPY);
34 
35 释放那个GetDC
36 ::DeleteDC(hdn_jianrong);//删除刚刚那个兼容性HDC
37 
38 删除刚刚创建的HDC
39 ::ReleaseDC(hWnd,hdc);//释放当前的HDC

 

 

4)改动部位和代码展示:

     

怎么创建位图索引 如何创建位图_贴图

 

    

怎么创建位图索引 如何创建位图_位图_02

 1 #include<Windows.h> 2 #include"resource.h" 3

4 HINSTANCE hIns;//创建一个当前应用程序的全局变量,以后就可以直接使用这个变量了
 5 //因为这个变量  我要在WndProc这个函数中使用,但是这个变量存在与WinMain函数中,所以 我定义了一个hInstance的全局变量,这样使得 我可以在WndProc中使用WinMain中的变量
 6 
 7 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 8 {
 9     switch(uMsg)
10     {
11     case WM_CLOSE://点那个×,窗口关闭
12         ::PostQuitMessage(0);//消息推出
13         break;
14     case WM_PAINT:
15         HDC hdc=::GetDC(hWnd);//获得当前这个HDC的句柄
16         HDC hdn_jianrong=::CreateCompatibleDC(hdc);//创建一个兼容性HDC
17         HBITMAP hBitMap=::LoadBitmap(hIns,MAKEINTRESOURCE(BACKGROUND));
18         SelectObject(hdn_jianrong, hBitMap);//把刚刚创建的那个位图hBitMap给hdc_jianrong
19         BitBlt(hdc,0,0,500,500,hdn_jianrong,0,0,SRCCOPY);//那个位图属性设置
       ::DeleteObject(hBitMap);

20         ::DeleteDC(hdn_jianrong);//删除刚刚那个兼容性HDC
21         ::ReleaseDC(hWnd,hdc);//释放当前的HDC
22 
23     }
24     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
25 }
26 
27 
28 int CALLBACK WinMain(HINSTANCE hIstance,
29                      HINSTANCE hPreInstance,
30                      LPSTR pCmdLine,
31                      int nCmdShow)
32 {
33             
34     hIns=hIstance;
35     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
36             
37     
38     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
39             WNDCLASSEX wndclass;
40             wndclass.cbClsExtra=0;
41             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
42             wndclass.cbSize=sizeof(WNDCLASSEX);
43             wndclass.hbrBackground=hBrush;
44             wndclass.hCursor=NULL;//光标
45             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
46             wndclass.hIcon=NULL;//窗口图标
47             wndclass.hIconSm=NULL;//窗口左上的图标
48             wndclass.hInstance=hIstance;
49             wndclass.lpfnWndProc=WndProc;
50             wndclass.lpszClassName="wangchao";
51             wndclass.lpszMenuName=NULL;
52             wndclass.style=CS_HREDRAW|CS_VREDRAW;
53 
54     //2.注册
55             if(::RegisterClassEx(&wndclass)==FALSE)
56             {
57                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
58                 
59                 return 0;
60             }
61     //3.创建
62                     
63             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
64             
65         if(hWnd==NULL)
66         {
67             ::MessageBox(NULL,"创建失败","提示",MB_OK);
68             return 0;
69         }
70     //4.显式
71             
72         ::ShowWindow(hWnd,SW_SHOW);
73         
74     //5.消息循环
75         
76             MSG msg;
77             
78             while(::GetMessage(&msg,0,0,0))
79         {
80             //第一步先翻译
81             ::TranslateMessage(&msg);
82             //第二部分发
83             ::DispatchMessageA(&msg);
84 
85         }
86 
87 
88     ::DeleteObject(hBrush);
89 }

  

8)运行结果展示:

    

怎么创建位图索引 如何创建位图_句柄_03

 

 

9)用完还得delete:

    

怎么创建位图索引 如何创建位图_贴图_04