• Windows编程调试技巧-控制台调试


    前言

    刚刚开始学windows编程,遇到问题不知道如何调试,控制台输入输出函数用不了,也尝试过MessageBox来输出,效果不是很好

    VS调试窗口调试

    这种输出方式代码比较好写,缺点是只能在调试窗口看到输出语句
    编译时选择“开始调试”,在需要输出的地方调用OutputDebugString函数

    OutputDebugString(szBuffer);
    

    控制台窗口调试

    这种调试方式允许在控制台中输入和输出

    1.打开窗口

    使用AllocConsole函数打开一个控制台窗口,一个进程最多可以附加一个控制台

    AllocConsole();
    

    2.重定向输入和输出

    freopen函数在VS中可能会报错,在程序第一行加入

    #define _CRT_SECURE_NO_WARNINGS
    
    freopen("CONOUT$", "w", stdout);
    freopen("CONIN$", "r", stdin);
    

    3.输出调试信息

    可以用cin,cout,printf,scanf这些控制台输入输出语句

    int x;
    cin >> x;
    cout << x << endl;
    

    4.分离控制台窗口

    分离与调用进程相关联的控制台窗口

    FreeConsole();
    

    示例

    /* -------------------------------------------------------------------
                        MyWindows.c -- 基本窗口模型
                                    《Windows 程序设计(SDK)》视频教程
    --------------------------------------------------------------------*/
    #define _CRT_SECURE_NO_WARNINGS
    #include <Windows.h>
    #include <tchar.h>
    #include <iostream>
    using namespace std;
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    
        AllocConsole();
        freopen("CONOUT$", "w", stdout);
        freopen("CONIN$", "r", stdin);
        static TCHAR szAppName[] = TEXT("MyWindows");
        HWND hwnd;//窗口句柄
    
        MSG msg;//消息结构
        WNDCLASS wndclass;//窗口类结构   
    
    
        wndclass.style = CS_HREDRAW | CS_VREDRAW;//窗口类型
        wndclass.lpfnWndProc = WndProc;//指定窗口过程
        wndclass.cbClsExtra = 0;//预留的额外空间
        wndclass.cbWndExtra = 0;//预留的额外空间
        wndclass.hInstance = hInstance;//应用程序的实例句柄
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//为所有基于该窗口类的窗口设定一个图标
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//为所有基于该窗口类的窗口设定一个鼠标指针
        wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//	指定窗口背景色
        wndclass.lpszMenuName = NULL;//	指定窗口菜单
        wndclass.lpszClassName = szAppName;//指定窗口类名
    
        if (!RegisterClass(&wndclass))
        {
            MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
            return 0;
        }
    
        hwnd = CreateWindow(szAppName,//类名
            TEXT("鱼C工作室"),//标题
            WS_OVERLAPPEDWINDOW,//风格
            CW_USEDEFAULT,//初始x坐标
            CW_USEDEFAULT,//初始y坐标
            CW_USEDEFAULT,//初始宽度
            CW_USEDEFAULT,//初始高度
            NULL,//父窗口句柄
            NULL,//窗口菜单句柄
            hInstance,//程序实例句柄
            NULL);//创建参数
    
        ShowWindow(hwnd, iCmdShow);//显示窗口
        UpdateWindow(hwnd);
    
        while (GetMessage(&msg, NULL, 0, 0))//消息循环
        {
            TranslateMessage(&msg);//翻译一些键盘消息
            DispatchMessage(&msg);//将消息发送给窗口过程
        }
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc;//设备环境句柄
        PAINTSTRUCT ps;//绘制结构
        RECT rect;//矩形结构
    
        switch (message)
        {
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);//获得设备句柄
            GetClientRect(hwnd, &rect);//获取矩形结构
            cout << "开始处理WM_PAINT消息" << endl;
            DrawText(hdc, TEXT("大家好,这是我的第一个窗口程序!"), -1, &rect,
                DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(hwnd, &ps);// 函数标记指定窗口的绘画过程结束
            return 0;
    
        case WM_DESTROY://窗口关闭
            PostQuitMessage(0);
            FreeConsole();
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);//交给windows去处理
    }
    
  • 相关阅读:
    springboot中如何获取配置文件的值
    自动获取当月天数
    控制输入前端时间格式及其它常见需求
    页面输出格式常用注解----@JsonIgnore,@JsonFormat,@JsonFormat
    echart动态生成标题
    echart柱状图中每个柱子超过阈值改变颜色状态
    如何把箭头放置在文本前面,并根据数据的正负显示向上和向下箭头
    02、GPIO初始化
    Linux文件目录的权限
    Linux执行命令./command与直接输入命令的区别
  • 原文地址:https://www.cnblogs.com/carcar/p/12691250.html
Copyright © 2020-2023  润新知