在window 中应用程序编程,重要的是明白应用程序、操作系统、消息之间的关系,一句话总结就是:事件驱动消息的机制。操作系统通过消息的机制来传递给应用程序
不同的消息代表用户不同的操作和状态,特定的消息让操作系统来响应某一个特定功能来响应消息。
MSG结构定义如下:
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;(双十六位即32位)
POINT pt;(结构体)
} MSG;
句柄(HANDLE),资源的标识。(有点类似于指针,占着内存一部分资源)
操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance(当前实例)
HINSTANCE hPrevInstance, // handle to previous instance(前一个实例,一般为NULL)
LPSTR lpCmdLine, // command line(lp开头为长指针,指向字符串)
int nCmdShow // show state
);
创建一个完整的窗口需要经过下面四个操作步骤:
1、设计窗口类
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc; (函数处理)
int cbClsExtra; (额外信息,一般为0)
int cbWndExtra;
HANDLE hInstance; (当前应用程序实例)
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName; (指向32位字符串,菜单名)
LPCTSTR lpszClassName;
} WNDCLASS;
下面以一个简单的实例程序来作为window程序原理的分析:
#include <windows.h>
#include <stdio.h>
//函数声明
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
//主函数入口
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;//定义一个设计窗口类的实例化
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//定义一个窗口的背景,这里要强制转换?查看msdn可以得知函数返回的是神马类型的
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//应用程序图标
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;//注册处理函数,这个很重要,注意与C语言中的区别
wndcls.lpszClassName="yangyong";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;//水平和垂直类型
RegisterClass(&wndcls);//注册设计类
HWND hwnd;//创建一个窗口,首先要定义一个句柄
hwnd=CreateWindow("yangyong","常熟理工",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 WinSunProc(
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 is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"Mouse Click","weixin",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,0,0,"wei xin peix un ",strlen("wei xin peix un "));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
在写这些程序过程中,我们不可能记住所有API的函数类型和参数等,这里我们主要下载msdn帮助手册,通过手册查询熟悉常用的即可,本人是初学msdn,这里只是作为我学习的一个记录心得,与朋友一起分享学习的过程。这是第一篇,以后会不断的更新自己的学习过程。嘿嘿!!!!!
注明:本系列的学习知识参考孙鑫老师 的C++编程,里面含有一些个人的思想与学习总结,绝无抄袭之用,仅供学习。