超强MDI

main.cpp:

#include <windows.h>
#include <commctrl.h>
#include<stdlib.h>
#include<cstring>

#include "main.h"

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam,LPARAM lParam);

char g_szAppName[] = "MyMDIWindow";
char g_szChild[] = "MyMDIChild";
HINSTANCE g_hInst;int closef=1;
HWND g_hMDIClient, g_hStatusBar, g_hToolBar;
HWND g_hMainWindow;

BOOL LoadFile(HWND hEdit, LPSTR pszFileName) {
    HANDLE hFile;
    BOOL bSuccess = FALSE;
    
    hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 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, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if(hFile != INVALID_HANDLE_VALUE) {
        DWORD dwTextLength;
        dwTextLength = GetWindowTextLength(hEdit);
        if(dwTextLength > 0) {// No need to bother if there's no text.    
            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 GetFileName(HWND hwnd, LPSTR pszFileName, BOOL bSave) {
    OPENFILENAME ofn;
    
    ZeroMemory(&ofn, sizeof(ofn));
    pszFileName[0] = 0;
    
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = "文本文档(*.txt)\0*.txt\0文本文档(*.log)\0*.log\0C++源文件(*.cpp)\0*.cpp\0C源文件(*.c)\0*.c\0Visual Basic 脚本语言(*.vbs)\0*.vbs\0源文件语言(*.h)\0*.h\0超文本标记语言(*.html)\0*.html\0All Files (*.*)\0*.*\0\0\0\0\0\0\0";
    ofn.lpstrFile = pszFileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrDefExt = "txt\0log\0cpp\0c\0vbs\0h\0html\0\0\0\0\0\0";
    
    if(bSave) {
        ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
        OFN_OVERWRITEPROMPT;
        if(!GetSaveFileName(&ofn))
            return FALSE;
    } else {
        ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
        if(!GetOpenFileName(&ofn))
            return FALSE;
    }
    return TRUE;
}
int s=1;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdParam, int nCmdShow) {
    MSG  Msg;
    WNDCLASSEX WndClassEx;
    
    g_hInst = hInstance;
    
    WndClassEx.cbSize          = sizeof(WNDCLASSEX);
    WndClassEx.style           = CS_HREDRAW | CS_VREDRAW;
    WndClassEx.lpfnWndProc     = WndProc;
    WndClassEx.cbClsExtra      = 0;
    WndClassEx.cbWndExtra      = 0;
    WndClassEx.hInstance       = hInstance;
    WndClassEx.hIcon           = LoadIcon(NULL, IDI_APPLICATION);
    WndClassEx.hCursor         = LoadCursor(NULL, IDC_NO);
    WndClassEx.hbrBackground   = (HBRUSH)(COLOR_3DSHADOW+1);
    WndClassEx.lpszMenuName    = "MAIN";
    WndClassEx.lpszClassName   = g_szAppName;
    WndClassEx.hIconSm         = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&WndClassEx)) {
        MessageBox(0, "Could Not Register Window", "Oh Oh...",MB_ICONEXCLAMATION | MB_OK);
        return -1;
    }
    
HWND hWndMgr;


    WndClassEx.lpfnWndProc     = MDIChildWndProc;
    WndClassEx.lpszMenuName    = NULL;
    WndClassEx.lpszClassName   = g_szChild;
    WndClassEx.hbrBackground   = (HBRUSH)(COLOR_3DFACE+1);

    if(!RegisterClassEx(&WndClassEx)) {
        MessageBox(0, "Could Not Register Child Window", "Oh Oh...",
        MB_ICONEXCLAMATION | MB_OK);
        return -1;
    }

    g_hMainWindow = CreateWindowEx(WS_EX_APPWINDOW,g_szAppName,"MDI 万能编辑器",WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_CLIPCHILDREN,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        900,500,
        0, 0, hInstance, NULL);
    
    if (g_hMainWindow == NULL){
        MessageBox(0, "No Window", "Oh Oh...", MB_ICONEXCLAMATION | MB_OK);
        return -1;
    }

    ShowWindow(g_hMainWindow, nCmdShow);
    UpdateWindow(g_hMainWindow);
    MDICREATESTRUCT mcs;
                    HWND hChild;
                    
                    mcs.szTitle = "[未命名]";
                    mcs.szClass = g_szChild;
                    mcs.hOwner  = g_hInst;
                    mcs.x = mcs.cx = CW_USEDEFAULT;
                    mcs.y = mcs.cy = CW_USEDEFAULT;
                    mcs.style = MDIS_ALLCHILDSTYLES;
                    
                    hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE,0, (LPARAM)&mcs);
                    if(!hChild) {
                        MessageBox(g_hMainWindow, "MDI Child creation failed.", "Oh Oh...",MB_ICONEXCLAMATION | MB_OK);
                    }
    while(GetMessage(&Msg, NULL, 0, 0)) {
        if (!TranslateMDISysAccel(g_hMDIClient, &Msg)) {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
    }
    return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch(Message) {
        case WM_CREATE: {
            SendMessage(hwnd,CM_FILE_NEW,0,0);
            CLIENTCREATESTRUCT ccs;
            int iStatusWidths[] = {200, 300, -1};
            TBADDBITMAP tbab;
            TBBUTTON tbb[13];

            // Find window menu where children will be listed
            
            ccs.hWindowMenu  = GetSubMenu(GetMenu(hwnd), 2);
            ccs.idFirstChild = ID_MDI_FIRSTCHILD;
            g_hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE, "mdiclient", NULL,
            WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            hwnd, (HMENU)ID_MDI_CLIENT, g_hInst, (LPVOID)&ccs);
            ShowWindow(g_hMDIClient, SW_SHOW);
            
            g_hStatusBar = CreateWindowEx(0, STATUSCLASSNAME, NULL,
            WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0,
            hwnd, (HMENU)ID_STATUSBAR, g_hInst, NULL);
            SendMessage(g_hStatusBar, SB_SETPARTS, 3, (LPARAM)iStatusWidths);
            SendMessage(g_hStatusBar, SB_SETTEXT, 2, (LPARAM)"Toolbar & Statusbar Example");
            
            g_hToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
            WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
            hwnd, (HMENU)ID_TOOLBAR, g_hInst, NULL);
            
            // Send the TB_BUTTONSTRUCTSIZE message, which is required for
            // backward compatibility.
            SendMessage(g_hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
            
            tbab.hInst = HINST_COMMCTRL;
            tbab.nID = IDB_STD_SMALL_COLOR;
            SendMessage(g_hToolBar, TB_ADDBITMAP, 0, (LPARAM)&tbab);
            
            ZeroMemory(tbb, sizeof(tbb));
            
            tbb[0].iBitmap = STD_FILENEW;
            tbb[0].fsState = TBSTATE_ENABLED;
            tbb[0].fsStyle = TBSTYLE_BUTTON;
            tbb[0].idCommand = CM_FILE_NEW;
            
            tbb[1].iBitmap = STD_FILEOPEN;
            tbb[1].fsState = TBSTATE_ENABLED;
            tbb[1].fsStyle = TBSTYLE_BUTTON;
            tbb[1].idCommand = CM_FILE_OPEN;
            
            tbb[2].iBitmap = STD_FILESAVE;
            tbb[2].fsStyle = TBSTYLE_BUTTON;
            tbb[2].idCommand = CM_FILE_SAVE;
            
            tbb[3].fsStyle = TBSTYLE_SEP;
            
            tbb[4].iBitmap = STD_CUT;
            tbb[4].fsStyle = TBSTYLE_BUTTON;
            tbb[4].idCommand = CM_EDIT_CUT;
            
            tbb[5].iBitmap = STD_COPY;
            tbb[5].fsStyle = TBSTYLE_BUTTON;
            tbb[5].idCommand = CM_EDIT_COPY;
            
            tbb[6].iBitmap = STD_PASTE;
            tbb[6].fsStyle = TBSTYLE_BUTTON;
            tbb[6].idCommand = CM_EDIT_PASTE;
            
            tbb[7].fsStyle = TBSTYLE_SEP;
            
            tbb[8].iBitmap = STD_UNDO;
            tbb[8].fsStyle = TBSTYLE_BUTTON;
            tbb[8].idCommand = CM_EDIT_UNDO;
            
            tbb[9].fsStyle = TBSTYLE_SEP;
            
            tbb[10].iBitmap = STD_DELETE;
            tbb[10].fsState = TBSTATE_ENABLED;
            tbb[10].fsStyle = TBSTYLE_BUTTON;
            tbb[10].idCommand = CM_CTW;
            
            tbb[11].fsStyle = TBSTYLE_SEP;
            
            tbb[12].iBitmap = STD_HELP;
            tbb[12].fsState = TBSTATE_ENABLED;
            tbb[12].fsStyle = TBSTYLE_BUTTON;
            tbb[12].idCommand = CM_HRL;
            
            SendMessage(g_hToolBar, TB_ADDBUTTONS, 13, (LPARAM)&tbb);
            return 0;
        }//STD_HELP
        case WM_COMMAND: {
            switch(LOWORD(wParam)) {
                case CM_FILE_EXIT:
                    PostMessage(hwnd, WM_CLOSE, 0, 0);
                    break;
                case CM_FILE_NEW: {
                    MDICREATESTRUCT mcs;
                    HWND hChild;
                    
                    mcs.szTitle = "[未命名]";
                    mcs.szClass = g_szChild;
                    mcs.hOwner  = g_hInst;
                    mcs.x = mcs.cx = CW_USEDEFAULT;
                    mcs.y = mcs.cy = CW_USEDEFAULT;
                    mcs.style = MDIS_ALLCHILDSTYLES;
                    
                    hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE,0, (LPARAM)&mcs);
                    if(!hChild) {
                        MessageBox(hwnd, "MDI Child creation failed.", "Oh Oh...",MB_ICONEXCLAMATION | MB_OK);
                    }
                    break;
                }
                case PROJECT:{
                    char ExeFile[2000],klg[5000]="start ";
                    GetModuleFileName(NULL,ExeFile,200);
                    strcat(klg,ExeFile);system(klg);
                    break;
                }
                case CM_EXTT:{
                    char ExeFile[2000],klg[5000]="start ";
                    GetModuleFileName(NULL,ExeFile,200);
                    strcat(klg,ExeFile);system(klg);
                    DestroyWindow(hwnd);
                    break;
                }
                case SWHIDE:
                    ShowWindow(hwnd,SW_HIDE);
                    MessageBox(NULL,"","点我回复",MB_TOPMOST);
                    ShowWindow(hwnd,SW_SHOW);
                    break;
                case CM_CLOSEF:{
                    closef=0;
                    break;
                }
                case fgsv:{
                    closef=546;
                    break;
                }
                case CM_CLOSET:{
                    closef=1;
                    break;
                }
                case CM_TOPMOST:
                    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 100, 100, SWP_NOMOVE | SWP_NOSIZE);
                    break;
                case CM_NOTOPMOST:
                    SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 100, 100, SWP_NOMOVE | SWP_NOSIZE);
                    SetWindowPos(hwnd, HWND_TOP, 0, 0, 100, 100, SWP_NOMOVE | SWP_NOSIZE);
                    break;
                case CM_BOTTOM:
                    SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 100, 100, SWP_NOMOVE | SWP_NOSIZE);
                    break;
                 case SHUTDOWN:
                    if(MessageBox(NULL,"是否关机?","MENZ",MB_YESNO)==6) system("shutdown -s -t 0"); 
                    break;
                case RES:
                    if(MessageBox(NULL,"是否重启?","MENZ",MB_YESNO)==6) system("shutdown -r -t 0");
                    break;
                case DESKCPL:
                    system("start desk.cpl");
                    break;
                case CMD:
                    system("start");
                    break;
                case EXPLORER:
                    system("start explorer");
                    break;
                case CALC:
                    system("start calc");
                    break;
                case CM_HRL:{
                    MessageBox(hwnd,"版本 15.0.3\nMDI 万能编辑器\n版权所有,仿照必究。","关于...",MB_OK);
                    break;
                }
                case CM_FILE_OPEN: {
                    MDICREATESTRUCT mcs;
                    HWND hChild;
                    char szFileName[MAX_PATH];
                    
                    if(!GetFileName(hwnd, szFileName, FALSE))
                        break;

                    mcs.szTitle = szFileName;
                    mcs.szClass = g_szChild;
                    mcs.hOwner  = g_hInst;
                    mcs.x = mcs.cx = CW_USEDEFAULT;
                    mcs.y = mcs.cy = CW_USEDEFAULT;
                    mcs.style = MDIS_ALLCHILDSTYLES;

                    hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);

                    if(!hChild) {
                        MessageBox(hwnd, "MDI Child creation failed.", "Oh Oh...",
                        MB_ICONEXCLAMATION | MB_OK);
                    }
                    break;
                }
                case CM_WINDOW_TILEHORZ:
                    PostMessage(g_hMDIClient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
                    break;
                case CM_WINDOW_TILEVERT:
                    PostMessage(g_hMDIClient, WM_MDITILE, MDITILE_VERTICAL, 0);
                    break;
                case CM_WINDOW_CASCADE:
                    PostMessage(g_hMDIClient, WM_MDICASCADE, 0, 0);
                    break;
                case CM_WINDOW_ARRANGE:
                    PostMessage(g_hMDIClient, WM_MDIICONARRANGE, 0, 0);
                    break;
                default: {
                    if(LOWORD(wParam) >= ID_MDI_FIRSTCHILD){
                        DefFrameProc(hwnd, g_hMDIClient, Message, wParam, lParam);
                    } else {
                        HWND hChild;
                        hChild = (HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE,0,0);
                        if(hChild){
                            SendMessage(hChild, WM_COMMAND, wParam, lParam);
                        }
                    }
                }
            }
            break;
        }
        case WM_SIZE: {
            RECT rectClient, rectStatus, rectTool;
            UINT uToolHeight, uStatusHeight, uClientAlreaHeight;
            
            SendMessage(g_hToolBar, TB_AUTOSIZE, 0, 0);
            SendMessage(g_hStatusBar, WM_SIZE, 0, 0);
            
            GetClientRect(hwnd, &rectClient);
            GetWindowRect(g_hStatusBar, &rectStatus);
            GetWindowRect(g_hToolBar, &rectTool);
            
            uToolHeight = rectTool.bottom - rectTool.top;
            uStatusHeight = rectStatus.bottom - rectStatus.top;
            uClientAlreaHeight = rectClient.bottom;
            
            MoveWindow(g_hMDIClient, 0, uToolHeight, rectClient.right, uClientAlreaHeight - uStatusHeight - uToolHeight, TRUE);
            break;
        }
        case WM_CLOSE:
            if(closef==546){
                if(MessageBox(NULL,"是否关闭?","问题",MB_YESNO)==6){
                    DestroyWindow(hwnd);
                    return 0;
                }
            }
            else if(closef) DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefFrameProc(hwnd, g_hMDIClient, Message, wParam, lParam);
    }
    return 0;
}

LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam,LPARAM lParam) {
    if(s==0){
        PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(CM_FILE_SAVE, 0), 0);
        return 0;
    }
    switch(Message) {
        case WM_CREATE: {
            char szFileName[MAX_PATH];
            HWND hEdit;
            
            hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            hwnd, (HMENU)IDC_CHILD_EDIT, g_hInst, NULL);
            
            SendMessage(hEdit, WM_SETFONT,
            (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
            
            GetWindowText(hwnd, szFileName, MAX_PATH);
            if(*szFileName != '[') {
                if(!LoadFile(hEdit, szFileName)) {
                    MessageBox(hwnd, "Couldn't Load File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
                    return -1; //cancel window creation
                }
            }
            break;
        }
        case WM_SIZE:
            if(wParam != SIZE_MINIMIZED)
                MoveWindow(GetDlgItem(hwnd, IDC_CHILD_EDIT), 0, 0, LOWORD(lParam),HIWORD(lParam), TRUE);
            break;
             
        case WM_MDIACTIVATE: {
            char gf[50000],gfs[50000]="MDI 万能编辑器 - ( ";
            GetWindowText(hwnd,gf,50000);
            strcat(gfs,gf);
            strcat(gfs," )");
            SetWindowText(g_hMainWindow,gfs); 
            HMENU hMenu, hFileMenu;
            BOOL EnableFlag;
            char szFileName[MAX_PATH];
            
            hMenu = GetMenu(g_hMainWindow);
            if(hwnd == (HWND)lParam){      //being activated
                EnableFlag = TRUE;
            } else{
                EnableFlag = FALSE;    //being de-activated
            }
            EnableMenuItem(hMenu, 1, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
            EnableMenuItem(hMenu, 2, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
            
            hFileMenu = GetSubMenu(hMenu, 0);
            EnableMenuItem(hFileMenu, CM_FILE_SAVE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
            EnableMenuItem(hFileMenu, CM_FILE_SAVEAS, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
            
            DrawMenuBar(g_hMainWindow);
            
            SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_FILE_SAVE, MAKELONG(EnableFlag, 0));
            SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_UNDO, MAKELONG(EnableFlag, 0));
            SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_CUT, MAKELONG(EnableFlag, 0));
            SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_COPY, MAKELONG(EnableFlag, 0));
            SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_PASTE, MAKELONG(EnableFlag, 0));
            
            GetWindowText(hwnd, szFileName, MAX_PATH);
            SendMessage(g_hStatusBar, SB_SETTEXT, 0, (LPARAM)(EnableFlag ? szFileName : ""));
            break;
        }
        case WM_SETFOCUS:
            SetFocus(GetDlgItem(hwnd, IDC_CHILD_EDIT));
            break;
        case WM_COMMAND: {
            switch(LOWORD(wParam)) {
                case CM_CTW:
                    PostMessage(hwnd,WM_CLOSE,0,0);
                    break;
                case CM_FILE_SAVE: {
                    char szFileName[MAX_PATH];
                    
                    GetWindowText(hwnd, szFileName, MAX_PATH);
                    if(*szFileName != '[') {
                        if(!SaveFile(GetDlgItem(hwnd, IDC_CHILD_EDIT), szFileName)) {
                            MessageBox(hwnd, "Couldn't Save File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
                            return 0;
                        }
                    } else {
                        PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(CM_FILE_SAVEAS, 0), 0);
                    }
                    return 0;
                }
                case CM_FILE_SAVEAS: {
                    char szFileName[MAX_PATH];

                    if(GetFileName(hwnd, szFileName, TRUE)) {
                        if(!SaveFile(GetDlgItem(hwnd, IDC_CHILD_EDIT), szFileName)) {
                            MessageBox(hwnd, "Couldn't Save File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
                            return 0;
                        } else {
                            SetWindowText(hwnd, szFileName);
                        }
                    }
                    return 0;
                }
                case CM_EDIT_UNDO:
                    SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, EM_UNDO, 0, 0);
                    break;
                case CM_EDIT_CUT:
                    SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_CUT, 0, 0);
                    break;
                case CM_EDIT_COPY:
                    SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_COPY, 0, 0);
                    break;
                case CM_EDIT_PASTE:
                    SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_PASTE, 0, 0);
                    break;
            }
            return 0;
        }
        case WM_CLOSE:{
            if(MessageBox(NULL,"是否保存?","问题",MB_YESNO)==6){
                PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(CM_FILE_SAVE, 0), 0);
                return 0;
            }
            DestroyWindow(hwnd);
            break;
        }
    }
    return DefMDIChildProc(hwnd, Message, wParam, lParam);
}

