14)载入png图片

 

1)之前在窗口中载入图片  一般都是bmp的  但是  我想从网上下一些图片,这些图片可能是png的

2)那么就有了下面的操作

3)png图片可以直接做成透明的。

4)首先是创建窗口的基本代码:

 1 #include<Windows.h>
 2 
 3 
 4 
 5 //这个叫  窗口消息处理函数
 6 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 7 {
 8     switch(uMsg)
 9     {
10     case WM_CLOSE://点那个×,窗口关闭
11         ::PostQuitMessage(0);//消息推出
12         break;
13     
14 
15     }
16     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
17 }
18 
19 
20 int CALLBACK WinMain(HINSTANCE hIstance,
21                      HINSTANCE hPreInstance,
22                      LPSTR pCmdLine,
23                      int nCmdShow)
24 {
25             
26     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
27             
28     
29     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
30             WNDCLASSEX wndclass;
31             wndclass.cbClsExtra=0;
32             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
33             wndclass.cbSize=sizeof(WNDCLASSEX);
34             wndclass.hbrBackground=hBrush;
35             wndclass.hCursor=NULL;//光标
36             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
37             wndclass.hIcon=NULL;//窗口图标
38             wndclass.hIconSm=NULL;//窗口左上的图标
39             wndclass.hInstance=hIstance;
40             wndclass.lpfnWndProc=WndProc;
41             wndclass.lpszClassName="wangchao";
42             wndclass.lpszMenuName=NULL;
43             wndclass.style=CS_HREDRAW|CS_VREDRAW;
44 
45     //2.注册
46             if(::RegisterClassEx(&wndclass)==FALSE)
47             {
48                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
49                 
50                 return 0;
51             }
52     //3.创建
53                     
54             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
55             
56         if(hWnd==NULL)
57         {
58             ::MessageBox(NULL,"创建失败","提示",MB_OK);
59             return 0;
60         }
61     //4.显式
62             
63         ::ShowWindow(hWnd,SW_SHOW);
64         
65     //5.消息循环
66         
67             MSG msg;
68             
69             while(::GetMessage(&msg,0,0,0))
70         {
71             //第一步先翻译
72             ::TranslateMessage(&msg);
73             //第二部分发
74             ::DispatchMessageA(&msg);
75 
76         }
77 
78 
79     ::DeleteObject(hBrush);
80 }

 

5)然后添加一个新的头文件:

    

        

 

 1 #include<Windows.h>
 2 #include<gdiplus.h>//GDI+的头文件
 3 using namespace std;
 4 using namespace Gdiplus;//GDI+的命名空间
 5 
 6 #pragma comment(lib,"gdiplus.lib")//加载GDI+的库,去导入一个库
 7 
 8 
 9 //这个叫  窗口消息处理函数
10 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

 

6)下面的步骤是  :

        ①要去调用一个开始去做GDI+操作的那一个函数

              ::GdiplusStartup();               //开始   

             这个函数不懂 直接按下F1去查帮助

      得到下面的回答  

 1 Status GdiplusStartup(
 2   __out  ULONG_PTR token *token,
 3   __in   const GdiplusStartupInput *input,
 4   __out  GdiplusStartupOutput *output
 5 );
 6 
 7 
 8 第一个是令牌  我也不知道是啥  但是他是__out这个类型 也就是返回值  所以  我要用一个 ULONG_PTR类型的东西  接着
 9 第二个是输入的东西     那么  我就得赋值了
10 第三个  我也是得用一个变量接着
11 
12 
13 那么  我怎么写接着呢:
14 ①定义一个变量ULONG_PTR ulToken,因为他是需要一个接着这个out值的指针,所以  我把ulToken的地址扔进去
15 ②再定义一个变量 GdiplusStartupInput gdiplusStartupInput;
16 ③最后一个不用接着的变量,直接是NULL就行

 

     ②关闭GDI+

        

1     ::DeleteObject(hBrush);
2     //================②游戏关闭 我要关闭GDI+
3      //这个的变量为啥是这个,看帮助文档来的
4     ::GdiplusShutdown(uLong_ptr);
5     return 0;
6 }

 

 

7)总的代码展示:

  

 1 #include<Windows.h>
 2 #include<gdiplus.h>//GDI+的头文件
 3 using namespace std;
 4 using namespace Gdiplus;//GDI+的命名空间
 5 
 6 #pragma comment(lib,"gdiplus.lib")//加载GDI+的库,去导入一个库
 7 
 8 
 9 //这个叫  窗口消息处理函数
10 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
11 {
12     switch(uMsg)
13     {
14     case WM_CLOSE://点那个×,窗口关闭
15         ::PostQuitMessage(0);//消息推出
16         break;
17     
18 
19     }
20     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
21 }
22 
23 
24 int CALLBACK WinMain(HINSTANCE hIstance,
25                      HINSTANCE hPreInstance,
26                      LPSTR pCmdLine,
27                      int nCmdShow)
28 {
29             
30    //============①要去调用一个开始去做GDI+操作的那一个函数============
31     ULONG_PTR  uLong_ptr;
32     GdiplusStartupInput gdiplusStartupInput;
33     ::GdiplusStartup(&uLong_ptr,&gdiplusStartupInput,NULL);
34     
35     
36     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
37             
38     
39     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
40             WNDCLASSEX wndclass;
41             wndclass.cbClsExtra=0;
42             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
43             wndclass.cbSize=sizeof(WNDCLASSEX);
44             wndclass.hbrBackground=hBrush;
45             wndclass.hCursor=NULL;//光标
46             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
47             wndclass.hIcon=NULL;//窗口图标
48             wndclass.hIconSm=NULL;//窗口左上的图标
49             wndclass.hInstance=hIstance;
50             wndclass.lpfnWndProc=WndProc;
51             wndclass.lpszClassName="wangchao";
52             wndclass.lpszMenuName=NULL;
53             wndclass.style=CS_HREDRAW|CS_VREDRAW;
54 
55     //2.注册
56             if(::RegisterClassEx(&wndclass)==FALSE)
57             {
58                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
59                 
60                 return 0;
61             }
62     //3.创建
63                     
64             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
65             
66         if(hWnd==NULL)
67         {
68             ::MessageBox(NULL,"创建失败","提示",MB_OK);
69             return 0;
70         }
71     //4.显式
72             
73         ::ShowWindow(hWnd,SW_SHOW);
74         
75     //5.消息循环
76         
77             MSG msg;
78             
79             while(::GetMessage(&msg,0,0,0))
80         {
81             //第一步先翻译
82             ::TranslateMessage(&msg);
83             //第二部分发
84             ::DispatchMessageA(&msg);
85 
86         }
87 
88 
89     ::DeleteObject(hBrush);
90     //================②游戏关闭 我要关闭GDI+
91      //这个的变量为啥是这个,看帮助文档来的
92     ::GdiplusShutdown(uLong_ptr);
93     return 0;
94 }

 

 

8)上面都是准备工作  下面才是真正的贴图了

    就是在重绘那里  WM_PAINT

 

9)部分代码:
    

 1 case WM_PAINT:
 2         HDC hdc=::GetDC(hWnd);//还是先取得这个窗口的句柄hdc
 3         //==================定义图形对象,
 4                 //而且这个要和我的窗口关联,因为我要往我的窗口hdc中画
 5 
 6         Graphics graphics(hdc);//传入那个hdc,就相当于关联了
 7         //=================加载图片,就是那个png图片的对象
 8         Image image("time.png");
 9 
10         ::ReleaseDC(hWnd,hdc);//取得了  就得释放这个取得的hdc
11         break;

那个time.png图片添加步骤   

      ①在网上下载图片

      ②然后贴到下面:

            

            

      然后:

        

               

 

 

 

     但是代码报错了:

          

    我做了修改  就好了(至于为啥要那样改  我还没弄明白  就知道那样改就对)

          

    

 1 case WM_PAINT:
 2         HDC hdc=::GetDC(hWnd);//还是先取得这个窗口的句柄hdc
 3         //==================定义图形对象,
 4                 //而且这个要和我的窗口关联,因为我要往我的窗口hdc中画
 5 
 6         Graphics graphics(hdc);//传入那个hdc,就相当于关联了
 7         //=================加载图片,就是那个png图片的对象
 8         Image image(L"time.png");
 9 
