VC++关于WinMain程序的学习笔记(1)

目录

WinMain程序如下:

接下:VC++关于WinMain程序的学习笔记(2)

原文:VC++关于WinMain程序的学习笔记(1)


WinMain程序如下:

#include <windows.h>
#include <stdio.h>

	//消息是由MSG结构体来表示的。
LRESULT CALLBACK WinSunProc(
	HWND hwnd,  		// handle to window表示消息所属的窗口
	UINT uMsg,    		// message identifier指定了消息的标识符
	WPARAM wParam,		// first message parameter指定消息的附加信息
	LPARAM lParam 		// second message parameter指定消息的附加信息
);

	//WinMain是Windows程序的入口点函数。
int WINAPI WinMain(
	HINSTANCE hInstance,  		// handle to current instance该程序当前运行的实例的句柄
	HINSTANCE hPrevInstance,		// handle to previous instance当前实例的前一个实例的句柄
	LPSTR lpCmdLine,       		// command line一个以空终止的字符串,指定传递给应用程序的命令行参数。
	int nCmdShow           			// show state指定程序的窗口应该如何显示
)

{
	//窗口的特征就是由WNDCLASS结构体来定义的。
	//设计一个窗口类
	WNDCLASS wndcls;
	wndcls.cbClsExtra = 0; //为系统中的每一个窗口类管理一个 WNDCLASS 结构。不应使用(应为零)
	wndcls.cbWndExtra = 0; //为每一个窗口管理一个内部数据结构,不应使用(应为零)
	wndcls.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //hbrBackground指定窗口类的背景画刷句柄。背景色
	wndcls.hCursor = LoadCursor(NULL, IDC_ARROW); //hCursor 指定窗口类的光标句柄。当鼠标悬停在窗口上时的游标
	wndcls.hIcon = LoadIcon(NULL, IDI_QUESTION); //hIcon指定窗口类的图标句柄。框架窗口的图标
	wndcls.hInstance = hInstance; //hInstance指定包含窗口过程的程序的实例句柄。自动填充 AfxGetInstanceHandle,应用程序实例句柄由WinMain函数传进来
	wndcls.lpfnWndProc = WinSunProc; //函数指针,指向窗口过程函数。窗口进程,必须是 AfxWndProc
	wndcls.lpszClassName = "have a happy day"; // lpszClassName 是一个以空终止的字符串,指定窗口类的名字。类名
	wndcls.lpszMenuName = NULL; //lpszMenuName是一个以空终止的字符串,指定菜单资源的名字。不应使用(应为NULL)
	wndcls.style = CS_HREDRAW | CS_VREDRAW;//style指定这一类型窗口的样式,当窗口水平方向垂直方向上的高度发生变化时,将重新绘制整个窗口。
	
	//在设计完窗口类(WNDCLASS)后,需要调用 RegisterClass 函数对其进行注册,在注册成功后,才可以创建该类型的窗口。
	RegisterClass(&wndcls);
	
	//创建窗口,定义一个变量用来保存成功创建窗口后返回的句柄
	HWND hwnd;
	hwnd = CreateWindow("have a happy day", "hello",
		WS_OVERLAPPEDWINDOW, 10, 10, 500, 500, NULL, NULL, hInstance, NULL);

	//显示及刷新窗口
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);

	//定义消息结构体,开始消息循环
	MSG msg;
	BOOL bRet;
	//while (GetMessage(&msg, NULL, 0, 0))
	while ((bRet = GetMessage(&msg, hwnd, 0, 0)) != 0)
	{
		if (bRet == -1)
		{
			// handle the error and possibly exit
			return -1;
		}
		else
		{
			TranslateMessage(&msg);//用于将虚拟键消息转换为字符消息。
			DispatchMessage(&msg);//分派一个消息到窗口过程,由窗口过程函数对消息进行处理。
		}	
	}
	return msg.wParam;
}

