Win32 SDK显示图像(GDI+)

  刚学了GDI+, 发现显示图片很方便, 以前用OleLoadPicture+IPicture接口显示, 别提有多
悲剧了, 现在学了GDI+, 太方便友好了, 哈哈~

  提供一个GDI+显示图片的示例供那些不知道怎么用Win32SDK显示图片的新手程序猿们一快速简单的方法.

  程序工作方式, 程序启动后, 任意拖动一张图片到窗口即可显示图像, 格式包括但不限于JPG,BMP,PNG,...

  预览:
  




  程序代码:  

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

#pragma comment(lib,"gdiplus")

using namespace Gdiplus;

//根据图片的宽度和高度更新窗口客户区的大小
void set_window_size(HWND hWnd,int width,int height)
{
    RECT rcWindow,rcClient;
    int border_width,border_height;

    GetWindowRect(hWnd,&rcWindow);
    GetClientRect(hWnd,&rcClient);

    border_width = (rcWindow.right-rcWindow.left) - (rcClient.right-rcClient.left);
    border_height = (rcWindow.bottom-rcWindow.top) - (rcClient.bottom-rcClient.top);

    SetWindowPos(hWnd,0,0,0,border_width+width,border_height+height,SWP_NOMOVE|SWP_NOZORDER);
}

void draw_image(HWND hWnd,wchar_t* file)
{
    HDC hdc;
    int width,height;

    //加载图像
    Image image(file);
    if(image.GetLastStatus() != Status::Ok){
        MessageBox(hWnd,"图片无效!",NULL,MB_OK);
        return;
    }
    
    //取得宽度和高度
    width = image.GetWidth();
    height = image.GetHeight();

    //更新窗口大小
    set_window_size(hWnd,width,height);

    hdc = GetDC(hWnd);

    //绘图
    Graphics graphics(hdc);
    graphics.DrawImage(&image,0,0,width,height);

    ReleaseDC(hWnd,hdc);

    return;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_DROPFILES://拖动图片文件时进行图像显示
        {
            wchar_t file[MAX_PATH];
            DragQueryFileW((HDROP)wParam,0,file,sizeof(file)/sizeof(*file));
            draw_image(hWnd,file);
            DragFinish((HDROP)wParam);
            return 0;
        }
    case WM_LBUTTONDOWN://左键单击时拖动窗体
        SendMessage(hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0);
        return 0;
    case WM_CREATE:
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    MSG msg;
    WNDCLASSEX wce={0};
    HWND hWnd;

    wce.cbSize = sizeof(wce);
    wce.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wce.hCursor = LoadCursor(NULL,IDC_ARROW);
    wce.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wce.hInstance = hInstance;
    wce.lpfnWndProc = WndProc;
    wce.lpszClassName = "MyClassName";
    wce.style = CS_HREDRAW|CS_VREDRAW;
    if(!RegisterClassEx(&wce))
        return 1;

    char* title = "Win32SDK GDI+ 图像显示示例程序(拖动图片文件到窗口以显示)";
    hWnd = CreateWindowEx(0,"MyClassName",title,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        NULL,NULL,hInstance,NULL);
    if(hWnd == NULL)
        return 1;

    //GdiPlus初始化
    ULONG_PTR gdiplusToken;
    GdiplusStartupInput gdiplusInput;
    GdiplusStartup(&gdiplusToken,&gdiplusInput,NULL);

    //窗口接收文件拖放
    DragAcceptFiles(hWnd,TRUE);

    ShowWindow(hWnd,nShowCmd);
    UpdateWindow(hWnd);

    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    //GdiPlus 取消初始化
    GdiplusShutdown(gdiplusToken);

    return msg.wParam;
}



示例项目下载(VS2012):https://files.cnblogs.com/nbsofer/show_pic.7z

女孩不哭 @ 2013-06-26 21:44:56 @ http://www.cnblogs.com/nbsofer


posted @ 2012-05-12 11:29  女孩不哭  阅读(6768)  评论(1编辑  收藏  举报