zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    mysql操作规范
    在线修改大表结构pt-online-schema-change
    MySQL 过滤复制
    IDEA “Cannot resolve symbol” 解决办法
    JAVA NIO Selector Channel
    Mysql二级索引
    技术选型关于redis客户端选择
    知乎上看到的一篇讲解Epoll的文章,较形象生动
    linux安装运行virtuoso数据库的详细过程
    go安装步骤(linux和Windows)
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8312559.html
Copyright © 2011-2022 走看看