#include
#define ID_EDIT 1
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);//首先是一个回调函数的声明
TCHAR szAppName[] = TEXT ("PopPad1") ;//窗口名字
int WINAPI WinMain (HINSTANCE hInstance,//应用程序当前实例的句柄
HINSTANCE hPrevInstance,//应用程序先前的实例句柄
PSTR szCmdLine, //指向应用程序命令行的字符串的指针
int iCmdShow)//指明窗口如何显示
{
HWND hwnd ;//当前实例的句柄
MSG msg ;//消息
WNDCLASS wndclass ;//类名
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//窗口的显示方式,此处为水平重画和竖直重画
wndclass.lpfnWndProc = WndProc ;//窗口回调函数
wndclass.cbClsExtra = 0 ;//窗口扩展,此处为0
wndclass.cbWndExtra = 0 ;//窗口实例扩展,此处为0
wndclass.hInstance = hInstance ;//窗口的实例句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//窗口的显示方式,此处设置为应用程序型
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;///鼠标的显示方式,此处设置为标准型
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;//窗口背景颜色的设置,此处设置为白色
wndclass.lpszMenuName = NULL ;//窗口菜单,此处没菜单设为NULL
wndclass.lpszClassName = szAppName ;//窗口类名
if (!RegisterClass (&wndclass))//注册窗口,若注册失败,产生如下的信息
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
////创建窗口,如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL
hwnd = CreateWindow (szAppName,
szAppName,//窗口的名字
WS_OVERLAPPEDWINDOW,//指定创建窗口的风格
CW_USEDEFAULT,//指定窗口的初始水平位置,
CW_USEDEFAULT,//指定窗口的初始垂直位置
CW_USEDEFAULT,//以设备单元指明窗口的宽度
CW_USEDEFAULT,//以设备单元指明窗口的高度
NULL, //指向被创建窗口的父窗口或所有者窗口的句柄,此处为NULL
NULL, //菜单句柄,或依据窗口风格指明一个子窗口标识,此处为NULL
hInstance, //与窗口相关联的模块实例的句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
ShowWindow (hwnd, iCmdShow) ;//显示窗口,hWnd:指窗口句柄。iCmdShow:指定窗口如何显示
UpdateWindow (hwnd) ; //更新窗口,hWnd:指窗口句柄
while (GetMessage (&msg, NULL, 0, 0))//消息循环
{
TranslateMessage (&msg) ;//该函数将虚拟键消息转换为字符消息
DispatchMessage (&msg) ;//该函数分发一个消息给窗口程序
}
return msg.wParam ;//wParam是消息携带的参数,可以是个值,也可以是个地址
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndEdit ;
switch (message)
{
case WM_CREATE :
//此处为创建一个子窗口的句炳
hwndEdit = CreateWindow (TEXT ("edit"),
NULL,//子窗口的名字,此处为NULL
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
WS_BORDER | ES_LEFT | ES_MULTILINE |
ES_AUTOHSCROLL | ES_AUTOVSCROLL,
//以上参数为子窗口的风格
//WS_CHILD创建子窗口,但是不能用于WS_POPUP(创建一个弹出窗口)风格
//WS_VISIBLE意为创建一个最初是可见的窗口
//WS_HSCROLL创建一个最初有水平滚动条的窗口
//WS_VSCROLL创建一个最初有垂直滚动条的窗口
//WS_BORDER创建一个有边界的窗口
//ES_LEFT文本左对齐
//ES_MULTILINE设置多个编辑控件
//ES_AUTOHSCROLL创建一个自动水平滚动的逻辑控件
//ES_AUTOVSCROLL创建一个自动竖直滚动的逻辑控件(更多参数请查阅MSDN)
0, 0, 0, 0, //子窗口的位置和大小,此处为0
hwnd, //父窗口的句柄
(HMENU) ID_EDIT,//子窗口的标识
((LPCREATESTRUCT) lParam) -> hInstance, //子窗口的当前实例句柄
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndEdit) ;//该函数对指定的窗口设置键盘焦点
return 0 ;
case WM_SIZE :
MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam),TRUE) ;
//MoveWindow函数功能:改变指定窗口的位置和大小
//第一个参数指定了窗口的句柄
//第二个参数为新x位置
//第三个参数为新y位置
//第四个参数为新宽度
//第五个参数为新高度
//第六个参数为重绘标志
return 0 ;
case WM_COMMAND :
if (LOWORD (wParam) == ID_EDIT)
if (HIWORD (wParam) == EN_ERRSPACE ||
HIWORD (wParam) == EN_MAXTEXT)
//EN_MAXTEXT当编辑框中的文本超过了指定字符数时,文本将被截断,同时父窗口收到此消息
//EN_ERRSPACE当编辑框无法获取足够内存以完成某项特殊要求时,父窗口会收到这一消息
MessageBox (hwnd, TEXT ("Edit control out of space."),
szAppName, MB_OK | MB_ICONSTOP) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;//该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理
}
下面有不懂的地方
case WM_COMMAND :
if (LOWORD (wParam) == ID_EDIT)
if (HIWORD (wParam) == EN_ERRSPACE ||
HIWORD (wParam) == EN_MAXTEXT)