10         ::ReleaseDC(hWnd,hdc);//取得了  就得释放这个取得的hdc
11         break;

 

 

 10)结果展示:
  

      

 

 

11)总目录结果展示:

      

 

12)总代码展示:

  1 #include<Windows.h>
  2 #include<gdiplus.h>//GDI+的头文件
  3 using namespace std;
  4 using namespace Gdiplus;//GDI+的命名空间
  5 
  6 #pragma comment(lib,"gdiplus.lib")//加载GDI+的库,去导入一个库
  7 
  8 
  9 //这个叫  窗口消息处理函数
 10 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 11 {
 12     switch(uMsg)
 13     {
 14     case WM_CLOSE://点那个×,窗口关闭
 15         ::PostQuitMessage(0);//消息推出
 16         break;
 17     case WM_PAINT:
 18         HDC hdc=::GetDC(hWnd);//还是先取得这个窗口的句柄hdc
 19         //==================定义图形对象,
 20                 //而且这个要和我的窗口关联,因为我要往我的窗口hdc中画
 21 
 22         Graphics graphics(hdc);//传入那个hdc,就相当于关联了
 23 
 24         //=================加载图片,就是那个png图片的对象
 25         Image image(L"time.png");//L,把字符串转化成宽字符集
 26 
 27         //==================加载完后  要进行贴图了
 28         graphics.DrawImage(&image,0,0);//
 29         ::ReleaseDC(hWnd,hdc);//取得了  就得释放这个取得的hdc
 30         break;
 31 
 32     
 33 
 34     }
 35     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
 36 }
 37 
 38 
 39 int CALLBACK WinMain(HINSTANCE hIstance,
 40                      HINSTANCE hPreInstance,
 41                      LPSTR pCmdLine,
 42                      int nCmdShow)
 43 {
 44             
 45    //============①要去调用一个开始去做GDI+操作的那一个函数============
 46     ULONG_PTR  uLong_ptr;
 47     GdiplusStartupInput gdiplusStartupInput;
 48     ::GdiplusStartup(&uLong_ptr,&gdiplusStartupInput,NULL);
 49     
 50     
 51     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
 52             
 53     
 54     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
 55             WNDCLASSEX wndclass;
 56             wndclass.cbClsExtra=0;
 57             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
 58             wndclass.cbSize=sizeof(WNDCLASSEX);
 59             wndclass.hbrBackground=hBrush;
 60             wndclass.hCursor=NULL;//光标
 61             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
 62             wndclass.hIcon=NULL;//窗口图标
 63             wndclass.hIconSm=NULL;//窗口左上的图标
 64             wndclass.hInstance=hIstance;
 65             wndclass.lpfnWndProc=WndProc;
 66             wndclass.lpszClassName="wangchao";
 67             wndclass.lpszMenuName=NULL;
 68             wndclass.style=CS_HREDRAW|CS_VREDRAW;
 69 
 70     //2.注册
 71             if(::RegisterClassEx(&wndclass)==FALSE)
 72             {
 73                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
 74                 
 75                 return 0;
 76             }
 77     //3.创建
 78                     
 79             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
 80             
 81         if(hWnd==NULL)
 82         {
 83             ::MessageBox(NULL,"创建失败","提示",MB_OK);
 84             return 0;
 85         }
 86     //4.显式
 87             
 88         ::ShowWindow(hWnd,SW_SHOW);
 89         
 90     //5.消息循环
 91         
 92             MSG msg;
 93             
 94             while(::GetMessage(&msg,0,0,0))
 95         {
 96             //第一步先翻译
 97             ::TranslateMessage(&msg);
 98             //第二部分发
 99             ::DispatchMessageA(&msg);
100 
101         }
102 
103 
104     ::DeleteObject(hBrush);
105     //================②游戏关闭 我要关闭GDI+
106      //这个的变量为啥是这个,看帮助文档来的
107     ::GdiplusShutdown(uLong_ptr);
108     return 0;
109 }

 

posted @ 2018-01-18 19:08  小油菜1  阅读(516)  评论(0编辑  收藏  举报