Turbo C++ DOSBox环境下conio.h的window函数无法创建窗口问题
问题根因
Turbo C++ 提供的 window() 函数接收的坐标是文本字符坐标,而非像素坐标,你传入的坐标超出了DOS默认文本模式的坐标范围,导致参数无效,系统自动回退到默认全屏窗口。
DOSBox默认启动的文本模式是标准的80列×25行规格,x轴(横向列数)取值范围是180,y轴(纵向行数)取值范围是125,你传入的100、200远大于最大坐标值,window() 函数校验到非法参数后会直接跳过窗口创建逻辑,所以后续的 cprintf 还是输出到默认的全屏窗口左上角。
修复方案
- 调整
window()函数的参数到合法坐标范围内,比如创建左上角(10,5)、右下角(50,15)的文本窗口,参数需满足x值在180区间、y值在125区间 - 调整代码顺序,把
clrscr()放到window()调用之后,否则你先清的是全屏,创建新窗口后清屏才会只清窗口内的区域,效果更明显 - 如果确实需要更大的坐标范围,可以先调用
textmode()切换到更高分辨率的文本模式,比如textmode(C4350)可以切换到80列×50行的文本模式,y轴最大坐标会扩展到50
可正常运行的参考代码
#include <conio.h> #include <stdlib.h> int main() { // 可选:切换到80*50文本模式,扩大y轴坐标范围 // textmode(C4350); // 坐标都在1~80、1~25的合法范围内 window(10, 5, 50, 15); textcolor(3); textbackground(6); // 放在window之后,仅清除当前窗口内的内容 clrscr(); cprintf("Hello world"); getch(); // 退出前恢复默认文本模式 textmode(LASTMODE); return 0; }
效果验证
运行修改后的代码可以看到带青蓝色前景、棕色背景的Hello World文本出现在屏幕偏左上的位置,文本周围默认黑底的区域就是窗口外的区域,符合预期效果。
内容的提问来源于stack exchange,提问作者Yonshoku
相关产品推荐
相关产品推荐

