windows窗口三要素---Win32
2007-11-28 00:45
183 查看
在构造窗口应用程序前,先准备好如下变量:
HINSTANCE _hInst;
HWND _hWnd;
TCHAR szClassName[] = TEXT("Test Class");
TCHAR szTitleName[] = TEXT("Test Window");
ATOM MyRegisterClass(HINSTANCE hInstance); // 注册窗口类别
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow); // 创建窗口
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // 窗口消息处理程序
1. 注册窗口类别
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MENU);
wcex.lpszClassName = szClassName;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClass(&wcex);
}
说明
1) WNDCLASS结构(以UNICODE版本为例)
typedef struct tagWNDCLASSW {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
a)style: 窗口样式
#define CS_VREDRAW 0x0001
#define CS_HREDRAW 0x0002
#define CS_DBLCLKS 0x0008
#define CS_OWNDC 0x0020
#define CS_CLASSDC 0x0040
#define CS_PARENTDC 0x0080
#define CS_NOCLOSE 0x0200
#define CS_SAVEBITS 0x0800
#define CS_BYTEALIGNCLIENT 0x1000
#define CS_BYTEALIGNWINDOW 0x2000
#define CS_GLOBALCLASS 0x4000
b)lpfnWndProc: 窗口类别的窗口消息处理程序,这是一个函数指针
typedef LRESULT (CALLBACK *lpfnWndProc)(HWND, UINT, WPARAM, LPARAM);
c)hInstance: 执行实体句柄
d)lpszMenuName: 指定窗口类别菜单
e)lpszClassName: 窗口类别名称
f)处理RegisterClass()
if(!RegisterClass(wc))
{
MessageBox(...);
return 0;
}
2. 建立窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
_hInst = hInstance;
hWnd = CreateWindow(
szClassName,
szTitleName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(hWnd==NULL)
return FALSE;
_hWnd = hWnd;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
}
1) 说明
#define CreateWindowW(
lpClassName, // 窗口类名称
lpWindowName, // 窗口标题名称
dwStyle, // 窗口样式
x, // x坐标
y, // y坐标
nWidth, // width
nHeight, // height
hWndParent, // 父窗口
hMenu, // 菜单
hInstance, // 执行实体句柄
lpParam) // lParam
dwStyle: 窗口样式
#define WS_OVERLAPPED 0x00000000L
#define WS_POPUP 0x80000000L
#define WS_CHILD 0x40000000L
#define WS_MINIMIZE 0x20000000L
#define WS_VISIBLE 0x10000000L
#define WS_DISABLED 0x08000000L
#define WS_CLIPSIBLINGS 0x04000000L
#define WS_CLIPCHILDREN 0x02000000L
#define WS_MAXIMIZE 0x01000000L
#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
#define WS_BORDER 0x00800000L
#define WS_DLGFRAME 0x00400000L
#define WS_VSCROLL 0x00200000L
#define WS_HSCROLL 0x00100000L
#define WS_SYSMENU 0x00080000L
#define WS_THICKFRAME 0x00040000L
#define WS_GROUP 0x00020000L
#define WS_TABSTOP 0x00010000L
#define WS_MINIMIZEBOX 0x00020000L
#define WS_MAXIMIZEBOX 0x00010000L
#define WS_TILED WS_OVERLAPPED
#define WS_ICONIC WS_MINIMIZE
#define WS_SIZEBOX WS_THICKFRAME
#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW
/*
* Common Window Styles
*/
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | /
WS_CAPTION | /
WS_SYSMENU | /
WS_THICKFRAME | /
WS_MINIMIZEBOX | /
WS_MAXIMIZEBOX)
#define WS_POPUPWINDOW (WS_POPUP | /
WS_BORDER | /
WS_SYSMENU)
#define WS_CHILDWINDOW (WS_CHILD)
3. 消息循环
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
1)MSG结构
typedef struct tagMSG {
HWND hwnd; // 窗口句柄
UINT message; // message,以WM_开头的一系列消息
WPARAM wParam; // 消息参数
LPARAM lParam; // 消息参数
DWORD time; // 消息放入消息队列时间
POINT pt; // 消息放入消息队列时的鼠标坐标
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
Windows负责为每个应用程序维护一个消息队列,当用户触发窗口事件时,windows将该事件转换成相应的消息,放入消息队列中;
GetMessage()从消息队列中取出消息,经过TranslateMessage();
DispatchMessage()再将消息传递给windows,由windows调用相应窗口的窗口处理程序
2)窗口消息处理程序
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int wmId, wmEvetn;
switch(message)
{
case WM_CREATE:
... ... ;
break;
case WM_SIZE:
// TODO
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
//DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
BeginPaint(hWnd, &ps);
// TODO ...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
HINSTANCE _hInst;
HWND _hWnd;
TCHAR szClassName[] = TEXT("Test Class");
TCHAR szTitleName[] = TEXT("Test Window");
ATOM MyRegisterClass(HINSTANCE hInstance); // 注册窗口类别
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow); // 创建窗口
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // 窗口消息处理程序
1. 注册窗口类别
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MENU);
wcex.lpszClassName = szClassName;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClass(&wcex);
}
说明
1) WNDCLASS结构(以UNICODE版本为例)
typedef struct tagWNDCLASSW {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
a)style: 窗口样式
#define CS_VREDRAW 0x0001
#define CS_HREDRAW 0x0002
#define CS_DBLCLKS 0x0008
#define CS_OWNDC 0x0020
#define CS_CLASSDC 0x0040
#define CS_PARENTDC 0x0080
#define CS_NOCLOSE 0x0200
#define CS_SAVEBITS 0x0800
#define CS_BYTEALIGNCLIENT 0x1000
#define CS_BYTEALIGNWINDOW 0x2000
#define CS_GLOBALCLASS 0x4000
b)lpfnWndProc: 窗口类别的窗口消息处理程序,这是一个函数指针
typedef LRESULT (CALLBACK *lpfnWndProc)(HWND, UINT, WPARAM, LPARAM);
c)hInstance: 执行实体句柄
d)lpszMenuName: 指定窗口类别菜单
e)lpszClassName: 窗口类别名称
f)处理RegisterClass()
if(!RegisterClass(wc))
{
MessageBox(...);
return 0;
}
2. 建立窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
_hInst = hInstance;
hWnd = CreateWindow(
szClassName,
szTitleName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(hWnd==NULL)
return FALSE;
_hWnd = hWnd;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
}
1) 说明
#define CreateWindowW(
lpClassName, // 窗口类名称
lpWindowName, // 窗口标题名称
dwStyle, // 窗口样式
x, // x坐标
y, // y坐标
nWidth, // width
nHeight, // height
hWndParent, // 父窗口
hMenu, // 菜单
hInstance, // 执行实体句柄
lpParam) // lParam
dwStyle: 窗口样式
#define WS_OVERLAPPED 0x00000000L
#define WS_POPUP 0x80000000L
#define WS_CHILD 0x40000000L
#define WS_MINIMIZE 0x20000000L
#define WS_VISIBLE 0x10000000L
#define WS_DISABLED 0x08000000L
#define WS_CLIPSIBLINGS 0x04000000L
#define WS_CLIPCHILDREN 0x02000000L
#define WS_MAXIMIZE 0x01000000L
#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
#define WS_BORDER 0x00800000L
#define WS_DLGFRAME 0x00400000L
#define WS_VSCROLL 0x00200000L
#define WS_HSCROLL 0x00100000L
#define WS_SYSMENU 0x00080000L
#define WS_THICKFRAME 0x00040000L
#define WS_GROUP 0x00020000L
#define WS_TABSTOP 0x00010000L
#define WS_MINIMIZEBOX 0x00020000L
#define WS_MAXIMIZEBOX 0x00010000L
#define WS_TILED WS_OVERLAPPED
#define WS_ICONIC WS_MINIMIZE
#define WS_SIZEBOX WS_THICKFRAME
#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW
/*
* Common Window Styles
*/
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | /
WS_CAPTION | /
WS_SYSMENU | /
WS_THICKFRAME | /
WS_MINIMIZEBOX | /
WS_MAXIMIZEBOX)
#define WS_POPUPWINDOW (WS_POPUP | /
WS_BORDER | /
WS_SYSMENU)
#define WS_CHILDWINDOW (WS_CHILD)
3. 消息循环
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
1)MSG结构
typedef struct tagMSG {
HWND hwnd; // 窗口句柄
UINT message; // message,以WM_开头的一系列消息
WPARAM wParam; // 消息参数
LPARAM lParam; // 消息参数
DWORD time; // 消息放入消息队列时间
POINT pt; // 消息放入消息队列时的鼠标坐标
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
Windows负责为每个应用程序维护一个消息队列,当用户触发窗口事件时,windows将该事件转换成相应的消息,放入消息队列中;
GetMessage()从消息队列中取出消息,经过TranslateMessage();
DispatchMessage()再将消息传递给windows,由windows调用相应窗口的窗口处理程序
2)窗口消息处理程序
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int wmId, wmEvetn;
switch(message)
{
case WM_CREATE:
... ... ;
break;
case WM_SIZE:
// TODO
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
//DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
BeginPaint(hWnd, &ps);
// TODO ...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
相关文章推荐
- VC/win32 windows 窗口的注册和创建
- Win32 SDK基础(3)—— 从零开始创建windows窗口(一)
- Win32 SDK基础(4)—— 从零开始创建windows窗口(二)
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Win32开发,取出窗口句柄的方法
- Windows下游戏制作(1)---win32窗口创建(1)
- 在Win32控制台程序中添加Windows窗口
- Windows下游戏制作(1)---win32窗口创建(2)
- [源代码]WIN32 SDK界面研究<1>:模仿Windows命令行或telnet客户端的窗口
- win32 的DLL中创建windows窗口
- 第一个Win32窗口程序,纪念自己的Windows编程之旅
- win32 的DLL中创建windows窗口
- [置顶] 基于要素(标题、父、类型、进程、控件id)获取windows窗口
- 使用WIN32汇编语言实现一个基本windows窗口的过程分析
- win32 api Windows窗口的创建
- 学习win32 API开发2-走进Windows窗口程序开发
- 重温WIN32 API ------ 最简单的Windows窗口封装类
- Win32 Windows编程 七
- 解决WIN32窗口不响应WM_LBUTTONDBLCLK消息
- Windows Dev Intro - VS2013 Compile X64 Project Upgraded from Win32 Project
- 使用WIN32 API CreateProcess()以无窗口方式创建DOS程序