win32SDK中使用图片的api

本文档详细介绍了如何在Win32SDK环境下利用GDI+和CImage类来处理位图(BMP)和PNG图像,包括加载图片、平铺、居中和拉伸模式的绘画,并提供了窗口回调函数和窗口创建的相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Win32SDK.h

[cpp]  view plain copy
  1. #pragma once  
  2. #include <windows.h>  
  3. #include <tchar.h>  
  4. #include <assert.h>  
  5. #include <GdiPlus.h>  
  6. #include <AtlImage.h>  
  7. #pragma comment(lib,"gdiplus.lib")  
  8.   
  9. //命名空间  
  10. using namespace Gdiplus;  
  11.   
  12. //绘画模式  
  13. #define DRAW_MODE_SPREAD            0                                   //平铺模式  
  14. #define DRAW_MODE_CENTENT           1                                   //居中模式  
  15. #define DRAW_MODE_ELONGGATE         2                                   //拉伸模式  
  16.   
  17.   
  18. //全局变量定义  
  19. CImage          m_Imagebmp;             //bmp图片  
  20. Image *         m_pImage=NULL;          //png图片  
  21. HWND            g_hwnd;                 //窗口句柄                    
  22. TCHAR           szWindowClass[]=TEXT("哈哈");  
  23.   
  24.   
  25. //全局函数定义  
  26.   
  27. //窗口回调  
  28. LRESULT CALLBACK    WndProc(HWNDUINTWPARAMLPARAM);  
  29. //创建事件  
  30. bool OnCreate(HWND hwnd);  
  31. //绘画背景  
  32. VOID DrawViewImage(HDC DC, CImage & BitImage, BYTE cbDrawMode);  
  33. //绘画PNG图像  
  34. bool DrawImagePng(HDC DC, INT nXPos, INT nYPos);  


Win32SDK.cpp

