Windows窗体程序开发基本流程

转自孙鑫老师的VC++系列第一课

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

//窗口过程函数,即回调函数,该函数的代码由操作系统自动调用,CALLBACK表示__stdcall标准调用约定
LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // 窗口句柄
  UINT uMsg,      // 消息识别符
  WPARAM wParam,  // 第一个消息参数
  LPARAM lParam   // 第二个消息参数
);

 //WinMain函数由系统调用,里面的四个参数均由系统赋值
int WINAPI WinMain(        
  HINSTANCE hInstance,      // 当前程序的实例句柄
  HINSTANCE hPrevInstance,  // 之前程序的实例句柄
  LPSTR lpCmdLine,          // Cmd运行的指令
  int nCmdShow              // 显示的状态,如最大最小
)
{	
	//开始设计窗口类
	WNDCLASS wndcls;
	wndcls.cbClsExtra=0;//类的额外内存,默认为0即可
	wndcls.cbWndExtra=0;//窗口的额外内存,默认为0即可
	wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换)
	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;
	//产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名
	hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

	ShowWindow(hwnd,SW_SHOWNORMAL);//把窗体显示出来

	UpdateWindow(hwnd);//更新窗体

	MSG msg;
	//消息循环
	while(GetMessage(&msg,NULL,0,0))//如果消息不是WM_QUIT,返回非零值;如果消息是WM_QUIT,返回零
	{
		TranslateMessage(&msg);//翻译消息,如把WM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息
		DispatchMessage(&msg);//派发消息
	}
	return 0;
}

LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // 窗口句柄
  UINT uMsg,      // 消息识别符
  WPARAM wParam,  // 第一个消息参数
  LPARAM lParam   // 第二个消息参数
)
{
	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 hdc;
		hdc=GetDC(hwnd);//GetDC与ReleaseDC组合使用
		TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
		ReleaseDC(hwnd,hdc);//要释放HDC,如果不释放会导致内存泄漏
		break;
	case WM_PAINT://响应重绘消息
		/*当窗体的width和height改变的时候(比如用鼠标调整了窗体的大小)会触发重绘事件,
		但是通过标题栏移动窗体不会触发重绘事件,窗体第一次显示的时候也会触发重绘事件。
		BeginPaint和EndPaint必须组合使用,并且只能出现在响应重绘消息的地方*/
		HDC hDC;
		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);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环
		break;
	default:
		return DefWindowProc(hwnd,uMsg,wParam,lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值