|
窗口过程函数(回调函数)
LRESULT CALLBACK WinSunProc( //Long型,WindowProc是名字,可以改.示例中是WinSunProc,下面的四个参数类型不能变.
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
窗口过程函数中的四个参数和消息结构体的前面四个参数一样.当我们利用DispatchMessage()的时候,操作系统会调用WinSunProc这样的一个窗口过程函数,将消息结构体当中的前四个参数,做为一个参数,传递给我们这个函数.对于消息结构体后面的两个变量(投递时间/光标位置),这里是不需要的.
每一次有消息产生,都会调用窗口过程函数,
因为在代码中要判断到底是哪个消息产生了.
switch(uMsg) 分支语气用来判断.
HDC hDC;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_CHAR: //用户按下了键盘上某一按键
char szChar[20];
sprintf(szChar,"char is %d",wParam); //格式化一个文本到内存区(字符数组)中,输出一个问题,在wParam中存放了一个按键的ASCII码,
MessageBox(hwnd,szChar,"weixin",0); //弹出消息框,
break;
case WM_LBUTTONDOWN: //鼠标左键按下的消息.
MessageBox(hwnd,"mouse clicked","weixin",0); //鼠标点击时显示的消息框
HDC hdc; //定义HDC, HDC是一个DC的句柄(Device contace设备上下文),在做图时,要和显卡显示图形的驱动程序打交道,不同平台的显示图形的驱动程序是不同的,如果针对不同平台做图的话,要分别去学习不同平台下的驱动程序,这样对程序员工作量相当大,所以微软采用DC的方式,由DC和驱动程序打交道,我们只要下命令就可以.我们所要做的就是获取一个DC的句柄.然后利用DC去和显示设备驱动程序交道.
hdc=GetDC(hwnd); //获取DC的句柄.
TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc); //释放DC,不释放会造成内存泄露.
break;
case WM_PAINT: //当窗口重绘时,发生这个消息.水平与CUI直坐标发生变化时重绘.
hDC=BeginPaint(hwnd,&ps); //可以攻取一个DC的句柄.这个句柄是在上面定义的
TextOut(hDC,0,0,"维新培训",strlen("维新培训")); //输出
EndPaint(hwnd,&ps); //释放
break;
case WM_CLOSE: //当窗口关闭时响应的消息
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
//IDYES是一个常量,MessageBox的返回值如果是IDYES(点OK按钮时返回值是IDYES).在比较时,最好把常量放在前面.如果错写成if (x=1)这是桓真的.如果1=x在编译时会报错.
{
DestroyWindow(hwnd); //销毁窗口.,但进程中程序并没有退出.
} //如果把if放在WM_DESTROY中,会发生关掉窗口,但进程中扔在的现象.
break;
case WM_DESTROY:
PostQuitMessage(0); //通知系统线程请求退出.
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);//返回一个缺省的窗口过程,是对我们不感兴趣的消息提供缺省的处理。消息一经产生,就要给它一个归宿,这个是必不可少的。
} |
|