Windows程序

     Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。
     客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。
     因此,建立窗口后,将进入一个循环。在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。循环退出后,程序即结束。

下面是一个相应鼠标左键单击事件的小示例:

01

02

03

04 

#include <windows.h>

void InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);


/********************************************
 * WinMain			主程序入口				*
 ********************************************
 * hInstance		面向应用程序的当前句柄	*
 * hPrevInstance	此时的当前句柄			*
 * lpCmdLine		命令行的字符串			*
 * nCmdShow			启动时的显示方式		*
 ********************************************/
int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MSG msg;
	MessageBox(GetFocus(),"Hello world!","Message",MB_OK);
	//MessageBox(NULL,"Hello world!","Message",MB_OK);
	//MessageBox(NULL,lpCmdLine,"CmdLine",0);
	InitApplication(hInstance);
	if(InitInstance(hInstance,nCmdShow))
	{
		//return 0;
		while(GetMessage(&msg,(HWND)NULL,(UINT)NULL,(UINT)NULL))
		{
			TranslateMessage(&msg);	
			DispatchMessage(&msg);
		}
	}
	return (msg.wParam);
}

/************************************
 * InitApplication  初始化程序		*
 ************************************
 * hInstance		面对应用的句柄	*
 ************************************/
void InitApplication(HINSTANCE hInstance)
{
	// 注册窗口类
	WNDCLASSEX wc;
	wc.cbSize=sizeof(wc);
	wc.style=CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc=(WNDPROC)MainWndProc;
	wc.cbClsExtra=0;
	wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wc.hCursor=LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName=NULL;
	wc.lpszClassName="MainClass";
	wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
	if (!RegisterClassEx(&wc))
	{
		MessageBox (NULL, TEXT ("RegisterClass Fail!"), 
		“Message”, MB_ICONERROR) ;
	}
}

/********************************
 * InitInstance 初始化窗口		*
 ********************************
 * hInstance	面对应用的句柄	*
 * nCmdShow		启动时的显示方法*
 ********************************/
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
	HWND hWnd;
	hWnd=CreateWindow("MainClass", // 窗口类名称
					  "Image Processing",// 窗口标题
					  WS_OVERLAPPEDWINDOW, // 窗口风格
					  CW_USEDEFAULT, // 窗口位置大小
					  CW_USEDEFAULT,
					  CW_USEDEFAULT,
					  CW_USEDEFAULT,
					  NULL, // 父視窗的 handle,若本視窗是父視窗,則設為 NULL
					  NULL, // 選單的 handle
					  hInstance, // 主程式句柄
					  NULL); // 額外資料的指標,若無額外資料通常都設為 NULL
	if (hWnd==NULL)
		return (FALSE);
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}

/****************************
 * MainWndProc  信息的处理	*
 ****************************
 * hWnd			窗口		*
 * message		信息		*
 * wParam		字参数		*
 * lParam		长参数		*
 ****************************/
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	// 处理感兴趣的消息
	switch (message)
	{
		// 鼠标左键按下事件
		case WM_LBUTTONDOWN:
			MessageBox(hWnd,"鼠标左键已被按下!","Message",MB_OK);
			break;

		// 当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
		case WM_DESTROY:
			MessageBox(GetFocus(),"Thank you for used!","Message",MB_OK);
			PostQuitMessage(0);
			break;

		// 不感兴趣的消息转交给系统提供的缺省处理函数处理
		default:
			return DefWindowProc(hWnd,message,wParam,lParam);
	}
	return 0;
}

原文地址:https://www.cnblogs.com/herbertchina/p/3272985.html