一、WINDOWS程序的运行原理:
1、基于消息的事件驱动:将所有的事件都包装成消息,并存放于消息队列中,应用程序每次取走一条。
2、消息的捕捉与传递均由WINDOWS执行。
二、WINDOWS中用于存放消息的结构体:
结构体原型:
typedef struct tagMSG { // msg
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
参数释义:
hwnd:窗口句柄,即产生消息的窗口。
message:消息。
wParam:消息附加内容。如:产生了一个键盘消息,该附加消息则包含具体按下的键。
lParam:同样是附加消息。
time:消息产生的时间。
pt:消息产生时光标的位置。
关于结构体中的新数据类型:
HWND:窗口句柄。
WORD:16位的整数。
DWORD:双16位的整数。
名词:
句柄:资源的标识符。
消息队列:WINDOWS中每个程序都对应的有一个消息队列为它服务。实质是一块先进先出的缓冲区域。
三、WinMain函数:WINDOWS程序的入口。
函数原型:
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
参数释义:
hInstance:当前应用程序的实例句柄。
hPrevInstance:上一个窗口的实例句柄。
lpCmdLine:命令行参数。
nCmdShow:指定以何种模式显示窗口,具体的值有以下几种类型(宏):SW_HIDE/SW_MAXIMIZE/SW_MINIMIZE/SW_RESTORE/SW_SHOW/SW_SHOWMAXIMIZED/SW_SHOWMINIMIZED/SW_SHOWMINNOACTIVE/SW_SHOWNA/SW_SHOWNOACTIVATE/Displays /SW_SHOWNORMAL
四、窗口类:
结构原型:
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;
参数释义:
style:窗口类样式,可以有以下几种类型的值:CS_HREDRAW /CS_VREDRAW /CS_DBLCLKS /CS_NOCLOSE /CS_PARENTDC
lpfnWndProc:指针,消息处理过程函数,函数原型见下文(WindowProc)。
cbClsExtra:通常为0。
cbWndExtra:通常为0。
hInstance:句柄,窗口过程处理的实例。
hIcon:标题栏的ICON图标。注意采用LoadIcon函数,原型见下文。
hCursor:窗口区域内的鼠标光标类型。采用LoadCursor函数,原型见下文。
hbrBackground:画刷,窗口背景颜色。使用GetStockObject函数,原型见下文。
lpszMenuName:指针,窗口标题。
lpszClassName:指针,窗口类的名称。
用到的API函数:
WindowProc原型:
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
参数释义:
hwnd:窗口句柄。
uMsg:消息。
wParam/lParam:消息附加信息。
LoadIcon原型:
HICON LoadIcon(
HINSTANCE hInstance,
LPCTSTR lpIconName
);
参数释义:
hInstance:NULL时表示使用系统定义的图标。
lpIconName:指针,指定加载的图标的名称
LoadCursor原型:
HCURSOR LoadCursor(
HINSTANCE hInstance,
LPCTSTR lpCursorName
);
参数释义:
hInstance:NULL时表示使用系统定义的鼠标样式。
lpCursorName:指定鼠标样式,可以有以下值:IDC_APPSTARTING/IDC_ARROW /IDC_CROSS/IDC_HAND /IDC_HELP/IDC_ICON /IDC_NO/IDC_SIZE/IDC_SIZEALL /IDC_SIZENESW/IDC_SIZENS/IDC_SIZENWSE/IDC_SIZEWE/IDC_UPARROW/IDC_WAIT
GetStockObject原型:
HGDIOBJ GetStockObject(
int fnObject
);
参数释义:
fnObject:画刷的类型。可以有以下值:BLACK_BRUSH/DKGRAY_BRUSH/GRAY_BRUSH /HOLLOW_BRUSH /LTGRAY_BRUSH /NULL_BRUSH /WHITE_BRUSH /BLACK_PEN/WHITE_PEN/NULL_PEN/SYSTEM_FONT/DEFAULT_PALETTE
五、注册窗口:
函数原型:
ATOM RegisterClass(
const WNDCLASS* lpWndClass
);
参数释义:
lpWndClass:指针,窗口类。
六、创建窗口:
函数原型:
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
PVOID lpParam
);
参数释义:
lpClassName:窗口类的名称。
lpWindowName:窗口的名称。
dwStyle:窗口创建时的样式。可以有如下值:WS_BORDER/WS_CAPTION /WS_CHILD /WS_CLIPCHILDREN /WS_CLIPSIBLINGS /WS_DISABLED/WS_DLGFRAME /WS_GROUP
/WS_HSCROLL /WS_OVERLAPPED /WS_OVERLAPPEDWINDOW /WS_POPUP /WS_SIZEBOX /WS_SYSMENU /WS_TABSTOP /WS_THICKFRAME /WS_VISIBLE/WS_VSCROLL
x:窗口的X坐标。
Y:窗口的Y坐标。
nWidth:窗口的宽度。
nHeight:窗口的高度。
hWndParent:父窗口的句柄,无父窗口则为NULL。
hMenu:菜单栏句柄。
hInstance:窗口实例句柄。
lpParam:没理解,NULL。
七、显示窗口:
函数原型:
BOOL ShowWindow(
HWND hWnd,
int nCmdShow
);
参数释义:
hWnd:窗口句柄。
nCmdShow:窗口展示方式,可以有以下值:SW_HIDE/SW_SHOW /SW_SHOWNA/SW_SHOWNORMAL
八、更新窗口:
函数原型:
BOOL UpdateWindow(
HWND hWnd
);
参数释义:
hWnd:窗口句柄。
九、消息循环:
获取消息 函数原型:
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
参数释义:
lpMsg:OUT,消息。
hWnd:窗口句柄。
wMsgFilterMin:消息界限,最小值。
wMsgFilterMax:消息界限,最大值。
转换消息 函数原型:
BOOL TranslateMessage(
const MSG* lpMsg
);
参数释义:
lpMsg::消息类的指针。
传递消息(将消息传递给窗口过程) 函数原型:
LONG DispatchMessage(
const MSG* lpmsg
);
参数释义:
lpmsg:消息指针。
十、MessageBox:
函数原型:
int MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
参数释义:
hWnd:窗口句柄。
lpText:消息类容。
lpCaption:警告标题。可以为NULL
uType:按钮类型,可以有以下值:MB_ABORTRETRYIGNORE/MB_OK/MB_OKCANCEL /MB_RETRYCANCEL/MB_YESNO MB_YESNOCANCEL
十一、HDC(设备上下文句柄)/ReleaseDC/TextOut/DestroyWindow/PostQuitMessage:
HDC hdc = GetDC(hwnd);
文字输出 函数原型:
BOOL TextOut(
HDC hdc, // handle to DC
int nXStart, // x-coordinate of starting position
int nYStart, // y-coordinate of starting position
LPCTSTR lpString, // character string
int cbString // number of characters
);
参数释义:
hdc:设备上下文句柄。
nXStart:X坐标。
nYStart:Y坐标。
lpString:文字内容。
cbString:输出文字的长度。
释放DC 函数原型:
int ReleaseDC(
HWND hWnd,
HDC hDC
);
参数释义:
hWnd:窗口句柄。
hDC:设备上下文句柄。
销毁窗口 函数原型:
BOOL DestroyWindow(
HWND hWnd
);
线程请求退出 函数原型:
void PostQuitMessage(
int nExitCode
);
参数释义:
nExitCode:退出的参数。(只知道0)
十二、WINDOWS默认消息处理机制:
函数原型:
LRESULT DefWindowProc(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
一段完整的源码:
#include<windows.h>
#include<stdio.h>
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASS wndClass;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.hCursor=LoadCursor(hInstance,IDC_HAND);
wndClass.hIcon=LoadIcon(hInstance,IDI_ERROR);
wndClass.hInstance=hInstance;
wndClass.lpfnWndProc=WndProc;
wndClass.lpszClassName=TEXT("First C++ Window");
wndClass.lpszMenuName=NULL;
RegisterClass(&wndClass);
HWND hWnd;
hWnd = CreateWindow(TEXT("First C++ Window"), TEXT("我的第一个C++窗口"), WS_OVERLAPPEDWINDOW, 0, 0, 600, 800, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
MSG Msg;
while(GetMessage(&Msg,hWnd,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"The char is: %c.",wParam);
//MessageBox(hwnd,TEXT(szChar),TEXT("消息"),MB_OK);
break;
case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd,&ps);
TextOut(hdc,0,0,TEXT("啦啦啊啊啊啊"),strlen("啦啦啊啊啊啊"));
EndPaint(hwnd,&ps);
break;
default :
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}