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 }