win32SDK的hello,world程序

首次用Code::Blocks写Win32GUI程序,关于GDI+的引用摸索了半天。SDK写GUI比较累人,以后还是考虑Qt或者其他方式。

代码:

/**
*code by lichmama from cnblogs.com
*@platform: code::blocks 13.12/windows xp
*/
#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

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

#define BUTTON 101
#define WS_EX_LAYERED 0x80000
#define GWL_EXSTYLE  (-20)
#define LWA_ALPHA 2
#define SC_DRAGMOVE  0xF012

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
typedef BOOL (WINAPI *PFSLWA) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
PFSLWA SetLayeredWindowAttributes;

/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           NULL, //_T("Code::Blocks Template Windows App"),       /* Title Text */
           WS_POPUP, //WS_OVERLAPPEDWINDOW, /* default window */
           300,       /* Windows decides the position */
           100,       /* where the window ends up on the screen */
           770,                 /* The programs width */
           512,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */

    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartupInput gdiplusInput;
    GdiplusStartup(&gdiplusToken, &gdiplusInput, NULL);
    ShowWindow(hwnd, nCmdShow);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    Gdiplus::GdiplusShutdown(gdiplusToken);
    return messages.wParam;
}

/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            //SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_CAPTION);
            //SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME);
            SetWindowRgn(hwnd, CreateRoundRectRgn(0,0,770,512,15,15), TRUE);
            SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE)|WS_EX_LAYERED);
            {
                HMODULE hmod;
                hmod=(HMODULE)LoadLibrary("user32.dll");
                SetLayeredWindowAttributes=(PFSLWA)GetProcAddress(hmod, "SetLayeredWindowAttributes");
                SetLayeredWindowAttributes(hwnd, 0, 220, LWA_ALPHA);
                CloseHandle(hmod);
            }
            break;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HBITMAP hbmp;
                BITMAP bmp;
                HDC hmemdc;
                HDC hdc;
                BeginPaint(hwnd, &ps);
                hdc=GetWindowDC(hwnd);
                hbmp=(HBITMAP)LoadImage(NULL,
                    "D:\12.bmp",
                    IMAGE_BITMAP,
                    0,
                    0,
                    LR_DEFAULTSIZE|LR_LOADFROMFILE);
                GetObject(hbmp, sizeof(bmp), &bmp);
                hmemdc=CreateCompatibleDC(NULL);
                SelectObject(hmemdc, hbmp);
                BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hmemdc, 0, 0, SRCCOPY);
                DeleteObject(hbmp);
                DeleteDC(hmemdc);
                ReleaseDC(hwnd, hdc);
                EndPaint(hwnd, &ps);
            }

            {
                PAINTSTRUCT ps;
                HDC hdc;
                UINT width;
                UINT height;
                WCHAR file[]={L"D:\3.png"};
                BeginPaint(hwnd, &ps);
                hdc=GetWindowDC(hwnd);
                Gdiplus::GpImage *image;
                Gdiplus::GpGraphics *graphics;
                Gdiplus::DllExports::GdipLoadImageFromFile(file, &image);
                Gdiplus::DllExports::GdipCreateFromHDC(hdc, &graphics);
                Gdiplus::DllExports::GdipGetImageWidth(image, &width);
                Gdiplus::DllExports::GdipGetImageHeight(image, &height);
                Gdiplus::DllExports::GdipDrawImageRect(graphics, image, 700, 10, width*0.1, height*0.1);
                Gdiplus::DllExports::GdipDisposeImage(image);
                Gdiplus::DllExports::GdipDeleteGraphics(graphics);
                ReleaseDC(hwnd, hdc);
                EndPaint(hwnd, &ps);
            }
            break;
        case WM_LBUTTONDOWN:
            {
                 //(700,10)-(751.61)
                UINT cx=LOWORD(lParam);
                UINT cy=HIWORD(lParam);
                if(cx>=700 && cx<=751){
                    if(cy>=10 && cy<=61){
                        if(MessageBox(hwnd, "你希望退出程序么?", "MessageBox", MB_YESNO)==IDYES)DestroyWindow(hwnd);
                        break;
                    }
                }
            }
            SendMessage(hwnd,WM_SYSCOMMAND,SC_DRAGMOVE,0);
            break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

贴张图:

原文地址:https://www.cnblogs.com/lichmama/p/3872002.html