此文章参考了其他作者的解决方法:
https://blog.csdn.net/hxl5955/article/details/55211054, http://www.cnblogs.com/WinonaJia/p/7677030.html
当我运行下面代码的时候出现了两个错误1.undefined reference to `GetStockObject@4'
2:undefined reference to `PlaySoundA@12'
1:undefined reference to `GetStockObject@4'的解决办法
右键工程->Properties->Build targets->Type:选择 GUI application 确定后重新编译即可。
或者 加上链接UI库:
右键工程->Properties->Build targets->Build options->Linker settings->Other linker options下加上-mwindows,确定,重新编译。
2:undefined reference to `PlaySoundA@12'的解决办法
project -> bulid options 点linker settings 再点add 添加winmm后ok即可。
此外,音乐格式必须为“.wav”,还要注意音乐文件的路径放在指定工程的文件夹下。
#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("HelloWin");
HWND hwnd;
MSG msg;//MSG消息结构
WNDCLASS 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);//LoadIcon函数:加载图标,以供程序使用
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//LoadCursor函数:加载鼠标光标,以供程序使用
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//GetStockObject函数:获取一个图形对象
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))//RegisterClass函数:为应用程序的窗口注册一个窗口类
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);// MessageBox函数:显示消息框
return 0;
}
//CreateWindow函数:基于窗口类创建一个窗口
hwnd=CreateWindow(szAppName,//窗口类名称
TEXT("The Hello Program"),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格或窗口格式
CW_USEDEFAULT,//初始x坐标
CW_USEDEFAULT,//初始y坐标
CW_USEDEFAULT,//初始x方向尺寸
CW_USEDEFAULT,//初始y方向尺寸
NULL,//父窗口句柄
NULL,//窗口菜单句柄
hInstance,//程序实例句柄
NULL);//创建参数
ShowWindow(hwnd,iCmdShow);//ShowWindow函数:在屏幕中显示窗口
UpdateWindow(hwnd);//UpdateWindow函数:指示窗口对其自身进行重绘
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;//HDC设备环境句柄
PAINTSTRUCT ps;//PAINTSTRUCT绘制结构
RECT rect;//RECT矩形结构
switch(message)
{
case WM_CREATE:
PlaySound(TEXT("gamemusic.wav"),NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);//播放声音文件
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);//标明窗口绘制文件
GetClientRect(hwnd,&rect);//获取窗口客户区的尺寸
DrawText(hdc,TEXT("Hello,Windows 98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);//显示一个文本字符串
EndPaint(hwnd,&ps);//结束窗口绘制
return 0;
case WM_DESTROY:
PostQuitMessage(0);//将“退出”消息插入消息队列
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);//执行默认的消息处理
}
时隔。。。。。。。。。。。。。。。。。。。。。。。。。。这么多天,我又重新开始看这本书《Windows编程(第五版)》,用VS2019写的时候,出现错误:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 Project1 C:\Users\dell\source\repos\Project1\MSVCRTD.lib(exe_main.obj) 1
修改方法:右键project->属性->链接器->系统->子系统->改:窗口 (/SUBSYSTEM:WINDOWS)