像C学习的第一个程序一样“hello world”级别的基础WIN32程序。
// WindowsApp.cpp
#include <windows.h> // 包含windows头文件
#include <stdio.h>
#define BUFFER_LENGTH 50 // buffer长度
// 自定义函数声明
BOOL DesignClass(HINSTANCE hInstance); // 设计并注册一个新窗口类
BOOL CreateWnd(HINSTANCE hInstance); // 创建新窗口并显示和刷新新窗口
// 窗口过程函数声明
LRESULT CALLBACK SampleWindowProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息类型
WPARAM wParam, // 消息的附加信息
LPARAM lParam // 消息的附加信息
);
// 定义WinMain函数
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例句柄
HINSTANCE hPrevInstance, // 前一实例句柄
LPSTR lpCmdLine, // 指向命令行参数的指针
int nCmdShow // 窗口的显示方式
)
{
// 设计并注册一个新窗口类
if ( !DesignClass(hInstance) )
{
MessageBox( NULL, "设计或者注册新窗口类失败!", "Windows窗口应用程序", 0 );
return FALSE;
}
// 创建新窗口并显示和刷新新窗口
if ( !CreateWnd(hInstance) )
{
MessageBox( NULL, "创建新窗口失败!", "Windows窗口应用程序", 0 );
return FALSE;
}
// 为应用程序添加消息循环
MSG msg; // 定义消息结构体
// 消息循环体
while ( GetMessage( &msg, NULL, 0, 0) ) // 从消息队列中获取消息
{
TranslateMessage(&msg); // 投递消息到消息队列
DispatchMessage(&msg); // 分派消息到窗口过程
}
return msg.wParam;
}
// 设计并注册一个新窗口类
BOOL DesignClass(HINSTANCE hInstance)
{
// 设计一个新窗口类
WNDCLASS wndClass; // 定义窗口类结构体
wndClass.style = CS_HREDRAW | CS_VREDRAW; // 窗口样式
wndClass.lpfnWndProc = SampleWindowProc; // 窗口过程的函数指针
wndClass.cbClsExtra = 0; // 在窗口类结构之后分配的附加字节数
wndClass.cbWndExtra = 0; // 在窗口实例之后分配的附加字节数
wndClass.hInstance = hInstance; // 窗口过程所属的实例
wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); // 窗口图标
wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); // 窗口光标
wndClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // 窗口背景画刷
wndClass.lpszMenuName = NULL; // 窗口无缺省菜单
wndClass.lpszClassName = "WindowsApp"; // 窗口类名称
// 注册新窗口类
return RegisterClass(&wndClass);
}
// 创建新窗口并显示和刷新新窗口
BOOL CreateWnd(HINSTANCE hInstance)
{
// 创建新窗口
HWND hWnd; // 定义变量用于保存创建窗口成功后返回的句柄
hWnd = CreateWindow("WindowsApp", // 窗口类名称
"Windows窗口应用程序", // 窗口标题栏名称
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, // 窗口水平位置
CW_USEDEFAULT, // 窗口垂直位置
CW_USEDEFAULT, // 窗口宽度
CW_USEDEFAULT, // 窗口高度
NULL, // 父窗口句柄
NULL, // 窗口菜单句柄
hInstance, // 窗口实例句柄
NULL ); // 窗口创建参数
if ( !hWnd ) // 新窗口创建失败
{
return FALSE;
}
else // 新窗口创建成功
{
// 显示新窗口
ShowWindow( hWnd, SW_SHOWNORMAL);
// 刷新新窗口
UpdateWindow(hWnd);
return TRUE;
}
}
// 定义窗口过程函数
LRESULT CALLBACK SampleWindowProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息类型
WPARAM wParam, // 消息的附加信息
LPARAM lParam // 消息的附加信息
)
{
// 处理接收的消息
switch ( uMsg )
{
case WM_CHAR: // 键盘字符消息
char cBuf[BUFFER_LENGTH];
sprintf( cBuf, "您按下了键盘%c", wParam ); // 格式化消息参数
MessageBox( hwnd, cBuf, "Windows窗口应用程序", 0 );
break;
case WM_LBUTTONDOWN: // 鼠标左键消息
MessageBox( hwnd, "您单击了鼠标左键,将在窗口客户区左上角绘制一个矩形", "Windows窗口应用程序", 0 );
HDC hdc;
hdc = GetDC( hwnd ); // 获得窗口DC
Rectangle( hdc, 0, 0, 200, 100); // 绘制矩形
ReleaseDC( hwnd, hdc );
break;
case WM_RBUTTONDOWN: // 鼠标右键消息
MessageBox( hwnd, "您单击了鼠标右键,将擦除单击鼠标左键时绘制的矩形", "Windows窗口应用程序", 0 );
RECT Rect;
Rect.left = 0;
Rect.top = 0;
Rect.right = 200;
Rect.bottom = 100;
InvalidateRect( hwnd, &Rect, TRUE ); // 使得矩形区域失效
break;
case WM_PAINT: // 重绘窗口
RECT rect;
GetClientRect( hwnd, &rect ); // 获取窗口客户区矩形区域
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint( hwnd, &ps ); // 获得窗口DC
SetTextColor( hDC, RGB(255, 0, 0) ); // 设置字体颜色
TextOut( hDC,
(rect.right-rect.left)/3,
(rect.bottom-rect.top)/6,
"程序名称:简单Windows窗口应用程序",
strlen("程序名称:简单Windows窗口应用程序") );
TextOut( hDC,
(rect.right-rect.left)/3,
(rect.bottom-rect.top)/3,
"系统平台:WindowsXP SP2",
strlen("系统平台:WindowsXP SP2") );
TextOut( hDC,
(rect.right-rect.left)/3,
(rect.bottom-rect.top)/2,
"开发工具:Microsoft Visual c++ 6.0",
strlen("开发工具:Microsoft Visual c++ 6.0") );
EndPaint( hwnd, &ps );
break;
case WM_CLOSE: // 关闭窗口
if ( IDYES == MessageBox( hwnd, "是否真的要关闭窗口", "Windows窗口应用程序", MB_YESNO) )
{
DestroyWindow( hwnd ); // 销毁窗口
}
break;
case WM_DESTROY: // 销毁窗口
PostQuitMessage( 0 );
break;
default:
break;
}
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}