/*------------------------------------------------------------
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//CS_HREDRAW 和CS_VREDRAW,这样的格式设定指示Windows,在视窗大小改变後,就把整个视窗显示内容当成无效。
wndclass.lpfnWndProc = WndProc ; //是依据这个类别来建立的所有视窗所使用的视窗讯息处理程式的位址
wndclass.cbClsExtra = 0 ; //在视窗类别结构中预留一些额外空间:
wndclass.cbWndExtra = 0 ; //在Windows 内部保存的视窗结构中预留一些额外空间
wndclass.hInstance = hInstance ; //程式的执行实体代号(它也是WinMain 的参数之一)
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //载入图标供程序使用,要取得预先定义图示的代号,可以将第一个参数设定为NULL
//来呼叫LoadIcon
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; /*LoadCursor函式载入一个预先定义的滑鼠游标(命名为IDC_ARROW),
并传回该游标的代号。该代号被设定给WNDCLASS 结构的hCursor栏位。当滑鼠游标在依据这个类别建立的视窗的显示区域上出现时,它
变成一个小箭头。*/
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //取得一个图形物件(在这个例子中,是取得绘制视窗背景的画刷物件)
wndclass.lpszMenuName = NULL ;//指定视窗类别功能表。HElLOWIN 没有应用程式功能表,所以该栏位被设定为NULL。
wndclass.lpszClassName = szAppName ; //是视窗类别的文字名称 名字可以随便取
if (!RegisterClass (&wndclass)) //为程式视窗注册视窗类别。
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"), //显示讯息方块。
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name 根据视窗类别建立一个视窗。szAppName:窗口名称
TEXT ("The Hello Program"), // window caption 窗口标题
WS_OVERLAPPEDWINDOW, // window style 窗口格式
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle父窗口句柄
NULL, // window menu handle窗口菜单句柄
hInstance, // program instance handle
NULL) ; // creation parameters创建参数 可以用这个参数存取稍後程式中可能引用到的资料
ShowWindow (hwnd, iCmdShow) ; //在萤幕上显示视窗。hwnd是刚刚用CreateWindow 建立的视窗代号。
//第二个参数是作为参数传给WinMain 它确定最初如何在萤幕上显示视窗,是一般大小、最小化还是最大化
UpdateWindow (hwnd) ; //指示视窗自我更新。
while (GetMessage (&msg, NULL, 0, 0)) //从讯息伫列中取得讯息
{
TranslateMessage (&msg) ; //转译某些键盘讯息。
DispatchMessage (&msg) ; //将讯息发送给视窗讯息处理程式。
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{//视窗讯息处理程式的四个参数与MSG 结构的前四个栏位是相同的 如果程式是依据同一视窗类别建立多个视窗,则hwnd 标识接收讯息的特定视窗。
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; //播放一个音效档案。
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ; //开始绘制视窗
GetClientRect (hwnd, &rect) ; //取得视窗显示区域的大小
DrawText (hdc, TEXT ("Hello, Windows 8!"), -1, &rect, //显示子串 第三个参数是 -1,指示字串是以位元组0 终结的
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ; //结束绘制视窗
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ; //在讯息伫列中插入一个「退出程式」讯息。
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ; //执行内定的讯息处理 结构的wParam 栏位是传递给PostQuitMessage 函式的值(通常是0)
}
/*视窗讯息处理程式在处理
讯息时,必须传回0。视窗讯息处理程式不予处理的所有讯息应该被传给名为
DefWindowProc 的Windows函式。从DefWindowProc 传回的值必须由视窗讯息处
理程式传回。呼叫DefWindowProc 来为视窗讯息处理程式不予处理的所有讯息提供内定
处理,这是很重要的。不然一般动作,如终止程式,将不会正常执行。*/
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//CS_HREDRAW 和CS_VREDRAW,这样的格式设定指示Windows,在视窗大小改变後,就把整个视窗显示内容当成无效。
wndclass.lpfnWndProc = WndProc ; //是依据这个类别来建立的所有视窗所使用的视窗讯息处理程式的位址
wndclass.cbClsExtra = 0 ; //在视窗类别结构中预留一些额外空间:
wndclass.cbWndExtra = 0 ; //在Windows 内部保存的视窗结构中预留一些额外空间
wndclass.hInstance = hInstance ; //程式的执行实体代号(它也是WinMain 的参数之一)
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //载入图标供程序使用,要取得预先定义图示的代号,可以将第一个参数设定为NULL
//来呼叫LoadIcon
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; /*LoadCursor函式载入一个预先定义的滑鼠游标(命名为IDC_ARROW),
并传回该游标的代号。该代号被设定给WNDCLASS 结构的hCursor栏位。当滑鼠游标在依据这个类别建立的视窗的显示区域上出现时,它
变成一个小箭头。*/
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //取得一个图形物件(在这个例子中,是取得绘制视窗背景的画刷物件)
wndclass.lpszMenuName = NULL ;//指定视窗类别功能表。HElLOWIN 没有应用程式功能表,所以该栏位被设定为NULL。
wndclass.lpszClassName = szAppName ; //是视窗类别的文字名称 名字可以随便取
if (!RegisterClass (&wndclass)) //为程式视窗注册视窗类别。
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"), //显示讯息方块。
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name 根据视窗类别建立一个视窗。szAppName:窗口名称
TEXT ("The Hello Program"), // window caption 窗口标题
WS_OVERLAPPEDWINDOW, // window style 窗口格式
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle父窗口句柄
NULL, // window menu handle窗口菜单句柄
hInstance, // program instance handle
NULL) ; // creation parameters创建参数 可以用这个参数存取稍後程式中可能引用到的资料
ShowWindow (hwnd, iCmdShow) ; //在萤幕上显示视窗。hwnd是刚刚用CreateWindow 建立的视窗代号。
//第二个参数是作为参数传给WinMain 它确定最初如何在萤幕上显示视窗,是一般大小、最小化还是最大化
UpdateWindow (hwnd) ; //指示视窗自我更新。
while (GetMessage (&msg, NULL, 0, 0)) //从讯息伫列中取得讯息
{
TranslateMessage (&msg) ; //转译某些键盘讯息。
DispatchMessage (&msg) ; //将讯息发送给视窗讯息处理程式。
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{//视窗讯息处理程式的四个参数与MSG 结构的前四个栏位是相同的 如果程式是依据同一视窗类别建立多个视窗,则hwnd 标识接收讯息的特定视窗。
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; //播放一个音效档案。
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ; //开始绘制视窗
GetClientRect (hwnd, &rect) ; //取得视窗显示区域的大小
DrawText (hdc, TEXT ("Hello, Windows 8!"), -1, &rect, //显示子串 第三个参数是 -1,指示字串是以位元组0 终结的
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ; //结束绘制视窗
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ; //在讯息伫列中插入一个「退出程式」讯息。
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ; //执行内定的讯息处理 结构的wParam 栏位是传递给PostQuitMessage 函式的值(通常是0)
}
/*视窗讯息处理程式在处理
讯息时,必须传回0。视窗讯息处理程式不予处理的所有讯息应该被传给名为
DefWindowProc 的Windows函式。从DefWindowProc 传回的值必须由视窗讯息处
理程式传回。呼叫DefWindowProc 来为视窗讯息处理程式不予处理的所有讯息提供内定
处理,这是很重要的。不然一般动作,如终止程式,将不会正常执行。*/