C++:Win32 桌面应用程序

如果要建立视窗应用程序,必需调用WINDOWS操作系统的编程接口,因此,我们建立一个常用的API库及相应的实例。以便快捷入门。

C++ Win32 桌面应用程序的代码示例:(来源于 DEV-C++5.11 -文件 - 新建 - 项目 - Win32 - File Editor - C++ )

// main.h
#define CM_FILE_SAVEAS	9072
#define CM_FILE_EXIT	9071
#define CM_FILE_OPEN	9070
#define CM_ABOUT        9069

#define IDC_MAIN_TEXT 1001

// resource.rc
#include "main.h"

MAINMENU MENU 
{
 POPUP "&File"
 {
  MENUITEM "&Open...", CM_FILE_OPEN
  MENUITEM "Save &As...", CM_FILE_SAVEAS
  MENUITEM SEPARATOR
  MENUITEM "E&xit", CM_FILE_EXIT
 }

 POPUP "&Help"
 {
  MENUITEM "&About", CM_ABOUT
 }
}
#include <windows.h>
#include "main.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL LoadFile(HWND hEdit, LPSTR pszFileName)
{
    HANDLE hFile;
    BOOL bSuccess = FALSE;
    hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        DWORD dwFileSize;
        dwFileSize = GetFileSize(hFile, NULL);
        if(dwFileSize != 0xFFFFFFFF)
        {
            LPSTR pszFileText;
            pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
            if(pszFileText != NULL)
            {
                DWORD dwRead;
                if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
                {
                    pszFileText[dwFileSize] = 0; // Null terminator
                    if(SetWindowText(hEdit, pszFileText))
                        bSuccess = TRUE; // It worked!
                    }
                    GlobalFree(pszFileText);
                }
            }
        CloseHandle(hFile);
    }
    return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL SaveFile(HWND hEdit, LPSTR pszFileName)
{
    HANDLE hFile;
    BOOL bSuccess = FALSE;
    hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        DWORD dwTextLength;
        dwTextLength = GetWindowTextLength(hEdit);
        if(dwTextLength > 0)
        {
            LPSTR pszText;
            pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
            if(pszText != NULL)
            {
                if(GetWindowText(hEdit, pszText, dwTextLength + 1))
                {
                    DWORD dwWritten;
                    if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
                        bSuccess = TRUE;
                }
                GlobalFree(pszText);
            }
        }
        CloseHandle(hFile);
    }
    return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)
{
    OPENFILENAME ofn;
    char szFileName[MAX_PATH];
    ZeroMemory(&ofn, sizeof(ofn));
    szFileName[0] = 0;
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = "Text Files (*.txt)/0*.txt";
    ofn.lpstrFile = szFileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrDefExt = "txt";
    if(bSave)
    {
        ofn.Flags = OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
        if(GetSaveFileName(&ofn))
        {
            if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
            {
                MessageBox(hwnd, "Save file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;
            }
        }
    } else {
        ofn.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
        if(GetOpenFileName(&ofn))
        {
            if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
            {
                MessageBox(hwnd, "Load of file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
                return FALSE;
            }
        }
    }
    return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    switch(Message)
    {
        case WM_CREATE:
            CreateWindow("EDIT", "",WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|
                                    ES_MULTILINE|ES_WANTRETURN,
                                    CW_USEDEFAULT, 
                                    CW_USEDEFAULT, 
                                    CW_USEDEFAULT, 
                                    CW_USEDEFAULT,
                                    hwnd, 
                                    (HMENU)IDC_MAIN_TEXT, 
                                    GetModuleHandle(NULL), 
                                    NULL);
            SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, 
                    WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT), 
                    MAKELPARAM(TRUE,0));
            break;
        case WM_SIZE:
                if(wParam != SIZE_MINIMIZED)
                    MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, 
                        LOWORD(lParam),HIWORD(lParam), TRUE);
                break;
        case WM_SETFOCUS:
                SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
                break;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case CM_FILE_OPEN:
                    DoFileOpenSave(hwnd, FALSE);
                    break;
                case CM_FILE_SAVEAS:
                    DoFileOpenSave(hwnd, TRUE);
                    break;
                case CM_FILE_EXIT:
                    PostMessage(hwnd, WM_CLOSE, 0, 0);
                    break;
                case CM_ABOUT:
                    MessageBox (NULL, "Created using the Win32 API" , 
                            "About...", 0);
                    break;
            }
            break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = "MAINMENU";
    wc.lpszClassName = "WindowClass";
    wc.hIconSm       = LoadIcon(hInstance,"A"); /* A is name used by project icons */
    if(!RegisterClassEx(&wc))
    {
        MessageBox(0,"Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
        return 0;
    }
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","File Editor Example Program",
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                320,240,
                NULL, NULL, hInstance, NULL);
    if(hwnd == NULL)
    {
        MessageBox(0, "Window Creation Failed!", "Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
        return 0;
    }
    ShowWindow(hwnd,1);
    UpdateWindow(hwnd);
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

这个示例创建了一个简单的窗口,当窗口需要重绘时(例如窗口被移动、调整大小或首次显示时),会调用`WM_PAINT`消息处理函数,在这个函数中你可以进行绘图操作。当用户关闭窗口时,会发送`WM_DESTROY`消息,导致程序退出消息循环并结束。

C++编程API库