Demo entry 6634724

windows

   

Submitted by anonymous on Aug 13, 2017 at 16:20
Language: C++. Code size: 5.0 kB.

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

LRESULT CALLBACK WinLinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	//hInstance表示该程序当前运行的实例的句柄。当程序在windows下运行,它唯一标识运行中的实例(只有运行中的程序实例,才有实例句柄)
	//一个应用程序可运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,通过hInstance参数传递给WinMain函数
	//hPrevInstance,当前实例的前一个实例,WIN32下总为NULL
	//lpCmdLine指定传递给应用程序的命令行参数
	//指定窗口应如何显示,由程序调用者决定,应用程序无需理会这个参数的值

	//设计一个窗口类
	WNDCLASS wndcls;
	wndcls.cbClsExtra = 0;//类附加内存,属于这种窗口类的所有窗口共享
	wndcls.cbWndExtra = 0;//窗口附加内存
	wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景颜色
	wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);	//NULL表示由系统提供的光标资源文件
	wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndcls.hInstance = hInstance;//指定包含窗口过程的程序的实例句柄
	wndcls.lpfnWndProc = WinLinProc;//指向窗口过程函数指针
	wndcls.lpszClassName = "Simon";//窗口类的名字
	wndcls.lpszMenuName = NULL;//指定菜单资源的名字,NULL表示基于这个窗口类创建的窗口没有默认菜单
	wndcls.style = CS_HREDRAW | CS_VREDRAW;//水平重绘或垂直重绘

	//注册窗口
	RegisterClass(&wndcls);

	//创建窗口
	HWND hwnd;	//定义一个变量用来保存成功创建窗口后返回的句柄
	hwnd = CreateWindow("Simon", "我的第一个Windows窗口", WS_OVERLAPPEDWINDOW, 70, 100, 600, 400, NULL, NULL, hInstance, NULL);
	/*	HWND CreatWindow
	{
		LPCTSTR lpClassName,      //WNDCLASS中的lpszClassName成员指定的名称
		LPCTSTR lpWindowName,       //指定窗口名称(显示在标题栏中)
		DWORD dwStyle,    //指定创建窗口的样式。(区别于WNDCLASS中的style,基于该窗口类创建的窗口都具有该样式),dwStyle指定某个具体窗口样式
		int x,//窗口左上角的坐标(x,y)
		int y,
		int nWidth,//窗口的宽度和高度
		int nHeight;
		HWND hWndParent,//指定被创建窗口的父窗口句柄
		HWND hMenu,//指定窗口菜单句柄
		HANDLE hInstance,//指定窗口所属应用程序实例的句柄
		LPVOID lpParam,//作为WM_CREATE消息的附加参数lParam传入的数据指针。多数窗口将这个参数设为NULL
	};*/
	//显示及刷新窗口
	ShowWindow(hwnd, SW_SHOWNORMAL);//SW_SHOWNORMAL:激活并显示窗口。若窗口在最大化或最小化的状态,系统将窗口恢复到原来的尺寸和大小。
									//应用程序在第一次显示窗口的时候应该指定此标志
	UpdateWindow(hwnd);//UpdateWindow函数通过发送一个WM_PAINT消息来刷新窗口

	//消息循环
	MSG msg;//定义消息结构体变量
	//注:每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,消息队列用来存放该程序创建的窗口的消息
	//言外之意,用户在程序上有操作时,系统会把其转为message存至MSG结构体
	/*typedef struct tagMSG 
{     
    HWND   hwnd;      //消息所属窗口(即准备接收消息的窗口)
    UINT   message;     //指定消息的标识符--鼠标左键按下:WM_LBUTTONDOWN,键盘按下:WM_KEYDOWN,字符消息:WM_CHAR,数字表示,采用宏定义
    WPARAM wParam;    //消息的附加信息--message为WM_CHAR时,wParam表示具体字符
    LPARAM lParam;     //消息的附加信息
    DWORD  time;     //消息投递到消息队列中的时间
    POINT  pt;      //鼠标的当前位置
} MSG;
*/
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);//将虚拟键消息转换为字符消息
		//字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。
		//当敲击键盘上的某个字符时,系统产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数
		//(wPararm和lParam)包含的是虚拟键代码和扫描码等信息,而在程序中往往需要得到某个字符
		//的ASCII码,TranslateMessage可以将WM_KEYDOWN和WM_KEYUP消息组合转换为一条WM_CHAR消息,
		//(该消息的wParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息队列
		//中去。
		//TranslateMessage函数不会修改原有消息,它只是产生新的消息并投递到消息队列中。
		DispatchMessage(&msg);//分派一个消息到窗口过程,由窗口过程对消息进行处理
		//DispatchMessage实际上时将消息回传给操作系统,由操作系统调用窗口过程函数对消息进行处理(响应)。
	}
	return msg.wParam;
}