[cpp]  view plain copy
  1. #include "Win32SDK.h"  
  2.   
  3. int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)  
  4. {  
  5.     WNDCLASSEX wcex={0};  
  6.     wcex.cbSize = sizeof(WNDCLASSEX);  
  7.     wcex.style          = CS_HREDRAW | CS_VREDRAW;  
  8.     wcex.lpfnWndProc    = WndProc;  
  9.     wcex.cbClsExtra     = 0;  
  10.     wcex.cbWndExtra     = 0;  
  11.     wcex.hInstance      = hInstance;  
  12.     wcex.hIcon          = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));  
  13.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);  
  14.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);  
  15.     wcex.lpszMenuName   = NULL;  
  16.     wcex.lpszClassName  = szWindowClass;  
  17.     wcex.hIconSm        = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));  
  18.     RegisterClassEx(&wcex);  
  19.   
  20.     HWND hWnd;  
  21.     hWnd = CreateWindow(szWindowClass, TEXT("标题"), WS_OVERLAPPEDWINDOW,0, 0, 600, 400, NULL, NULL, hInstance, NULL);  
  22.     if (!hWnd)return FALSE;  
  23.   
  24.     ShowWindow(hWnd, nCmdShow);  
  25.     UpdateWindow(hWnd);  
  26.   
  27.     MSG msg={0};  
  28.     while (GetMessage(&msg, NULL, 0, 0))  
  29.     {  
  30.         TranslateMessage(&msg);  
  31.         DispatchMessage(&msg);  
  32.     }  
  33.     return (int) msg.wParam;  
  34. }  
  35.   
  36. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
  37. {  
  38.     int wmId, wmEvent;  
  39.     PAINTSTRUCT ps;  
  40.     HDC hdc;  
  41.   
  42.     switch (message)  
  43.     {  
  44.     case WM_CREATE:  
  45.             OnCreate(hWnd);break;  
  46.     case WM_COMMAND:  
  47.         {  
  48.             wmId    = LOWORD(wParam);  
  49.             wmEvent = HIWORD(wParam);  
  50.             // 分析菜单选择:  
  51.             switch (wmId)  
  52.             {  
  53.             case IDOK:break;  
  54.             default:  
  55.                 return DefWindowProc(hWnd, message, wParam, lParam);  
  56.             }  
  57.         }  
  58.         break;  
  59.     case WM_PAINT:  
  60.         {  
  61.             hdc = BeginPaint(hWnd, &ps);  
  62.             // TODO: 在此添加任意绘图代码...  
  63.             DrawViewImage(hdc,m_Imagebmp,DRAW_MODE_CENTENT);  
  64.             DrawImagePng(hdc,0,0);  
  65.             EndPaint(hWnd, &ps);  
  66.         }  
  67.         break;  
  68.     case WM_DESTROY:  
  69.         PostQuitMessage(0);  
  70.         break;  
  71.     default:  
  72.         return DefWindowProc(hWnd, message, wParam, lParam);  
  73.     }  
  74.     return 0;  
  75. }  
  76.   
  77. bool OnCreate(HWND hwnd)  
  78. {  
  79.     g_hwnd=hwnd;  
  80.   
  81.     //窗口居中  
  82.     int x=GetSystemMetrics(SM_CXSCREEN);  
  83.     int y=GetSystemMetrics(SM_CYSCREEN);  
  84.   
  85.     RECT WindowRect;  
  86.     GetWindowRect(hwnd,&WindowRect);  
  87.     int cx=(x-WindowRect.right)/2;  
  88.     int cy=(y-WindowRect.bottom)/2;  
  89.     SetWindowPos(hwnd,NULL,cx,cy,NULL,NULL,SWP_SHOWWINDOW|SWP_NOSIZE);  
  90.   
  91.     //加载 bmp文件  
  92.     m_Imagebmp.Load(TEXT("res\\bmp\\VIEW_BACK.bmp"));  
  93.   
  94.   
  95.     //加载 png文件  
  96.     CT2CW strFileName(TEXT("res\\png\\READY.png"));  
  97.     m_pImage=Image::FromFile((LPCWSTR)strFileName);  
  98.     //错误判断  
  99.     if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))   
  100.     {  
  101.         try { delete m_pImage; } catch (...) { assert(FALSE); } m_pImage=NULL;  
  102.         return false;  
  103.     }  
  104.   
  105.     return true;  
  106. }  
  107.   
  108.   
  109. //绘画背景  
  110. VOID DrawViewImage( HDC DC, CImage & BitImage, BYTE cbDrawMode )  
  111. {  
  112.     //获取位置  
  113.     CRect rcClient;  
  114.     GetClientRect(g_hwnd,&rcClient);  
  115.   
  116.     //无效区域  
  117.     RECT rcDirty={0};  
  118.     GetClipBox(DC,&rcDirty);  
  119.   
  120.     //绘画位图  
  121.     switch (cbDrawMode)  
  122.     {  
  123.     case DRAW_MODE_SPREAD:      //平铺模式  
  124.         {  
  125.             //加载资源  
  126.             INT nImageWidth=BitImage.GetWidth();  
  127.             INT nImageHeight=BitImage.GetHeight();  
  128.   
  129.             //绘画位图  
  130.             for (INT nXPos=0;nXPos<rcClient.right;nXPos+=nImageWidth)  
  131.             {  
  132.                 for (INT nYPos=0;nYPos<rcClient.bottom;nYPos+=nImageHeight)  
  133.                 {  
  134.                     BitImage.BitBlt(DC,nXPos,nYPos);  
  135.                 }  
  136.             }  
  137.   
  138.             return;  
  139.         }  
  140.     case DRAW_MODE_CENTENT:     //居中模式  
  141.         {  
  142.             //变量定义  
  143.             INT nImageWidth=BitImage.GetWidth();  
  144.             INT nImageHeight=BitImage.GetHeight();  
  145.   
  146.             //位置计算  
  147.             INT nXPos=(rcClient.Width()-BitImage.GetWidth())/2;  
  148.             INT nYPos=(rcClient.Height()-BitImage.GetHeight())/2;  
  149.   
  150.             //绘画位图  
  151.             BitImage.BitBlt(DC,nXPos,nYPos);  
  152.   
  153.             return;  
  154.         }  
  155.     case DRAW_MODE_ELONGGATE:   //拉伸模式  
  156.         {  
  157.             //变量定义  
  158.             INT nImageWidth=BitImage.GetWidth();  
  159.             INT nImageHeight=BitImage.GetHeight();  
  160.   
  161.             //绘画位图  
  162.             BitImage.StretchBlt(DC,0,0,rcClient.Width(),rcClient.Height(),0,0,nImageWidth,nImageHeight);  
  163.   
  164.             return;  
  165.         }  
  166.     }  
  167.   
  168.     return;  
  169. }  
  170.   
  171. //绘画PNG图像  
  172. bool DrawImagePng( HDC DC, INT nXPos, INT nYPos )  
  173. {  
  174.     //加载判断  
  175.     assert(m_pImage!=NULL);  
  176.     if (m_pImage==NULL) return false;  
  177.   
  178.     //创建屏幕  
  179.     assert(DC!=NULL);  
  180.     Graphics graphics(DC);  
  181.   
  182.     //获取属性  
  183.     INT nImageWidth=m_pImage->GetWidth();  
  184.     INT nImageHeight=m_pImage->GetHeight();  
  185.   
  186.     //构造位置  
  187.     RectF rcDrawRect;  
  188.     rcDrawRect.X=(REAL)nXPos;  
  189.     rcDrawRect.Y=(REAL)nYPos;  
  190.     rcDrawRect.Width=(REAL)nImageWidth;  
  191.     rcDrawRect.Height=(REAL)nImageHeight;  
  192.   
  193.     //绘画图像  
  194.     graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)nImageWidth,(REAL)nImageHeight,UnitPixel);  
  195.   
  196.     return true;  
  197. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值