#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);
*/