Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MDI子窗口创建失败_C++_Gdi+_Win32gui - Fatal编程技术网

C++ MDI子窗口创建失败

C++ MDI子窗口创建失败,c++,gdi+,win32gui,C++,Gdi+,Win32gui,我有一个MDI应用程序,两个不同的子窗口类。我的问题是,如果第一个实例已经出现在屏幕上,我就不能创建第二个实例,但我可以用另一种方法来创建;如果在WndProc中的case ID_OPEN_NEW上,我将类名更改为g_szChildClassName2,然后在MDIChildWndProc2中取消注释case WM_LBUTTONDOWN的内容以创建g_szChildClassName的子窗口,那么这两个窗口将不会出现问题 没有错误消息,只是表示操作已成功完成。我想这与工具栏或GDI+的绘图有关

我有一个MDI应用程序,两个不同的子窗口类。我的问题是,如果第一个实例已经出现在屏幕上,我就不能创建第二个实例,但我可以用另一种方法来创建;如果在WndProc中的case ID_OPEN_NEW上,我将类名更改为g_szChildClassName2,然后在MDIChildWndProc2中取消注释case WM_LBUTTONDOWN的内容以创建g_szChildClassName的子窗口,那么这两个窗口将不会出现问题

没有错误消息,只是表示操作已成功完成。我想这与工具栏或GDI+的绘图有关

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
    HWND                hWnd;
    MSG                 msg;
    WNDCLASSEXW         wc;
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken;
    g_instance = hInstance;

    // Initialize GDI+.
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    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  = MAKEINTRESOURCE(IDR_MENU1);
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = NULL;

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, L"Window Registration Failed!", L"Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    if(!SetUpMDIChildWindowClass(hInstance))
        return 0;

    if(!SetUpMDIChildWindowClass2(hInstance))
        return 0;

    hWnd = CreateWindowEx(
        0,
        g_szClassName,
        L"Interactive music",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 480, 320,
        NULL, NULL, hInstance, NULL);

    if(hWnd == NULL)
    {
        MessageBox(NULL, L"Window Creation Failed!", L"Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);

    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        if (!TranslateMDISysAccel(g_hMDIClient, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.wParam;

    GdiplusShutdown(gdiplusToken);
    return msg.wParam;
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
                         WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_CREATE:
        {
            CLIENTCREATESTRUCT ccs;
            ccs.idFirstChild = ID_MDI_FIRSTCHILD;

            g_hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE, L"mdiclient", NULL,
                WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                hWnd, (HMENU)IDC_MAIN_MDI, GetModuleHandle(NULL), (LPVOID)&ccs);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case ID_OPEN_NEW:
            {
                CreateNewMDIChild(g_hMDIClient, g_szChildClassName);
            }
            break;
        default:
            {
                if(LOWORD(wParam) >= ID_MDI_FIRSTCHILD)
                {
                    DefFrameProc(hWnd, g_hMDIClient, WM_COMMAND, wParam, lParam);
                }
                else 
                {
                    HWND hChild = (HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE,0,0);
                    if(hChild)
                    {
                        SendMessage(hChild, WM_COMMAND, wParam, lParam);
                    }
                }
            }
        }
        break;
    default:
        return DefFrameProc(hWnd, g_hMDIClient, message, wParam, lParam);
    }
    return 0;
}

LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_CREATE:
        {
            g_hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
                hwnd, (HMENU)IDC_MAIN_TOOL, GetModuleHandle(NULL), NULL);
            if(g_hToolbar == NULL)
                MessageBox(hwnd, L"Could not create tool bar.", L"Error", MB_OK | MB_ICONERROR);

            SendMessage(g_hToolbar, TB_SETMAXTEXTROWS, 0, 0);
            SendMessage(g_hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

            HIMAGELIST hImageList = ImageList_Create(22,22, ILC_COLORDDB, 4, 0);

            int what0 = ImageList_Add(hImageList, LoadBitmap(g_instance, MAKEINTRESOURCEW(IDB_BITMAP2)), NULL);
            int what1 = ImageList_Add(hImageList, LoadBitmap(g_instance, MAKEINTRESOURCEW(IDB_BITMAP3)), NULL);
            int what2 = ImageList_Add(hImageList, LoadBitmap(g_instance, MAKEINTRESOURCEW(IDB_BITMAP1)), NULL);
            int what3 = ImageList_Add(hImageList, LoadBitmap(g_instance, MAKEINTRESOURCEW(IDB_BITMAP4)), NULL);

            SendMessage(g_hToolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList);

            TBBUTTON tbb[4] =   { 
                {what0, ID_NEW_STEP, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)L"CreateStep"},
                {what1, ID_DELETE_STEP, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)L"DeleteStep"},
                {what2, ID_NEW_SEGMENT, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)L"CreateSegment"},
                {what3, ID_DELETE_SEGMENT, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)L"DeleteSegment"},
            };

            SendMessage(g_hToolbar, TB_ADDBUTTONS, 4, (LPARAM)&tbb);
            SendMessage(g_hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(22, 22));
            SendMessage(g_hToolbar, TB_AUTOSIZE, 0, 0);
            ShowWindow(g_hToolbar, SW_SHOW);

            g_MDIChildHwnd = hwnd;
            m_nHScrollPos = 0;
            SetUpMDIChildClientScrollbar();
        }
        break;
    case WM_PAINT:
        {
            HDC hdc;
            PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd, &ps);
            OnPaint(hdc);
            EndPaint(hwnd, &ps);
        }
        break;
    case WM_LBUTTONDBLCLK:
        {
            std::vector<CStep*>::iterator it = g_steps.begin();
            while(it!=g_steps.end())
            {
                CStep& step = **it;
                std::vector<CSegment*>::iterator its = step.m_segments.begin();
                while(its != step.m_segments.end())
                {
                    CSegment& seg = **its;
                    if(seg.m_bActive)
                    {
                        //create new window
                        CreateNewMDIChild(hwnd, g_szChildClassName2);
                        break;
                    }
                    its++;
                }
                it++;
            }
        }
    break;
        }
        break;
    case WM_SIZE:
            SetUpMDIChildClientScrollbar();
    default:
        return DefMDIChildProc(hwnd, msg, wParam, lParam);

    }
    return 0;
}