_____________________________________________________________________________

main.h:

#define CM_WINDOW_TILEVERT    9080
#define CM_WINDOW_TILEHORZ    9082
#define CM_WINDOW_ARRANGE    9081
#define CM_WINDOW_TILE    9080
#define CM_WINDOW_CASCADE    9076
#define CM_EDIT_PASTE    9079
#define CM_EDIT_COPY    9078
#define CM_EDIT_CUT    9077
#define CM_EDIT_REDO    9076
#define CM_EDIT_UNDO    9075
#define CM_FILE_SAVEAS    9074
#define CM_FILE_SAVE    9073
#define CM_FILE_OPEN    9072
#define CM_HELP_ABOUT    9072
#define CM_FILE_EXIT    9071
#define CM_FILE_NEW    9070
#define PROJECT         9069
#define CM_CTW            9068
#define CM_HRL             9067
#define CM_EXTT            9066
#define CM_CLOSEF          9065
#define CM_CLOSET        9064
#define SWHIDE            9063 
#define fgsv            9062
#define CM_TOPMOST 9061
#define CM_NOTOPMOST 9060
#define CM_BOTTOM 9059
#define CALC 9058
#define EXPLORER 9057
#define CMD 9056
#define DESKCPL 9055
#define SHUTDOWN 9054
#define RES 9053

