如何使用Windows API将控制台窗口调整为指定尺寸?
问题
我有一段简单的演示代码,可在控制台的(100,100)坐标处绘制一个白色像素。我想了解是否可以修改屏幕尺寸,设置int WIDTH = 1000; int HEIGHT = 1000这类变量,使控制台契合该尺寸?
#include<windows.h> #include<stdio.h> int main(void) { //Get a console handle HWND console = GetConsoleWindow(); //Get a handle to device context HDC dc = GetDC(console); //Choose any color COLORREF COLOR= RGB(255,255,255); SetPixel(dc,100,100,COLOR); ReleaseDC(console, dc); }
解决方案
可以通过Windows API调整控制台窗口尺寸,让其客户区恰好匹配你设定的1000x1000像素。核心是计算包含标题栏、边框的完整窗口尺寸,再调用API设置,同时调整控制台缓冲区避免滚动条干扰。
修改后的代码如下:
#include<windows.h> #include<stdio.h> int main(void) { const int TARGET_WIDTH = 1000; const int TARGET_HEIGHT = 1000; // 获取控制台窗口句柄 HWND console = GetConsoleWindow(); if (!console) { printf("Failed to get console window handle\n"); return 1; } // 获取窗口风格,用于计算整体尺寸 LONG style = GetWindowLongPtr(console, GWL_STYLE); RECT clientRect = {0, 0, TARGET_WIDTH, TARGET_HEIGHT}; // 计算包含边框和标题栏的窗口整体尺寸 AdjustWindowRect(&clientRect, style, FALSE); // 设置窗口位置和大小(居中显示) int screenWidth = GetSystemMetrics(SM_CXSCREEN); int screenHeight = GetSystemMetrics(SM_CYSCREEN); int windowX = (screenWidth - (clientRect.right - clientRect.left)) / 2; int windowY = (screenHeight - (clientRect.bottom - clientRect.top)) / 2; SetWindowPos(console, NULL, windowX, windowY, clientRect.right - clientRect.left, clientRect.bottom - clientRect.top, SWP_SHOWWINDOW); // 调整控制台缓冲区大小,避免出现滚动条 HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO bufferInfo; GetConsoleScreenBufferInfo(consoleHandle, &bufferInfo); COORD newBufferSize = {bufferInfo.srWindow.Right + 1, bufferInfo.srWindow.Bottom + 1}; SetConsoleScreenBufferSize(consoleHandle, newBufferSize); // 绘制黄色像素 HDC dc = GetDC(console); COLORREF color = RGB(255, 255, 0); SetPixel(dc, 100, 100, color); ReleaseDC(console, dc); // 暂停窗口方便查看效果 printf("Press any key to exit...\n"); getchar(); return 0; }
关键步骤说明
- 计算完整窗口尺寸:
AdjustWindowRect根据目标客户区尺寸和窗口风格,算出包含边框、标题栏的窗口总大小,确保客户区刚好为1000x1000像素。 - 居中窗口:通过
GetSystemMetrics获取屏幕分辨率,计算居中坐标,优化显示体验。 - 消除滚动条:将控制台缓冲区尺寸设置为与窗口可视区域一致,避免滚动条影响绘制区域。
- 修正像素颜色:将原白色像素改为你需求的黄色(RGB(255,255,0))。
注意事项
- 运行后窗口会自动调整到目标尺寸,按下任意键退出;若需窗口持续打开,可保留
getchar()或添加其他阻塞逻辑。 - 部分系统对控制台窗口有尺寸限制,若1000x1000超出限制,会自动调整到系统允许的最大尺寸。
内容的提问来源于stack exchange,提问作者Saw
相关产品推荐
相关产品推荐