LRESULT CALLBACK MDIChildWndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_LBUTTONDOWN:
        {
            //CreateNewMDIChild(g_hMDIClient, g_szChildClassName);
        }
    default:
        return DefMDIChildProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

bool SetUpMDIChildWindowClass(HINSTANCE hInstance)
{
    WNDCLASSEX wc;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wc.lpfnWndProc   = MDIChildWndProc;
    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);//(HBRUSH)(COLOR_3DFACE+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szChildClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(0, L"Could Not Register Child Window", L"Oh Oh...",
            MB_ICONEXCLAMATION | MB_OK);
        return false;
    }
    else
        return true;
}

bool SetUpMDIChildWindowClass2(HINSTANCE hInstance)
{
    WNDCLASSEX wc;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = MDIChildWndProc2;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = NULL;//LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//(HBRUSH)(COLOR_3DFACE+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szChildClassName2;
    wc.hIconSm       = NULL;//LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(0, L"Could Not Register Child Window", L"Oh Oh...",
            MB_ICONEXCLAMATION | MB_OK);
        return false;
    }
    else
        return true;
}

HWND CreateNewMDIChild(HWND hMDIClient, const wchar_t* childClassName)
{ 
    MDICREATESTRUCT mcs;
    HWND hChild;

    mcs.szTitle = L"untitled";
    mcs.szClass = childClassName;
    mcs.hOwner  = GetModuleHandle(NULL);
    mcs.x = mcs.cx = CW_USEDEFAULT;
    mcs.y = mcs.cy = CW_USEDEFAULT;
    mcs.style = WS_HSCROLL;

    hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);
    DWORD dw = GetLastError();
    if(!hChild)
    {
        wchar_t buffer[256];
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,dw,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),buffer,256,0);
        MessageBox(hMDIClient,buffer,L"Error",MB_OK|MB_ICONERROR);
    }

    return hChild;
}
INT-WINAPI-WinMain(HINSTANCE-HINSTANCE、HINSTANCE、PSTR、INT-iCmdShow)
{
HWND-HWND;
味精;
WNDCLASSEXW wc;
GdiplusStartupInput GdiplusStartupInput;
ULONG_PTR gdiplusToken;
g_instance=hInstance;
//初始化GDI+。
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(空,IDI_应用程序);
wc.hCursor=LoadCursor(空,IDC_箭头);
wc.hbrBackground=(HBRUSH)(彩色窗口+1);
wc.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
wc.lpszClassName=g_szClassName;
wc.hIconSm=NULL;
如果(!RegisterClassEx(&wc))
{
MessageBox(NULL,L“窗口注册失败!”,L“错误!”,
MB|U图标连接| MB|U OK);
返回0;
}
如果(!SetUpMDIChildWindowClass(hInstance))
返回0;
如果(!SetUpMDIChildWindowClass2(hInstance))
返回0;
hWnd=CreateWindowEx(
0,
g_szClassName,
L“互动音乐”,
WS_重叠窗口,
CW_USEDEFAULT,CW_USEDEFAULT,480320,
NULL,NULL,hInstance,NULL);
if(hWnd==NULL)
{
MessageBox(NULL,L“窗口创建失败!”,L“错误!”,
MB|U图标连接| MB|U OK);
返回0;
}
显示窗口(hWnd、iCmdShow);
更新窗口(hWnd);
while(GetMessage(&msg,NULL,0,0)>0)
{
if(!TranslateMDISysAccel(g_hMDIClient,&msg))
{
翻译信息(&msg);
发送消息(&msg);
}
}
返回msg.wParam;
GdiplusShutdown(gdiplusToken);
返回msg.wParam;
} 
LRESULT回调WndProc(HWND HWND,UINT消息,
WPARAM WPARAM,LPARAM LPARAM)
{
开关(信息)
{
案例WM_创建:
{
CLIENTCREATESTRUCT;
ccs.idFirstChild=ID\u MDI\u FIRSTCHILD;
g_hMDIClient=CreateWindowEx(WS_EX_CLIENTEDGE,L“mdiclient”,NULL,
WS|u CHILD | WS|u CLIPCHILDREN | WS|u VSCROLL | WS|u HSCROLL | WS|u可见,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
hWnd,(HMENU)IDC\u MAIN\u MDI、GetModuleHandle(空)、(LPVOID)和ccs);
}
打破
案例WM_销毁:
PostQuitMessage(0);
返回0;
case WM_命令:
开关(LOWORD(wParam))
{
案例ID\u打开\u新建:
{
CreateNewMDIChild(g_hMDIClient,g_szChildClassName);
}
打破
违约:
{
if(LOWORD(wParam)>=ID\u MDI\u FIRSTCHILD)
{
deframeproc(hWnd、g_-hMDIClient、WM_命令、wParam、lParam);
}
其他的
{
HWND hChild=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,0);
如果(hChild)
{
SendMessage(hChild、WM_命令、wParam、lParam);
}
}
}
}
打破
违约:
返回deframeproc(hWnd、g_hMDIClient、message、wParam、lParam);
}
返回0;
}
LRESULT回调MDIChildWndProc(HWND HWND、UINT msg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(msg)
{
案例WM_创建:
{
g_hToolbar=CreateWindowEx(0,TOOLBARCLASSNAME,NULL,WS_子项| WS_可见,0,0,0,
hwnd,(HMENU)IDC_主工具,GetModuleHandle(NULL),NULL);
if(g_hToolbar==NULL)
MessageBox(hwnd,L“无法创建工具栏”,L“错误”,MB_OK | MB_ICONERROR);
SendMessage(g_hToolbar,TB_SETMAXTEXTROWS,0,0);
SendMessage(g_hToolbar,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);
HIMAGELIST HIMAGELIST=ImageList_Create(22,22,ILC_COLORDDB,4,0);
int what0=ImageList_Add(hImageList,LoadBitmap(g_实例,MAKEINTRESOURCEW(IDB_BITMAP2)),NULL);
int what1=ImageList_Add(hImageList,LoadBitmap(g_实例,MAKEINTRESOURCEW(IDB_BITMAP3)),NULL);
int what2=ImageList_Add(hImageList,LoadBitmap(g_实例,MAKEINTRESOURCEW(IDB_BITMAP1)),NULL);
int what3=ImageList_Add(hImageList,LoadBitmap(g_实例,MAKEINTRESOURCEW(IDB_位图4)),NULL);
发送消息(g_hToolbar,TB_SETIMAGELIST,(WPARAM)0,(LPARAM)hImageList);
tbb按钮tbb[4]={
{what0,ID_NEW_STEP,TBSTATE_ENABLED,BTNS_AUTOSIZE,{0},0,(INT_PTR)L“CreateStep”},
{what1,ID_DELETE_STEP,TBSTATE_ENABLED,btn_AUTOSIZE,{0},0,(INT_PTR)L“DeleteStep”},
{what2,ID_NEW_SEGMENT,TBSTATE_ENABLED,BTNS_AUTOSIZE,{0},0,(INT_PTR)L“CreateSegment”},
{what3,ID_DELETE_SEGMENT,TBSTATE_ENABLED,btn_AUTOSIZE,{0},0,(INT_PTR)L“DELETE SEGMENT”},
};
发送消息(g_hToolbar、TB_ADDBUTTONS、4、(LPRAM)和tbb);
SendMessage(g_hToolbar,TB_SETBUTTONSIZE,0,MAKELPARAM(22,22));
发送消息(g_hToolbar,TB_AUTOSIZE,0,0);
展示窗口(g_hToolbar、SW_SHOW);
g_MDIChildHwnd=hwnd;
m_nhs=0;
设置孩子