//编写窗口过程函数
LRESULT CALLBACK WinSunProc(
	HWND hwnd,  		// handle to window,消息的窗口句柄
	UINT uMsg,   		// message identifier,消息代码
	WPARAM wParam,	// first message parameter,消息代码的附加参数
	LPARAM lParam 		// second message parameter,消息代码的附加参数
)
{
	switch (uMsg)
	{
	case WM_CHAR://当用户在窗口中按下一个字符键,程序将得到一条WM_CHAR消息
		char szChar[20];
		sprintf_s(szChar, sizeof(szChar), "char code is %d", wParam);
		MessageBox(hwnd, szChar, "char", 0);//弹出一个包含了显示信息的消息框
		break;
	case WM_LBUTTONDOWN://当用户在窗口中按下鼠标左键时,将产生WM_LBUTTONDOWN消息调用MessageBox,函数弹出一个提示信息,告诉用户“点击了鼠标”
		MessageBox(hwnd, "mouse clicked", "message", 0);
		HDC hdc;//定义了一个类型为HDC的变量hdc
		hdc = GetDC(hwnd);//用hdc保存GetDC函数返回的与特定窗口相关联的DC的句柄。不能在响应WM_PAINT消息时调用
		TextOut(hdc, 0, 50, "HAVE A NICE DAY!", strlen("HAVE A NICE DAY!"));//TextOut函数利用得到的DC句柄在指定的位置(x坐标为0,y坐标为50)输出一行文字
		ReleaseDC(hwnd, hdc);//如果使用GetDC函数来得到DC的句柄,那么在完成图形操作后,必须调用ReleaseDC函数来释放DC所占用的资源,否则会引起内存泄漏。
		break;
	case WM_PAINT://对WM_PAINT消息进行处理。当窗口客户区的一部分或者全部变为“无效”时,系统会发送WM_PAINT消息,通知应用程序重新绘制窗口。
		HDC hDC;
		PAINTSTRUCT ps;
		hDC = BeginPaint(hwnd, &ps);//调用BeginPaint函数得到DC的句柄。BeginPaint函数的第1个参数是窗口的句柄,第二个参数是PAINTSTRUCT结构体的指针,该结构体对象用于接收绘制的信息。BeginPaint只能在响应WM_PAINT消息时调用
		TextOut(hDC, 0, 0, "https://blog.csdn.net/qq_44974888/article/details/124137129?spm=1001.2014.3001.5501", strlen("https://blog.csdn.net/qq_44974888/article/details/124137129?spm=1001.2014.3001.5501"));//TextOut函数在(0,0)的位置输出一个网址
		EndPaint(hwnd, &ps);//BeginPaint函数得到的DC,必须用EndPaint函数去释放
		break;
	case WM_CLOSE://当用户单击窗口上的关闭按钮时,系统将给应用程序发送一条WM_CLOSE 消息。
		if (IDYES == MessageBox(hwnd, "是否退出程序?", "warning", MB_YESNO))
		{
			DestroyWindow(hwnd);//调用DestroyWindow函数销毁窗口
		}//DestroyWindow 函数在销毁窗口后会向窗口过程发送 WM_DESTROY 消息。注意,此时窗口虽然销毁了,但应用程序并没有退出。
		break;
	case WM_DESTROY://DestroyWindow函数在销毁窗口后,会给窗口过程发送WM_DESTROY消息,在该消息的响应代码中调用PostQuitMessage函数
		PostQuitMessage(0);//PostQuitMessage函数向应用程序的消息队列中投递一条WM_QUIT消息并返回
		break;//GetMessage函数只有在收到WM_QUIT消息时才返回0,此时消息循环才结束,程序退出
	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对WM_CLOSE消息的响应并不是必须的,如果应用程序没有对该消息进行响应,系统将把这条消息传给DefWindowProc函数,那么DefWindowProc函数则调用DestroyWindow函数来响应这条WM_CLOSE消息。
	}
	return 0;
}

接下:VC++关于WinMain程序的学习笔记(2)

原文:VC++关于WinMain程序的学习笔记(1)

最简单的winmain程序 #include #include LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"weixin",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","weixin",0); hdc=GetDC(hwnd); TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训")); ReleaseDC(hwnd,hdc); break; case WM_PAINT: PAINTSTRUCT ps; hdc=BeginPaint(hwnd,&ps); TextOut(hdc,0,0,"维新培训",strlen("维新培训")); EndPaint(hwnd,&ps); break; case WM_CLOSE: if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO)) DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WinSunProc; wndcls.lpszClassName="Weixin2003"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); HWND hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); DWORD dwStyle=GetWindowLong(hwnd, GWL_STYLE); dwStyle&=~(WS_SIZEBOX|WS_MAXIMIZEBOX|WS_MINIMIZEBOX); SetWindowLong(hwnd, GWL_STYLE, dwStyle); ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米酒馆

鼓励鼓励,鼓励很重要啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值