最简单的Windows程序

弹出一个消息框

/*  
 APIENTRY表示函数调用约定,当该函数被调用的时候,其参数按从左至右的顺序压入栈,再由调用者将参数弹出栈
 hInstance:唯一标识本程序的实例句柄,系统和其他应用程序通过该句柄与本程序通讯
 hPrevInstance:本程序的前一个实例句柄,由于32位Windows采用进程-线程模型,每个线程都拥有自己的句柄,因而该参数始终为空
 lpCmdLine:一个字符串指针,指向命令行参数字符串,没有命令行参数时为空
 nCmdShow:指明程序最初运行时窗口的打开方式,如正常打开,最大化或最小化运行
*/
int APIENTRY WinMain(HINSTANCE hInstance,     
                     HINSTANCE hPrevInstance, 
                     LPSTR     lpCmdLine,     
                     int       nCmdShow)      
{   
	/*
	  参数1:指明此消息框的父窗口句柄,为NULL则说明没有父窗口,可以在任意一个地方弹出一个消息框
	  参数2:字符串指针,指向消息框要显示的字符串
	  参数3:字符窜指针,指向消息框标题栏显示的字符串
	  参数4:无符号整数,表明消息框中显示的按钮与风格。该例中实参MB_OKCANCEL表示消息框中包含确定与取消两个按钮
	*/
 	MessageBox(NULL,"一个简单的消息框应用程序","Chap2Exa1",MB_OKCANCEL);
    
	//WinMain()函数返回一个整数值作为退出代码
	return 0; 
}


消息框的各种样式:

SDK窗口程序框架:

#include "stdafx.h"
#include "resource.h"

#define MAX_LOADSTRING 100

//全局变量
HINSTANCE hInst;								
TCHAR szTitle[MAX_LOADSTRING];								
TCHAR szWindowClass[MAX_LOADSTRING];								

ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MSG msg;
	HACCEL hAccelTable;

	// 加载字符串资源
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_CHAP2EXA2, szWindowClass, MAX_LOADSTRING);
	
	//注册窗口类
	MyRegisterClass(hInstance);                     

	//产生窗口
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}
    
    //加载快捷键资源
	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_CHAP2EXA2);

	//进入消息循环
	/*
		GetMessage()将使线程挂起,只有当消息到来的时候才会被再次激活。
	    
		函数DispatchMessage()将消息发送到消息处理函数(或者叫窗口函数)。无线
		的消息循环使主线程一直在等待消息的到达,然后再通知消息处理函数,直到得到
		一个WM_QUIT消息返回0才结束程序

        TranslateMessage()函数负责键盘信息的转化

        
	*/
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return msg.wParam;
}

//注册窗口类
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;                            //窗口过程函数
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_CHAP2EXA2); //加载图标
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);                 //加载光标
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);  
	wcex.lpszMenuName	= (LPCSTR)IDC_CHAP2EXA2;                       //定义菜单
	wcex.lpszClassName	= szWindowClass; 
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);//加载小图标

	return RegisterClassEx(&wcex);
}

//产生窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; //保存实例句柄

   //创建窗口,CreateWindow()函数只是产生窗口,并不显示窗口.ShowWindow()函数实现
   //显示窗口的功能
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }
   
   //显示窗口
   ShowWindow(hWnd, nCmdShow);
   
   //刷新窗口
   UpdateWindow(hWnd);

   return TRUE;
}

/*
	WndProc()函数是被Windows系统所调用的,所以它是一种CALL BACK(也称之为回调)函数,
	该函数可以由开发人员设计,但是不会被不该被开发人员调用,它是为Windows系统准备的
  
	消息循环中DispatchMessage()函数将信息分派到相应窗口函数中,而窗口函数
	WndProc()通过Switch方式判断消息种类,确定消息处理方式.程序运行过程中,
	消息被捕获后,不断地被传送给窗口并且分派到窗口函数中
*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR szHello[MAX_LOADSTRING];
	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

	switch (message) 
	{
		case WM_COMMAND:
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam); 
			
			
			switch (wmId)
			{
				case IDM_ABOUT:
					{
						/*
							参数1:hInstance用于标识应用程序的实例
							参数2:lpTemplate用于标识对话框模板,此参数
							      可以是指向一个以NULL结尾的字符串指针
								  该字符串指定对话框模板名,也可以是指定
								  对话框模板的资源标示符中的一个整数值
							参数3:hWndParent用于指向该对话框的父窗口
							参数4:lpDialogFunc表示一个指向对话框过程的
							      指针
							如果该函数调用成功,则返回为0值,其为EndDialog()
							调用中的nResult参数
							如果该函数调用失败,则返回值为0
						*/
						DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
					}
				   break;
				case IDM_EXIT:
				   DestroyWindow(hWnd);
				   break;
				default:
				   return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			// 在这里添加自己的代码
			RECT rt;
			GetClientRect(hWnd, &rt);
			DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
			EndPaint(hWnd, &ps);
			break;

		case WM_LBUTTONDOWN:  //处理鼠标事件
			{
				MessageBox(hWnd, "鼠标左键被按下!", "鼠标事件", MB_OK);
			}
			break;
		
		case WM_KEYDOWN:      //处理键盘事件
			{
				switch(wParam)
				{
				case VK_TAB:
					{
						MessageBox(hWnd, "键盘TAB键按下!", "键盘事件", MB_OK);
					}
					break;
				default:
					{
						MessageBox(hWnd, "TAB键之外的按键!", "键盘事件", MB_OK);
					}
					break;
				}
			}
			break;

		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

// 关于对话框的消息处理函数
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:
				return TRUE;

		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
			{
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
    return FALSE;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值