Win32 程序学习笔记_创建窗口
#include <windows.h>
#include <tchar.h> //用于宽字符TCHAR操作
//消息处理函数的前置声明
LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//主函数WinMain()
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR CmdLine, _In_ int nShowCmd)
{
TCHAR clsName[] = TEXT("MyWindowsClass"); //窗口类名称
//设计窗口类
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX); //结构体的大小
wc.style = CS_HREDRAW | CS_VREDRAW; //指定大小改变就水平|垂直重画
wc.lpfnWndProc = WindowsProc; //窗口回调函数指针
wc.cbClSEXtra = 0; //类的额外内存
wc.cbWndExtra = 0; //窗口的额外内存
wc.hInstance = hInstance; //实例句柄
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //使用预定义图标(大图标)
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //使用预定义光标
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //使用系统颜色
wc.lpszMenuName = NULL; //的指定菜单
wc.lpszClassName = clsName; //窗口类的名称
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //类的小图标
if (!RegisterClasSEX(&wc)) //注册窗口类
return 0;
//创建窗口
HWND hWnd = ::CreateWindowExW(
0, //dwExStyle, 扩展样式
clsName, //lpClassName, 窗口类名
L"我的应用程序", //lpWindowName, 窗口显示的标题
WS_OVERLAPPEDWINDOW, //dwStyle, 窗口风格
CW_USEDEFAULT,/*200*/ //X, 初始X坐标
CW_USEDEFAULT,/*150*/ //Y, 初始Y坐标
CW_USEDEFAULT,/*800*/ //nWith, 宽度
CW_USEDEFAULT,/*500*/ //nHeight, 高度
NULL, //hWndParent, 父窗口句柄
NULL, //hMenu, 菜单句柄
hInstance, //hInstance, 实例句柄
NULL); //lParam, 用户数据
if (hWnd == NULL)
{
::MessageBox(hWnd, TEXT("创建窗口出错!"), TEXT("error"), MB_OK);
return -1;
}
//显示与更新窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); //转化键盘消息
DispatchMessage(&msg); //将消息发送到相应的窗口函数
}
return msg.wParam; //GetMessaage 返回FALSE 时程序结束
}
LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR szText[] = TEXT("最简单的窗口程序!");
switch (uMsg)
{
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
//使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint(hWnd, &ps);
//显示文字
::TextOut(hdc, 10, 10, szText, _tcslen(szText));
::EndPaint(hWnd, &ps);
return 0;
}
case WM_DESTROY: //正在销毁窗口
//向消息队列发送一个WM_QUIT消息,使GetMessage函数返回0
::PostQuitMessage(0);
return 0;
}
//不处理的消息交给系统默认处理
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);

dwStyle: 窗口风格样式
WS_BORDER 创建有单边框的窗口
WS_CAPTION 有标题框的窗口,包括WS_BORDER
WS_CHILD 创建子窗口,不能和WS_POPUP合用
WS_DISABLED 创建一个初始禁止的子窗口
WS_DLGFRAME 带对话框风格的窗口,不带标题栏
WS_HSCROLL 有水平滚动条
WS_VSCROLL 有垂直滚动条
WS_ICONIC 初始化时最小化状态的窗口,与WS_MINIMIZE相同
WS_MAXIMIZE 最大化按钮,不能和WS_EX_CONTESTHELP合用,同时必须指定WS_SYSMENU风格
WS_OVERLAPPED 层叠窗口,有标题,边框.与WS_TILED相同
WS_OVERLAPPEDWINDOW 创建有WS_OVERLAPPED,WS_CAPTION,
WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的窗口
WS_POPUP 弹出式窗口,不能与WS_CHILD合用
WS_POPUWINDOW 创建有,WS_BORDER,WS_POPUP,WS_SYSMENU,风格的窗口,
WS_CAPTION与WS_POPUWINDOW同时设定才能使菜单可见
WS_SIZEBOX 可调大小的窗口,与WS_THICKFRAME相同
WS_THICKFRAME 可高大小的窗口,
WS_VISIBLE 初始可见的窗口
消息结构体:
typedef struct tagMSG {
HWND hwnd; //消息要发送的窗口句柄
UINT message; //消息标识,以WM_开头的预定义值
WPARAM wParam; //消息参数1
LPARAM lParam; //消息参数2
DWORD time; //消息放入队列的时间
POINT pt; //消息放入队列时鼠标的位置
#ifdef _MAC
DWORD lPrivate; //附加消息,Win32不可用
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;