编程为啥这么难? 2021-10-04 20:47 采纳率: 0%
浏览 36

本来想用MFC写一个主窗口一个子窗口,结果一直在报错,别人的程序就能运行,不知道为什么

这个是人家的,可以运行:

#include <afxwin.h>

HINSTANCE g_hInstance = 0;
//窗口处理函数  
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);//可以使GetMessage返回0  
        break;
    case  WM_CREATE:
    {
        CREATESTRUCT crt = *((CREATESTRUCT*)lParam);
        char buf[256] = { 0 };
        sprintf(buf, "创建的窗口类名称是%s,窗口名称是%s", crt.lpszClass, crt.lpszName);
        MessageBox(NULL, buf, "消息处理", MB_OK);
    }
    case WM_QUIT:
    {
        int param = (int)wParam;
        char buf[256];
        sprintf(buf, "进程退出,退出码:%d", param);
        MessageBox(NULL, buf, "消息处理", MB_OK);
    }
    case WM_SYSCOMMAND:
    {
        if (wParam == SC_MAXIMIZE)
        {
            short x = LOWORD(lParam);
            short y = HIWORD(lParam);
            char buf[256];
            sprintf(buf, "窗口最大化,x坐标:%d,y坐标:%d", x, y);
            MessageBox(NULL, buf, "消息处理", MB_OK);
        }
    }
    case WM_SIZE:
    {
        if (wParam == SIZE_MAXIMIZED)
        {
            short width = LOWORD(lParam);
            short hight = HIWORD(lParam);
            char buf[256];
            sprintf(buf, "窗口最大化,高度:%d,宽度:%d", hight, width);
            MessageBox(NULL, buf, "消息处理", MB_OK);
        }
    }
    default:
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//注册窗口类  
BOOL Register(LPSTR lpClassName, WNDPROC wndProc)
{
    WNDCLASSEX wce = { 0 };
    wce.cbSize = sizeof(wce);
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hIconSm = NULL;
    wce.hInstance = g_hInstance;
    wce.lpfnWndProc = wndProc;
    wce.lpszClassName = lpClassName;
    wce.lpszMenuName = NULL;
    wce.style = CS_HREDRAW | CS_VREDRAW;
    ATOM nAtom = RegisterClassEx(&wce);
    if (nAtom == 0)
        return FALSE;
    return true;

}
//创建主窗口  
HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName)
{
    HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName,
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);
    return hWnd;
}
//显示窗口  
void Display(HWND hWnd)
{
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
}
//消息循环  
void Message()
{
    MSG nMsg = { 0 };
    while (GetMessage(&nMsg, NULL, 0, 0))
    {
        TranslateMessage(&nMsg);
        DispatchMessage(&nMsg);
    }
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    // TODO: Place code here.  
    char a[50]= "Main";
    g_hInstance = hInstance;
    BOOL nRet = Register(a, WndProc);
    if (!nRet)
    {
        MessageBox(NULL, "注册失败", "Infor", MB_OK);
        return 0;
    }
    char b[50] = "window";
    HWND hWnd = CreateMain(a, b);
    CreateWindow("Main", "子窗口",
         WS_CHILD | WS_VISIBLE | WS_POPUP, 200, 400, 400, 400,
        hWnd, NULL, g_hInstance, NULL);

    Display(hWnd);
    Message();
    return 0;
}

下面是我的,按书上格式写的:
头文件tou.h:


class CMyFrameWnd :public CFrameWnd {};
class CMyWinApp :public CWinApp {
public:
    CMyWinApp()
    {
    }
    virtual BOOL InitInstance();

};

class CMainWindow : public CFrameWnd
{
protected:


public:
    CMainWindow();

protected:
    afx_msg void OnPaint();
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

    DECLARE_MESSAGE_MAP()
};

下面是源.cpp文件:


#include <afxwin.h>
#include "tou.h"

CMyWinApp theapp;

BOOL CMyWinApp::InitInstance()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}

BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
    ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    ON_WM_SETCURSOR()

END_MESSAGE_MAP()

CMainWindow::CMainWindow()
{
    CRect rect1(0, 0, GetSystemMetrics(SM_CXSCREEN) / 2, GetSystemMetrics(SM_CYSCREEN) / 2);
    char aa[50] = "Main";
    char bb[50] = "window";
    HINSTANCE g_hInstance = 0;

    HWND m_hWnd = CreateWindowEx(0, aa, bb,
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);

    CreateWindow("Main", "子窗口",
        WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 400, 200,
        m_hWnd, NULL, g_hInstance, NULL);
}

void CMainWindow::OnPaint()
{

}

void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{

}

我的程序一运行就有winocc.cpp的断言报错

img

不知道有没有人能赐教!

  • 写回答

1条回答 默认 最新

  • 技术专家团-极简 2021-10-04 20:50
    关注

    你触发了断点,把断点删除执行,或者直接运行!

    评论

报告相同问题?

问题事件

  • 修改了问题 10月4日
  • 修改了问题 10月4日
  • 创建了问题 10月4日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?