完整,干净的WINAPI窗口创建

像C学习的第一个程序一样“hello world”级别的基础WIN32程序。




// WindowsApp.cpp


#include        // 包含windows头文件
#include
#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 );
}

你可能感兴趣的:(随笔)