#include
#include
#include
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, //HINSTANCE实例(程序自身)句柄
PSTR szCmdeLine, int iCmdShow )
{
static TCHAR szAppName[] = TEXT( "HelloWin" );
HWND hwnd; //窗口句柄
MSG msg; //消息结构
/*-------------------------------------------------------------------------------------------------------------------
typedef struct tagMSG
{
HWND hwnd; //消息发向的窗口的句柄
UINT message; //消息标示符,以前缀WM(window message)开头
WPARAM wParam; //一个32位的消息参数
LPARAM lParam; //一个32位的消息参数
DWORD time; //消息放入消息队列的时间
POINT pt; //消息放入消息队列时的鼠标坐标
}
----------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------注册窗口------------------------------*/
WNDCLASS wndclass; //窗口类结构
wndclass.style = CS_HREDRAW | CS_VREDRAW; //CS:类风格选项-这两个标示符确保了改变窗口大小要刷新窗口
wndclass.lpfnWndProc = WndProc; //所有基于这个类来创建的窗口所使用的窗口过程的地址
wndclass.cbClsExtra = 0; //用于在类结构的窗口结构中预留一些空间
wndclass.cbWndExtra = 0; //在windows内部保存的窗口中预留空间;cb前缀是字节数的意思
wndclass.hInstance = hInstance; //程序的实例句柄
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); //LoadIcon()加载图标供程序使用;IDI图标ID号
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); //LoadCursor()加载鼠标指针供程序使用;IDC光标ID号
wndclass.hbrBackground = ( HBRUSH )GetStockObject( WHITE_BRUSH ); //获取一个图形对象,这里是一个绘制背景的刷子
wndclass.lpszMenuName = NULL; //应用程序菜单
wndclass.lpszClassName = szAppName; //窗口类的文本名
if( !RegisterClass( &wndclass ) ) //为程序窗口注册窗口类
{
MessageBox( NULL, TEXT( "This program requires Windows NT!" ), //显示消息框
szAppName, MB_ICONE RROR );
return 0;
}
/*----------------------------------创建窗口--------------------------------*/
hwnd = CreateWindow( szAppName, //CreateWindow(WNDCLASS *)创建一个窗口;窗口类名
TEXT( "The Hello Program !" ), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口类型;WS窗口风格
CW_USEDEFAULT, //初始化x轴位置;CW创建窗口选项
CW_USEDEFAULT, //初始化y轴位置
CW_USEDEFAULT, //初始化x轴大小
CW_USEDEFAULT, //初始化y轴大小
NULL, //父窗口处理
NULL, //窗口菜单处理
hInstance, //程序实例处理
NULL ); //创建参数,可以用这个指针访问以后想要引用的程序的数据
/*----------------------------------显示窗口----------------------------------*/
ShowWindow( hwnd, iCmdShow ); //显示窗口
UpdateWindow( hwnd ); //指示窗口刷新自己
/*-------------------------------进入循环消息队列,取出消息---------------------*/
while( GetMessage( &msg, NULL, 0, 0 ) ) //从消息队列中获取消息;"消息循环"代码,从消息队列中取出消息
{ //GetMessage传给Windows一个指向msg的指针;WM_QUIT导致GetMessage返回0
//第二第三第四个参数设置为NULL和0,表示程序接收它自己创建的所有窗口的所有消息
TranslateMessage( &msg ); //转换某些键盘消息
DispatchMessage( &msg ); //将消息发送给窗口过程
}
return msg.wParam;
}
/*-----------------------------------窗口过程----------------------------------*/
// 窗口过程是可以任意命名的;
// 一个Windows程序可以包含多个窗口过程;
// 一个窗口过程总是与调用RegisterClass注册的特定窗口类想关联的;
// CreateWindow函数根据特定窗口类创建一个窗口;
// 基于一个窗口类可以创建多个窗口
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
HDC hdc; //设备描述表句柄
PAINTSTRUCT ps; //绘图结构
RECT rect; //矩形结构
/*--------------------------------------------------------------------------------
一般来说,使用swith和case结构来确定窗口过程接受的是什么消息,以及如何适当地处理
他们.窗口过程在处理消息时,必须反回0.
窗口不予以处理的所有消息应该被窗给名为DefWindowProc的Windows函数.从Def..返回的
值必须由窗口过程返回.
----------------------------------------------------------------------------------*/
switch( message )
{
case WM_CREATE:
PlaySound( TEXT("Windows.wav"), NULL, SND_FILENAME | SND_ASYNC ); //播放身音;SND声音选项
return 0;
case WM_PAINT: //当窗口客户区域的一部分或者全部变成"无效",以致于必须刷新时将由这个消息通知程序
hdc = BeginPaint( hwnd, &ps ); //开始窗口绘制
GetClientRect( hwnd, &rect ); //获取窗口客户区的尺寸
DrawText( hdc, TEXT( "Hello Windows XP!" ), -1, &rect, //显示文本串
DT_SINGLELINE | DT_CENTER | DT_VCENTER ); //DT绘制文本选项
EndPaint( hwnd, &ps ); //结束窗口绘制
return 0;
case WM_DESTROY: //该消息是拥护单击Close按钮或者在程序菜单声选择close产生的
MessageBox( NULL, TEXT( "This program requires Windows NT!" ), //显示消息框
hwnd, MB_ICONE RROR );
PostQuitMessage(0); //再消息队列中插入一条"退出"消息
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam ); //执行默认的消息处理
}