zoukankan      html  css  js  c++  java
  • 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;
    }

    贴张图:

  • 相关阅读:
    关于BigDecimal转String的准确性问题
    MyBatis动态Sql之if标签的注意事项
    Servlet与通信协议概述
    关于ThreadLocal的那些事
    MyBatis 中 @Param 注解的四种使用场景
    Mybatis中#{}与${}的区别
    如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    jsp有哪些动作?作用分别是什么?
    forward 和redirect的区别 ?
    Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?
  • 原文地址:https://www.cnblogs.com/lichmama/p/3872002.html
Copyright © 2011-2022 走看看