弹出一个消息框
/*
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;
}