本人已经博客移至:围观IT,更多精彩内容请访问:围观IT
说明:
MSG消息是一个结构体,参数:
HWND: 标示和哪个窗口相关(表示窗口)
Unit(整形) message传递的消息,即用户在使用程序时所进行的相应操作:用相应的宏表示相应的操作。
WPARAM(整形):关于消息的附加信息。当我们按键盘时的时候,其实传递给系统的是一个WM_CHAR消息。而不知道是哪个键,而这个附加参数就表示具体是哪个按键。
LPARAM(整形):关于消息的附加信息。。
DWORD time:表示消息传递的时间
POINT :表示一个点。当消息被投递的时候,光标所在的位置。
WinMain是Window编程的入口函数。
参数:
HINSTANCE hInstance:此程序的句柄
HINSTANCE hPrevInstance::表示在此兄弟程序的标识句柄。即在此程序运行之前运行的此程序标识
LPSTR lpCmdLine:命令行参数。表示所要打开的文件地址。
INT nCmdShow:显示状态。比如最大化还是最小化。
消息响应:是程序对应用系统的操作
消息处理函数:对消息进行处理(程序员写,系统自动调用)
窗口的创建:
1.设计窗口类
使用一个结构体表示窗口WNDCLASS
窗口参数:
UNIT Styles:cs_...:表示窗口的类型
窗口类的类型都是一四位个十六进制位,对应一个二进制位为1,当他们或的时候,就使styles具有了一些类型
WNDPROC lpfnWndProc:指向一个窗口过程函数:指定了一类窗口过程,也称为回调函数。:当应用程序收到一个窗口消息时(消息中含有消息所相关的窗口,也就是说,消息要去哪个窗口,消息中已有说明),然后调用某一函数来处理这条消息。对应每个窗口,操作系统自动调用其相应的回调函数。而这个回调函数需要在这里定义。即在这里定义当此窗口得到消息时,所要执行的函数。(讲一个函数的指针赋值给它)
int cbClsExtra:类的附加内存。共享。通常设为0
int cbWndExtra:为窗口附加内存。通常为0.
HINSTANCE hInstance:应用程序的实例号
HICON hIcon:LoadIcon()设置图标。
HCURSOR hcursor=LoadCursor() 设置光标
HBRUSH hbrBackground :(HBRUSH)GetStockObject();设置画刷。
LPCTSTR lpszMenuName:指向一个常量的字符串。设定菜单的名字。无菜单为NULL
LPCTSTR lpszClassName:给窗口设定的名字。
2.注册窗口类
RegisterClass ()
3.创建窗口
CreatWindow(
IPCTSTR lpClassName,//窗口的名称,即一个已注册的窗口的名称,更具窗口定义信息进行窗口注册
IPCTSTR lpWindowName,//窗口标题,即在窗口上方显示的标题
DWORD dsStyle,//窗口类型:各种类型,如是否支持窗口最大最小化,是否可调整边框大小
int x,//窗口位置(左上方的点)
int y,//同上
int nWidth,//窗口宽度
int nHeight,//窗口高度
HWND hWndParent,//父窗口
HMENU hMenu,//菜单句柄
HINSTANCE hInstance,//当前程序的实例句柄
LPVOID lpParam,
)
返回一个窗口句柄HWND
4.显示窗口
ShowWindow(
HWND hWnd;//显示窗口句柄
int x;//显示状态
)
5.更新窗口。
updateWindow();
消息循环
MSG msg;
GetMessage(
LPMSG lpMsg,//
HWND hWnd,设置捕捉哪个窗口的消息,设置NULL表示对于所有窗口的消息都进行捕捉
UINT wMsgFilterMin,//设置消息最小值
UINT wMsgFilterMax,//消息最大值。(进行范围的过滤,设为0,表示捕捉所有的消息)
)从消息队列中得到消息
TranslateMessage()//将键盘的ASSIC码转换消息
DispatchMessage()//将消息给操作系统
HDC 设备描述表
GetDC(
HWND hwnd//窗口(设定跟那个窗口相关)
)
Example:
#include <windows.h> //所有的windows程序都要包含的头文件
#include<stdio.h>
LRESULT CALLBACK WinProc( //声明窗口处理消息函数
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int APIENTRY WinMain( //程序入口
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
WNDCLASS wnd; //设计窗口
wnd.cbClsExtra=0;//
wnd.cbWndExtra=0;
wnd.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wnd.hCursor=LoadCursor(NULL,IDC_CROSS);
wnd.hIcon=LoadIcon(NULL,IDI_ERROR);
wnd.hInstance=hInstance;
wnd.lpfnWndProc=WinProc;//也就是指向函数的指针。
wnd.lpszClassName="Win2009";
wnd.lpszMenuName=NULL;
wnd.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wnd); //注册窗口
HWND hwnd;
hwnd=CreateWindow("Win2009","Windowprogram",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
//创建窗口,返回窗口句柄,表示此窗口
ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口
UpdateWindow(hwnd); //更新窗口
MSG msg;
while(GetMessage(&msg,NULL,0,0)) //从消息队列中取出消息
{
TranslateMessage(&msg); //转换消息
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc( //窗口处理消息函数
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","message",0);
HDC hdc;//设备描述符表
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"程序员之家",strlen("程序员之家"));
//ReleaseDC(hwnd,hdc);
break;
case WM_PAINT://更新窗口时,产生重画消息。
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,50,0,"Windows 编程",strlen("Windows 编程"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))
{
DestroyWindow(hwnd);//关闭窗口。产生一个WM_DESTORY的消息
}
break;
case WM_DESTROY:
PostQuitMessage(0);//getMessage()返回FALSE,程序结束
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
本人已经博客移至:围观IT,更多精彩内容请访问:围观IT