BEACONSHU 2022-04-16 18:00 采纳率: 60%
浏览 13
已结题

在使用FillConsoleOutputAttribute函数时,写入位置时访问冲突

在学C语言控制台窗口图形界面编程,抄的https://blog.csdn.net/liluo_2951121599/article/details/66474233这里的代码。。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
using namespace std;
#define N 255

const WORD FORE_BLUE = FOREGROUND_BLUE;
const WORD FORE_GREEN = FOREGROUND_GREEN;
const WORD FORE_RED = FOREGROUND_RED;
const WORD FORE_PURPLE = FORE_BLUE | FORE_RED;
const WORD FORE_CYAN = FORE_BLUE | FORE_GREEN;
const WORD FORE_YELLOW = FORE_RED | FORE_GREEN;
const WORD FORE_GRAY = FOREGROUND_INTENSITY;
const WORD BACK_BLUE = BACKGROUND_BLUE;           
const WORD BACK_GREEN = BACKGROUND_GREEN;          
const WORD BACK_RED = BACKGROUND_RED;            
const WORD BACK_PURPLE = BACK_BLUE | BACK_RED;      //紫色
const WORD BACK_CYAN = BACK_BLUE | BACK_GREEN;    //青色
const WORD BACK_YELLOW = BACK_RED | BACK_GREEN;     
const WORD BACK_GRAY = BACKGROUND_INTENSITY;

int main()
{
    HANDLE handle_out;             //定义句柄
    CONSOLE_SCREEN_BUFFER_INFO screen_info;         //定义窗口缓冲区信息结构体
    const char* str = "Hello World!";
    int len = strlen(str), i;
    WORD shadow = BACKGROUND_INTENSITY;//也就是BACK_GRAY 灰色背景  //阴影属性
    WORD text = BACK_GREEN | BACK_GRAY;
    handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(handle_out, &screen_info);
    SMALL_RECT rc;         //文本输出区域
    COORD posText;
    COORD posShadow;        //两个起始坐标
    //确定区域边界
    rc.Top = 8;
    rc.Bottom = rc.Top + 4;
    rc.Left = (screen_info.dwSize.X - len) / 2 - 2;   //可以让输出的字符串居中的左边界
    rc.Right = rc.Left + len + 4;
    //确定文本框起始坐标
    posText.X = rc.Left;
    posText.Y = rc.Top;
    //确定阴影框的起始坐标
    posShadow.X = posText.X + 1;
    posShadow.Y = posText.Y + 1;
    //输出阴影框
    LPDWORD a = NULL;
    for (i = 0;i < 5;++i)
    {
        FillConsoleOutputAttribute(handle_out, shadow, len + 4, posShadow, NULL);    //这里报错,但是其实尝试之后下面的fill也会报错
        posShadow.Y++;
    }
    //输出文本框
    for (i = 0; i < 5; ++i)
    {
        FillConsoleOutputAttribute(handle_out, text, len + 4, posText, NULL);
        posText.Y++;
    }
    //设置文本输出处的坐标
    posText.X = rc.Left + 2;
    posText.Y = rc.Top + 2;
    WriteConsoleOutputCharacter(handle_out, str, len, posText, NULL);
    SetConsoleTextAttribute(handle_out, screen_info.wAttributes);
    CloseHandle(handle_out);
    return 0;
}

其中str原文是使用char*来声明,但是我声明的时候会报错不知道为什么
加了const才正常

img


这里可以看到这个函数是运行完了才报错的
只运行了一次,没有进行下一个循环
代码都是照抄的啊。怎么会事呢

也尝试了换字符集,也没用
也尝试了抄另一个代码,只要有这个函数都报错。

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-04-18 14:36
    关注

    console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。
    来自MSVC20\SAMPLES\win32\console
    http://download.csdn.net/detail/zhao4zhong1/3461309

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月14日
  • 创建了问题 4月16日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog