#include
#include "resource.h" //这个头文件的作用就是定义控件等ID的数学值,全部是UINT类型的
#include "generic.h" //头文件。内容见最后面
//2个全局变量
HINSTANCE _hInst; //主程序句柄
HWND _hWnd;//主窗口句柄
char _szAppName[] = "Generic"; //程序名
char _szTitle[] = "Generic Sample Application"; //窗口名
//---------------------------------------------------------------------
//---------------------------------------------------------------------
//系统自动为下面前2个变量分配非0值
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR lpCmdLine, int nCmdShow)
//第一个是程序当前实例的句柄,第2个是程序前一个实例的句柄
//在32位操作系统中,hPrevInstance的值总为0,因为在32位系统中
//一个程序的不同实例是封装在不同的地址空间(4GB)中的
{
MSG msg;//定义一个消息,MSG是一个windows32位结构体
UNREFERENCED_PARAMETER(lpCmdLine);//避免编译器出错
if (!hPrevInstance)
if (!InitApplication(hInstance))//调用下面函数⑴
return (FALSE);//如果初始化失败,给系统返回一个程序失败:false!
if (!InitInstance(hInstance, nCmdShow))//调用下面函数(2)
return (FALSE);
//程序的主题:得到消息,处理消息,其中如果得到一个消息msg为“EXIT”指令消息的话,循环结束,程序结束
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam); //事实上这最后一个msg一定是让程序关闭的msg,msg是一个结构,里面的mParam保存退出的信息
//返回给系统
}
//---------------------------------------------------------------------
//---------------------------------------------------------------------
BOOL InitApplication(HINSTANCE hInstance)//函数⑴,作用是注册程序主窗口
{
WNDCLASS wc;//wc是一个结构,含有11个参数,是11个,不是10个!
//这下面写了10个,还有一个不知道哪去了,具体请自己去查WIN21APIs,函数名字creatwindow()
wc.style = CS_HREDRAW | CS_VREDRAW;//窗口的样式
wc.lpfnWndProc = (WNDPROC)WndProc; //调用函数(3),定义这个窗口怎么样处理对应的消息
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;//程序进程的句柄
wc.hIcon = LoadIcon(hInstance, "jjhouricon");//图标句柄
wc.hCursor = LoadCursor(NULL, IDC_ARROW);//鼠标外观句柄
wc.hbrBackground = GetStockObject(WHITE_BRUSH); //程序背景颜色刷子
wc.lpszMenuName = "GenericMenu"; //菜单名
wc.lpszClassName = _szAppName;//程序名
return (RegisterClass(&wc));//注册
}
//---------------------------------------------------------------------
//---------------------------------------------------------------------
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)//函数(2)
{
_hInst = hInstance;
//产生窗口,但是不显示出来
_hWnd = CreateWindow(
_szAppName,//程序名
_szTitle,//窗口名
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);//这些具体的值的意义可以从WIN32API中获得
//确认
if (!_hWnd)
return (FALSE);
//显示窗口
ShowWindow(_hWnd, nCmdShow);
UpdateWindow(_hWnd);
return (TRUE);
}
//---------------------------------------------------------------------
//---------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam)//函数(3)
{
int wmId, wmEvent;
switch (message)
{
case WM_COMMAND://普通的命令。可以简单理解为鼠标单击菜单所产生的消息
wmId = LOWORD(wParam);//wParam是一个32位的。这里得到32位中的底16为所保存的值----消息的ID
wmEvent = HIWORD(wParam);
switch (wmId) {
case IDM_ABOUT:
DialogBox(_hInst,
"AboutBox",
hWnd,
(DLGPROC)About //调用函数(4)
);//产生关于对话框
break;
case IDM_EXIT:
DestroyWindow (hWnd);
break;
default://默认的结束程序的方式。调用这个函数让系统来关闭这个函数
return (DefWindowProc(hWnd, message, wParam, lParam));
}
break;
case WM_DESTROY://普通的关闭程序的消息,当主函数中while循环中得到这个消息后,循环结束,程序结束
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));//同上
}
return (0);
}
//---------------------------------------------------------------------
LRESULT CALLBACK About(HWND hDlg,UINT message,WPARAM wParam, LPARAM lParam)//函数(4)
{
UNREFERENCED_PARAMETER(lParam); //作用同上
//原理同上
switch (message)
{
case WM_INITDIALOG:
return (TRUE);
case WM_COMMAND:
if (LOWORD(wParam) == IDOK|| LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, TRUE);//结束对话框
return (TRUE);
}
break;
}
return (FALSE);
}
//---------------------------------------------------------------------------
//附件: generic.h内容
/*
BOOL InitApplication(HANDLE);
BOOL InitInstance(HANDLE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
*/