///Class Style 是指窗口本身的 属性
// CS_NOCLOSE就是窗口不能被关闭
// CS_HREDRAW CS_VREDRAW就是在 窗口移动或者 窗口的宽度或者高度改变的时候就会发送 WM_PAINT 消息
//CS_DBLCLKS如果class style 不包括 那么如果用户双击 鼠标 那么不会发送鼠标双击消息
//CS_CLASSDC 这个用于多线程编程 在多个线程对 一个窗体进行操作的时候一次只能有一个线程对窗体进行操作
//CS_DROPSHADOW 0x00020000 加上这个就会在窗体周围产生一块阴影 。。
//CS_OWNDC 有设置这个的class创建的窗口都有个独立的 Device Context 特别是作为主窗体的中 应该都要设置它
//Window Styles 是指窗口的外观
例如 WM_BORDER 有边框
WM_CHILD 子窗体
WS_CAPTION 创建有标题栏的窗口
WS_CHILDWINDOW 设置为子窗体 这样设置就不会显示 菜单栏 Menu Bar 也不能设置 WS_POPUP属性
WS_SIZEBOX WS_THICKFRAME 如果不设置那么窗体不能被改变大小
要设置最大化最小化的时候 也要设置 WS_SYSMENU 否则最大化最小化也不会显示
#include <windows.h>
#include <stdio.h>
#include "WINUSER.H"
LRESULT CALLBACK WinProc( //窗口回调函数的声明
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain( //入口函数
HINSTANCE hInstance, // 当前实例的句柄
HINSTANCE hPrevInstance, //先前实例的一个句柄
LPSTR lpCmdLine, // 命令行
int nCmdShow // 显示状态
)
{
WNDCLASS cls;
cls.cbClsExtra =0 ;
cls.cbWndExtra=0 ;
cls.hbrBackground=(HBRUSH)::GetStockObject(GRAY_BRUSH) ;
cls.hCursor=::LoadCursor(NULL,IDC_ARROW) ;
cls.hIcon=LoadIcon(NULL,IDI_ERROR);
cls.hInstance=hInstance ;
cls.lpfnWndProc=WinProc ;
cls.lpszClassName="SDK";
cls.lpszMenuName="NewMenu";
cls.style=CS_VREDRAW|CS_HREDRAW |CS_DBLCLKS|0x00020000|CS_NOCLOSE;
::RegisterClass(&cls) ;
HWND m_hWnd;
m_hWnd=::CreateWindow("SDK","New Win32 Application",WS_OVERLAPPEDWINDOW|WS_SYSMENU|WS_MINIMIZEBOX,100,200,600,600,NULL,NULL,hInstance,NULL) ; //创建窗口返回窗口的句柄
::ShowWindow(m_hWnd,SW_SHOWNORMAL) ; //显示窗口
::UpdateWindow(m_hWnd) ; //更新窗口
MSG msg ;
while(::GetMessage(&msg,m_hWnd,NULL,NULL)) //从消息队列检索消息
{
::TranslateMessage(&msg) ; //翻译消息
::DispatchMessage(&msg) ; //分发消息
}
return 0 ;
}
LRESULT CALLBACK WinProc(
HWND hwnd, // 窗体的句柄
UINT uMsg, // WM_开头的消息
WPARAM wParam, // 第一个附加参数
LPARAM lParam // 消息的第二个附加参数
)
{
switch(uMsg)
{
case WM_PAINT :
{
HDC hdc ;
PAINTSTRUCT ps ; //填充PAINTSTRUCT 结构体
hdc=::BeginPaint(hwnd,&ps) ; //BeginPaint() EndPaint()只有在响应WM_PAINT 消息的时候才会被调用 作用是从消息队列删除WM_PAINT 消息
//如果此处用GetDC来获取DC那么 就无法从消息队列中取出 WM_PAINT 消息 那么 windows会一直认为这是一个
//Invalid Area 无效区域 那么就会不停的重绘 导致程序卡死 。
::TextOut(hdc,10,10,"Win32_SDK",strlen("Win32_SDK")) ;
::EndPaint(hwnd,&ps); //在响应WM_PAINT 消息的时候 BeginPaint()后面必须跟上 EndPaint()
break;
}
case WM_LBUTTONDOWN:
{
HDC dc ;
dc=::GetDC(hwnd) ; //获得窗口的画布 ClientAprea
TextOut(dc,10,30,"Left Button Down!",strlen("Left Button Down!")) ;
break;
}
case WM_LBUTTONDBLCLK :
{
MessageBox(hwnd,"","",MB_OK) ;
break ;
}
case WM_CLOSE:
{ if(IDYES==::MessageBox(hwnd,"真的要退出?","提示",MB_YESNO))
::DestroyWindow(hwnd) ; //销毁窗体 销毁窗体的时候会发送一个 WM_DESTROY 消息 我们可以拦截这个消息并且调用PostQuitMessage(0)
break ; //来退出程序
}
case WM_DESTROY :
{ ::PostQuitMessage(0); //正常退出
break ;
}
case WM_RBUTTONDOWN :
{
MessageBox(hwnd,"Right Button Down","提示",MB_OK);
break ;
}
default: return DefWindowProc(hwnd,uMsg,wParam,lParam) ; //默认调用缺省的窗口过程
}
return 0 ;
}