VS-c++控制台设置字体大小等属性

如题,简略代码如下

#include <iostream>
#include <Windows.h> //VS 自带的头文件
using namespace std;
//设置字体
void SetFont(int size = 30) {
	CONSOLE_FONT_INFOEX cfi;
	cfi.cbSize = sizeof cfi;
	cfi.nFont = 0;
	cfi.dwFontSize.X = 0;
	cfi.dwFontSize.Y = size;  //设置字体大小
	cfi.FontFamily = FF_DONTCARE;
	cfi.FontWeight = FW_NORMAL; //字体粗细 FW_BOLD
	wcscpy_s(cfi.FaceName, L"黑体");  //设置字体,必须是控制台已有的
	SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
	//获得当前字体
	//HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	//CONSOLE_FONT_INFO consoleCurrentFont;
	//GetCurrentConsoleFont(handle, FALSE, &consoleCurrentFont);
}
int main() {
	SetFont(100);
	cout << "Hello World\n";
	return 0;
}
以下代码在radasm编译后打开.exe无法生成窗口_ProcWinMain proc uses ebx esi edi hWnd,wMsg,wParam,lParam LOCAL @stPs:PAINTSTRUCT LOCAL @hDc mov eax,wMsg .if eax==WM_CREATE mov Score,0 mov PlayFlag,1 mov Velocity,400 invoke LoadIcon,hInstance,ID_ICO invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax .elseif .else invoke DefWindowProc,hWnd,wMsg,wParam,lParam ret .endif xor eax,eax ret _ProcWinMain endp ;******************************************************************** ;创建窗口 ;******************************************************************** WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL @wc:WNDCLASSEX LOCAL @msg:MSG LOCAL @hwnd:HWND mov @wc.cbSize,sizeof WNDCLASSEX mov @wc.style,CS_HREDRAW or CS_VREDRAW mov @wc.lpfnWndProc,offset _ProcWinMain mov @wc.cbClsExtra,NULL mov @wc.cbWndExtra,NULL push hInstance pop @wc.hInstance invoke LoadMenu,hInstance,IDR_MENU mov hMenu,eax mov @wc.hbrBackground,COLOR_BTNFACE+1 mov @wc.lpszMenuName,NULL mov @wc.lpszClassName,offset ClassName invoke LoadIcon,hInstance,ID_ICO mov @wc.hIcon,eax mov @wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov @wc.hCursor,eax invoke RegisterClassEx,addr @wc invoke CreateWindowEx,WS_EX_CLIENTEDGE or WS_EX_WINDOWEDGE,\ addr ClassName,addr AppName,\ WS_MINIMIZEBOX or WS_SYSMENU,\ CW_USEDEFAULT,CW_USEDEFAULT,\ 132h,179h,NULL,hMenu,hInst,NULL mov @hwnd,eax invoke ShowWindow,@hwnd,CmdShow invoke UpdateWindow,@hwnd .while TRUE invoke GetMessage,addr @msg,NULL,0,0 .break .if(!eax) invoke TranslateMessage,addr @msg invoke DispatchMessage,addr @msg .endw mov eax,@msg.wParam ret WinMain endp start: invoke GetModuleHandle,NULL mov hInstance,eax invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax end start
最新发布
03-27
<think>好的,我现在需要解决用户在RadAsm编译后生成的EXE文件无法生成窗口的问题,用户提到了“null”,可能和NULL指针有关。首先,我需要回忆一下关于NULL在编程中的相关知识,特别是C/C++中的NULL定义和使用情况。 根据用户提供的引用[1],NULL在C语言中被定义为指向内存地址0的指针,也就是((void *)0)。而C++中则定义为0或者nullptr。如果程序中错误地使用了NULL,可能会导致访问空指针,引发段错误或程序崩溃。用户提到的引用[2]中也提到了不同编译器下NULL的定义差异,以及在gcc下出现段错误的情况,这可能和NULL的错误使用有关。 接下来,用户的问题是关于RadAsm编译后的EXE无法生成窗口。可能的原因有几个方面:窗口创建过程中参数传递了错误的NULL值,比如窗口类注册失败、窗口过程函数指针为NULL,或者在创建窗口时父窗口句柄错误地设为NULL。此外,资源文件未正确链接也可能导致窗口无法显示,比如图标、菜单等资源引用错误,使用NULL可能导致资源加载失败。 需要进一步排查的步骤包括检查窗口注册是否正确,确保窗口类正确注册并且窗口过程函数有效;检查CreateWindowEx调用中的参数是否正确,特别是父窗口句柄、类名等;检查资源是否正确链接,比如是否在.rc文件中正确定义了资源,并且在代码中正确引用;最后,查看编译器的错误输出和调试信息,是否有关于空指针的警告或错误,或者使用调试器查看程序运行到哪一步时崩溃。 另外,用户可能在代码中误用了NULL,例如将本该是有效句柄的地方传递了NULL,或者在结构体中没有正确初始化成员为NULL。例如,在注册窗口类时,如果hbrBackground字段被错误地设为NULL,可能导致窗口绘制问题。或者,窗口过程函数WndProc的地址是否正确,没有被正确赋值导致为NULL,这样系统无法处理窗口消息,窗口无法创建。 还需要考虑RadAsm的编译设置是否正确,比如链接器是否包含必要的库文件,是否正确指定了入口点,或者是否存在项目配置错误导致资源未被正确编译进EXE文件中。有时候,资源脚本(.rc)中的错误,比如对话框模板中的控件引用错误,或者图标路径错误,也可能导致窗口创建失败。 总结来说,用户需要检查代码中所有使用NULL的地方,确保它们被正确使用,特别是在与窗口创建相关的API调用中。同时,检查资源文件和编译设置,确保没有因NULL或资源未正确链接导致的问题。通过逐步调试和查看编译日志,定位具体出错的位置。</think>在解决RadAsm编译后EXE文件无法生成窗口的问题时,需重点关注**NULL指针的使用场景**和**资源链接完整性**。以下是具体排查步骤: --- ### 一、NULL指针的典型错误场景 1. **窗口类注册失败** 注册窗口类时若`lpfnWndProc`(窗口过程函数指针)被错误赋值为NULL,系统将无法处理消息: ```c WNDCLASSEX wc = {0}; wc.lpfnWndProc = NULL; // 错误!必须指向有效的窗口过程函数 ``` 正确做法应指向自定义函数如`WndProc`[^1]。 2. **CreateWindowEx参数错误** 创建窗口时若`hMenu`或`hwndParent`误用NULL可能导致窗口层级混乱: ```c HWND hwnd = CreateWindowEx(0, "MyClass", "Title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL); // 两个NULL分别为hMenu和hInstance ``` 需确认`hMenu`是否需要关联菜单资源,而非直接置NULL。 --- ### 二、资源文件(.rc)与链接问题 1. **资源未正确链接** 若在.rc文件中定义了图标、菜单等资源但未正确引用,会导致窗口缺少关键属性: ```rc // MyResource.rc IDI_MAIN_ICON ICON "missing_icon.ico" // 路径错误时资源加载失败 ``` 编译时需确保资源文件路径正确,且编译器能正确生成.res文件并链接到EXE中。 2. **窗口样式依赖资源** 若窗口类指定了图标或菜单资源但未正确定义,窗口可能无法渲染: ```c wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON)); // 若IDI_MAIN_ICON未定义则返回NULL ``` --- ### 三、调试与验证方法 1. **检查注册窗口类的返回值** 使用`RegisterClassEx`后验证返回值: ```c if (!RegisterClassEx(&wc)) { MessageBox(NULL, "窗口类注册失败!", "错误", MB_ICONERROR); return 0; } ``` 2. **使用调试器定位NULL访问** 在RadAsm中启用调试器(如OllyDbg),观察程序是否在调用`CreateWindowEx`后因空指针访问触发异常。 3. **查看编译日志** 检查RadAsm的编译输出,确认.rc文件是否成功编译并链接,排除资源缺失导致的窗口初始化失败[^2]。 --- ### 四、代码修正示例 **错误代码片段**: ```c // 错误:窗口过程未定义,lpfnWndProc为NULL WNDCLASSEX wc = {0}; wc.lpfnWndProc = DefWindowProc; // 错误!应使用自定义处理函数 wc.hInstance = GetModuleHandle(NULL); ``` **修正后**: ```c // 正确定义窗口过程 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } // 注册窗口类 WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; // 指向有效函数 wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = "MyWindowClass"; RegisterClassEx(&wc); ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值