一个基于Win32SDK写的超简单画图板

来源:互联网 发布:淘宝上的外卖是饿了么 编辑:程序博客网 时间:2024/05/22 00:23
 
#pragma comment(linker, "/subsystem:windows")#include <windows.h>// ----------------------------------------------------------------------------static HDC g_hDC       = NULL;static HDC g_memDC     = NULL;static HBITMAP g_memBM = NULL;static POINTS g_cPointsBegin = {0};static BOOL g_bDrawEnable = FALSE;// ----------------------------------------------------------------------------static void GetCurClientSize(HWND hWnd, int& nWidth, int& nHeight){    RECT rc = {0};    GetClientRect(hWnd, &rc);    nWidth = rc.right - rc.left;    nHeight = rc.bottom - rc.top;}static void ChangeMemDCSize(HWND hWnd, HDC hDC, HDC& memDC, HBITMAP& memBM){    if ( hWnd && hDC && memDC && memBM )    {        int nWidth = 0;        int nHeight = 0;        GetCurClientSize(hWnd, nWidth, nHeight);        HDC memDCNew = CreateCompatibleDC(hDC);        HBITMAP memBMNew = CreateCompatibleBitmap(hDC, nWidth, nHeight);        HBITMAP memBMOld = (HBITMAP)SelectObject(memDCNew, memBMNew);        DeleteObject(memBMOld);        HPEN hPen = CreatePen(PS_SOLID, 0, RGB(255,255,255));        HPEN hPenOld = (HPEN)SelectObject(memDCNew, hPen);        DeleteObject(hPenOld);        HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));        HBRUSH hBrushOld = (HBRUSH)SelectObject(memDCNew, hBrush);        DeleteObject(hBrushOld);        Rectangle(memDCNew, 0, 0, nWidth, nHeight);        BitBlt(            memDCNew, 0, 0, nWidth, nHeight,            memDC, 0, 0,            SRCCOPY        );        DeleteObject(memBM);        memBM = memBMNew;        DeleteDC(memDC);        memDC = memDCNew;    }}// ----------------------------------------------------------------------------LRESULT MyInit(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    LRESULT ret = FALSE;    g_hDC = GetDC(hWnd);    if ( g_hDC != NULL )    {        g_memDC = CreateCompatibleDC(g_hDC);        if ( g_memDC != NULL )        {            int nWidth = 0;            int nHeight = 0;            GetCurClientSize(hWnd, nWidth, nHeight);            g_memBM = CreateCompatibleBitmap(g_hDC, nWidth, nHeight);            if ( g_memBM != NULL )            {                HBITMAP memBMOld = (HBITMAP)SelectObject(g_memDC, g_memBM);                DeleteObject(memBMOld);                SendMessage(hWnd, WM_KEYDOWN, VK_F1, 0);                ret = TRUE;            }        }    }    return ret;}LRESULT UnInit(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    if ( g_memBM != NULL )    {        DeleteObject(g_memBM);        g_memBM = NULL;    }    if ( g_memDC != NULL )    {        DeleteDC(g_memDC);        g_memDC = NULL;    }    if ( g_hDC != NULL )    {        ReleaseDC(hWnd, g_hDC);        g_hDC = NULL;    }    return TRUE;}// ----------------------------------------------------------------------------LRESULT OnLButtonDown(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    g_cPointsBegin = MAKEPOINTS(lParam);    g_bDrawEnable = TRUE;    SetCapture(hWnd);    return TRUE;}LRESULT OnMouseMove(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    if ( MK_LBUTTON == wParam )    {        if ( g_bDrawEnable )        {            POINTS pt = {0};            pt = MAKEPOINTS(lParam);            SendMessage(hWnd, WM_PAINT, 0, 0);            MoveToEx(g_hDC, g_cPointsBegin.x, g_cPointsBegin.y, NULL);            LineTo(g_hDC, pt.x, pt.y);        }    }    return TRUE;}LRESULT OnLButtonUp(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    if ( TRUE == g_bDrawEnable )    {        g_bDrawEnable = FALSE;        POINTS pt = {0};        pt = MAKEPOINTS(lParam);        HPEN hPen = CreatePen(PS_SOLID, 0, RGB(0,255,0));        HPEN hPenOld = (HPEN)SelectObject(g_memDC, hPen);        MoveToEx(g_memDC, g_cPointsBegin.x, g_cPointsBegin.y, NULL);        LineTo(g_memDC, pt.x, pt.y);        SelectObject(g_memDC, hPenOld);        DeleteObject(hPen);        SendMessage(hWnd, WM_PAINT, 0, 0);    }    ReleaseCapture();    return TRUE;}// ----------------------------------------------------------------------------LRESULT OnKeyDown(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    if ( VK_F1 == wParam )    {        if ( g_memDC != NULL )        {            int nWidth = 0;            int nHeight = 0;            GetCurClientSize(hWnd, nWidth, nHeight);            HPEN hPen = CreatePen(PS_SOLID, 0, RGB(255,255,255));            HPEN hPenOld = (HPEN)SelectObject(g_memDC, hPen);            HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));            HBRUSH hBrushOld = (HBRUSH)SelectObject(g_memDC, hBrush);            Rectangle(g_memDC, 0, 0, nWidth, nHeight);            SelectObject(g_memDC, hPenOld);            DeleteObject(hPen);            SelectObject(g_memDC, hBrushOld);            DeleteObject(hBrush);            InvalidateRect(hWnd, NULL, TRUE);        }    }    else if ( VK_ESCAPE == wParam )    {        SendMessage(hWnd, WM_CLOSE, 0, 0);    }    return TRUE;}// ----------------------------------------------------------------------------LRESULT OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    return MyInit(hWnd, message, wParam, lParam);}LRESULT OnClose(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    UnInit(hWnd, message, wParam, lParam);    DestroyWindow(hWnd);    return TRUE;}LRESULT OnSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    if ( SIZE_MINIMIZED != wParam )    {        ChangeMemDCSize(hWnd, g_hDC, g_memDC, g_memBM);    }    return TRUE;}LRESULT OnPaint(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    if ( g_hDC != NULL && g_memDC != NULL )    {        int nWidth = 0;        int nHeight = 0;        GetCurClientSize(hWnd, nWidth, nHeight);        BitBlt(            g_hDC, 0, 0, nWidth, nHeight,            g_memDC, 0, 0,            SRCCOPY        );    }    return TRUE;}LRESULT OnOtherMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    switch (message)    {    case WM_LBUTTONDOWN:        OnLButtonDown(hWnd, message, wParam, lParam);        break;    case WM_MOUSEMOVE:        OnMouseMove(hWnd, message, wParam, lParam);        break;    case WM_LBUTTONUP:        OnLButtonUp(hWnd, message, wParam, lParam);        break;    case WM_KEYDOWN:        OnKeyDown(hWnd, message, wParam, lParam);        break;    }    return TRUE;}// ----------------------------------------------------------------------------LRESULT CALLBACK MainWndProc(    HWND hWnd,    UINT message,    WPARAM wParam,    LPARAM lParam){    switch (message)    {    case WM_CREATE:        if ( TRUE != OnCreate(hWnd, message, wParam, lParam) )        {            SendMessage(hWnd, WM_CLOSE, 0, 0);        }        break;    case WM_CLOSE:        OnClose(hWnd, message, wParam, lParam);        break;    case WM_SIZE:        OnSize(hWnd, message, wParam, lParam);        break;    case WM_PAINT:        OnPaint(hWnd, message, wParam, lParam);        break;    case WM_DESTROY:        PostQuitMessage(0);        break;    default:        OnOtherMessage(hWnd, message, wParam, lParam);        break;    }    return DefWindowProc(hWnd, message, wParam, lParam);}// ----------------------------------------------------------------------------int WINAPI WinMain(    HINSTANCE hInstance,    HINSTANCE hPrevInstance,    LPSTR lpCmdLine,    int nCmdShow){    MSG msg;    BOOL bRet;    WNDCLASS wc;    UNREFERENCED_PARAMETER(lpCmdLine);    // Register the main window class.    wc.style = CS_HREDRAW | CS_VREDRAW;    wc.lpfnWndProc = (WNDPROC)MainWndProc;    wc.cbClsExtra = 0;    wc.cbWndExtra = 0;    wc.hInstance = hInstance;    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);    wc.hCursor = LoadCursor(NULL, IDC_ARROW);    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    wc.lpszMenuName =  NULL;    wc.lpszClassName = "MyDraw";    if ( !RegisterClass(&wc) )    {        return FALSE;    }    HWND hWnd = CreateWindow(                    wc.lpszClassName,                    "画图板",                    WS_OVERLAPPEDWINDOW,                    CW_USEDEFAULT, CW_USEDEFAULT,                    CW_USEDEFAULT, CW_USEDEFAULT,                    NULL, NULL, hInstance, NULL                );    if ( NULL == hWnd )    {        return FALSE;    }    ShowWindow(hWnd, nCmdShow);    UpdateWindow(hWnd);    while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 )    {        if ( -1 == bRet )        {            // handle the error and possibly exit            return FALSE;        }        else        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }    }    // Return the exit code to the system.    return msg.wParam;}