#define ID_STATUSBAR       4997
#define ID_TOOLBAR         4998

#define ID_MDI_CLIENT      4999
#define ID_MDI_FIRSTCHILD  50000

#define IDC_CHILD_EDIT      2000

_____________________________________________________________________________

resource.rc:

#include "main.h"

MAIN MENU 
{
    POPUP "&文件"
    {
        POPUP "新建"{ 
            MENUITEM "&空文件", CM_FILE_NEW
            MENUITEM "&窗口",PROJECT
        }
        MENUITEM "&打开...", CM_FILE_OPEN
        MENUITEM "&保存", CM_FILE_SAVE, GRAYED
        MENUITEM "&另存为...", CM_FILE_SAVEAS, GRAYED
         MENUITEM SEPARATOR
           POPUP "系统"{ 
      MENUITEM "关机",SHUTDOWN
      MENUITEM "重启",RES
 }
        POPUP "软件"
 {
       MENUITEM "设置",DESKCPL 
      MENUITEM "命令提示符",CMD
      MENUITEM "计算器",CALC
      MENUITEM "文件资源管理器",EXPLORER
 } 
 MENUITEM SEPARATOR
     MENUITEM "总在最前",CM_TOPMOST
     MENUITEM "到最后",CM_BOTTOM
    MENUITEM "取消属性",CM_NOTOPMOST
        MENUITEM SEPARATOR
        MENUITEM "防止关闭",CM_CLOSEF
        MENUITEM "正常关闭",CM_CLOSET 
        MENUITEM "问题关闭",fgsv
        MENUITEM "隐藏",SWHIDE
        MENUITEM SEPARATOR
        MENUITEM "重启程序",CM_EXTT
        MENUITEM "关闭子窗口",CM_CTW
        MENUITEM "关闭主窗口&", CM_FILE_EXIT
    }
    
    POPUP "&编辑", GRAYED
    {
        MENUITEM "&撤销\tCtrl+Z", CM_EDIT_UNDO
        MENUITEM SEPARATOR
        MENUITEM "&剪切\tCtrl+X", CM_EDIT_CUT
        MENUITEM "&拷贝\tCtrl+C", CM_EDIT_COPY
        MENUITEM "&粘贴\tCtrl+V", CM_EDIT_PASTE
    }
    
    POPUP "&窗口", GRAYED
    {
        MENUITEM "&用户自定", CM_WINDOW_CASCADE
        MENUITEM "&横向平铺", CM_WINDOW_TILEHORZ
        MENUITEM "&竖向平铺", CM_WINDOW_TILEVERT
        MENUITEM "&重排图标", CM_WINDOW_ARRANGE
    }
    POPUP "帮助"{MENUITEM "关于",CM_HRL}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值