C++ win32 开发 GDIPlus 贴图

// 使用说明 需要附加入库 Gdiplus.lib

//  需要使用三张图片  分别命名 2.png 3.png 9.png

// 使用VC 或vs 创建空项目win32 ,添加文件winmain.cpp ,把下面内容加到文件中

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <gdiplus.h>

bool m_bTest = true;

WCHAR strImgName[100];

int m_number = 0;

/*  GDI+ startup token */  
ULONG_PTR gdiplusStartupToken;  

PAINTSTRUCT ps; // 点结构

int m_waveData[300];

//消息回调函数,包含界面消息
LRESULT CALLBACK MyWindowProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    );


//主函数入口
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR    lpCmdLine,
    int       nCmdShow)
{

    /*初始化GDIpuls*/  
    Gdiplus::GdiplusStartupInput gdiInput;  
    Gdiplus::GdiplusStartup(&gdiplusStartupToken,&gdiInput,NULL);  

    //初始化图片名称

    wcscpy(strImgName,L"2.png");

    WNDCLASS wndclass; //窗体类
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
    wndclass.hCursor = LoadCursor( 0, IDC_HAND );
    wndclass.hIcon = LoadIcon( 0, IDI_INFORMATION );
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = MyWindowProc;
    wndclass.lpszClassName = TEXT("hg");
    wndclass.lpszMenuName = NULL;
    wndclass.style = CS_HREDRAW | CS_VREDRAW ;    // 指定窗体风格
    //注册类
    if (!RegisterClass( &wndclass ) )
    {
        MessageBox( 0, TEXT("reg err"), TEXT("reg err"), 0 );
    }
    //创建窗体
    HWND hwnd = CreateWindow( TEXT("hg"), TEXT("Helloworldhhh"), WS_OVERLAPPEDWINDOW, 0, 0, 1024, 768, NULL,NULL,hInstance, NULL );
    if ( !hwnd)
    {
        MessageBox( hwnd, TEXT("create windows err"), TEXT("create windows err"), 0 );
    }
    //显示窗体
    ShowWindow( hwnd, SW_SHOW );
    UpdateWindow( hwnd );

    MSG msg;
    //消息处理
    while ( GetMessage( &msg, 0, 0, 0 ) )
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }

    return 0;
}

LRESULT CALLBACK MyWindowProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    int wmId, wmEvent;

    switch ( uMsg )
    {
    case WM_CLOSE:
        {
            Gdiplus::GdiplusShutdown(gdiplusStartupToken);
            PostQuitMessage(0);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_RBUTTONDBLCLK:  //鼠标右击
        //MessageBox(NULL,"dd","ss",MB_OK);
        //DestroyWindow(hwnd);
        break;
    case WM_LBUTTONDOWN: //鼠标左击  切换显示图片
        if(m_bTest)
        {
            wcscpy(strImgName,L"3.png");
            m_bTest = false;
        }else
        {
            wcscpy(strImgName,L"2.png");
            m_bTest = true;
        }
        
        RedrawWindow(hwnd,NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW);
        
        break;
    case WM_KEYDOWN:  //键盘消息
        {
            switch(wParam)
            {
            case VK_LEFT:   //左击
                {
                    wcscpy(strImgName,L"3.png");
                }
                break;
            case VK_RIGHT: //右击
                {
                    wcscpy(strImgName,L"2.png");
                }
                break;
            case VK_ESCAPE:
                {
                    Gdiplus::GdiplusShutdown(gdiplusStartupToken);
                    PostQuitMessage(0);
                }
                break;
            }
            //有界面修改时,执行更新重画,切记勿重画背景
            RedrawWindow(hwnd,NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW);
        }
        break;
    case WM_PAINT:
        {

            HDC hdc; // DC句柄
            HPEN hPen; // 笔句柄
            HPEN hPenOld; // 用于保存原笔的句柄
            hdc = BeginPaint (hwnd , &ps); // 获得DC句柄,开始绘制,其中hWnd为窗口句柄

            using namespace Gdiplus;   // 加入命名空间

            RECT rc;
            GetClientRect(hwnd,&rc);
            Bitmap bmp(int(rc.right),int(rc.bottom));

            Graphics bmpGraphics(&bmp);
            bmpGraphics.SetSmoothingMode(SmoothingModeAntiAlias);

            /*Drawing on bitmap*/
            //SolidBrush bkBrush(Color(0,0,0));
            //bmpGraphics.FillRectangle(&bkBrush,0,0,rc.right,rc.bottom);

            Gdiplus::Image image2(L"9.png");

            Gdiplus::Image image(strImgName);
            
            Gdiplus::Graphics graphics(hdc);  
            

            bmpGraphics.DrawImage(&image2,0,0,600,400);
            bmpGraphics.DrawImage(&image,100,100,300,100);

            /*Important! Create a CacheBitmap object for quick drawing*/


            bmpGraphics.DrawImage(&image2,0,0,600,400);
            bmpGraphics.DrawImage(&image,100,100,300,100);

            Gdiplus::FontFamily fontFamily(L"Times New Roman"); // 创建字体族对象


            Gdiplus::Font font(&fontFamily, 20); // 创建5号字大小的Times New Roman字体

            Gdiplus::SolidBrush brush(Gdiplus::Color(255, 128, 50)); // 创建绿色的实心刷(写字符串用)
            
            for(int i=0;i<4;i++)
            {
                bmpGraphics.DrawString(strImgName, -1 ,&font,Gdiplus::PointF(400, 110 *i + 20), &brush);
            }
            
             CachedBitmap cachedBmp(&bmp,&graphics);

            // 在此处一并提交,以免出现屏幕闪烁

            graphics.DrawCachedBitmap(&cachedBmp,0,0);


            Gdiplus::Pen myPen(Gdiplus::Color(255, 128, 50));

            //for(int i=0;i<300;i++)
            //{
             //   graphics.DrawLine(&myPen,0,0,300,200);
            //}

            hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0) ); // 创建红色画笔,宽3
            hPenOld = (HPEN)SelectObject(hdc, hPen); // 选笔入DC
            MoveToEx(hdc, 20, 10, NULL); // 最后一个参数是返回用的旧当前点的结构指针
            //LineTo(hdc, 200, 100) ; // 画线

            DeleteObject(hPen); // 删除创建的笔

            EndPaint(hwnd, &ps) ; // 绘制结束

        }
        break;
    //case WM_ERASEBKGND:
    //    break;
    default:
        return DefWindowProc( hwnd, uMsg, wParam, lParam );
    }
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值