/*BOOL GetMessage(
	LPMSG lpMsg,//指向MSG消息结构体
	HWND hWnd,//指定接收属于哪一个窗口的消息,通常设为NULL,用于接收属于调用线程的所有窗口的窗口消息。
	UNINT wMsgFilterMin,//指定获取消息的最小值,通常设为0
	UNINT wMsgFilterMax)//指定获取消息的最小值,通常设为0    二者同时置0表示接收所有消息

	GetMessage函数接收到除WM_QUIT外的消息均返回非零值。接收WM_QUIT消息返回0;出现错误返回-1
*/

//编写窗口过程函数
//WinLinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  消息的窗口句柄、消息代码、消息代码的两个附加参数
LRESULT CALLBACK WinLinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CHAR:
		char szChar[20];
		sprintf_s(szChar, "输入字符为%d", wParam);
		MessageBox(hwnd, szChar, "字符", 0);
		//MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK )
		//lpszText 包含了要显示的信息,lpszCaption 被用作消息框标题,如果lpszCaption为NULL,则将使用缺省的标题“Error”
		//nType指定了消息框的内容和行为
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd, "点击鼠标", "消息", 0);
		HDC hdc;
		hdc = GetDC(hwnd);
		TextOut(hdc, 0, 50, "林兴木", strlen("林兴木"));
		//TextOut( int x, int y, LPCTSTR lpszString, int nCount );
		//x指定文本起点的X逻辑坐标,y指定文本起点的Y逻辑坐标(逻辑坐标:相对于窗口而言),lpszString要绘制的字符串的指针,nCount字符串中的字节数
		ReleaseDC(hwnd, hdc);//释放DC所占用的资源
		break;

		//由UpdateWindow函数函数发送
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;//用于接收绘制的信息
		hDC = BeginPaint(hwnd, &ps);//要得到窗口DC,必须调用BeginPaint,其只能在WM_PAINT消息的响应代码中使用,在其他地方,只能使用GetDC来得到DC句柄
		//在调用BeginPaint时,若客户区背景还没有擦除,那么BeginPaint会发送WM_ERASEBKGND消息给窗口,系统会使用WNDCLASS结构体的的hbrBackground
		//成员指定画刷来擦除背景
		TextOut(hDC, 0, 0, "Thinkpad", strlen("Thinkpad"));
		EndPaint(hwnd, &ps);//BeginPaint得到的DC,必须用EndPaint函数释放
		break;
	case WM_CLOSE://控制程序是否退出
		if (IDYES == MessageBox(hwnd, "是否真的结束?", "消息", MB_YESNO))
		{
			DestroyWindow(hwnd);//执行后向窗口过程发送WM_DESTROY消息
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		//PostQuitMessage向应用程序消息队列中投递一条WM_QUIT消息并返回,消息循环结束
		break;
	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);
		//对WM_CLOSE消息的响应并不是必须的,若应用程序未对该消息进行响应,系统把该消息传给DefWindowProc,DefWindowProc
		//函数调用DestroyWindow响应这条WM_CLOSE消息
	}
	return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).