[VC]WindowProc和DefWindowProc函数

在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消
息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数
不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运行这个消
息处理函数。
函数WindowProc声明如下:
LRESULT CALLBACK
WindowProc(          HWND
hwnd,
    UINT uMsg,
    WPARAM
wParam,
    LPARAM
lParam
);
hwnd是当前窗口的句柄。
uMsg是系统发过来的消息。
wParam是消息参数。
lParam是消息参数。


这个函数一定是静态函数,也就是全局函数,在编译时已经确定了地址。由于它需要设置在注册的窗口类型里,如下:
#008 ATOM
MyRegisterClass(HINSTANCE hInstance)
#009 {
#010 WNDCLASSEX
wcex;
#011
#012 wcex.cbSize = sizeof(WNDCLASSEX);
#013
#014

wcex.style            
= CS_HREDRAW | CS_VREDRAW;
#015 wcex.lpfnWndProc =
WndProc;
第15行就是设置窗口的消息处理函数。

函数DefWindowProc声明如下:
LRESULT
DefWindowProc(          HWND
hWnd,
    UINT Msg,
    WPARAM
wParam,
    LPARAM
lParam
);
这个函数参数跟上面那个函数是一样的。
只不过,它是处理所有默认的消息。


调用这两个函数的实例如下:


#001 //
#002 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
#003 //
#004 // 目的: 处理主窗口的消息.
#005 //
#006 // 蔡军生 2007/07/12
#007 //
#008 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
#009 {
#010 int wmId, wmEvent;
#011 PAINTSTRUCT ps;
#012 HDC hdc;
#013
#014 switch (message)
#015 {
#016 case WM_COMMAND:
#017 wmId = LOWORD(wParam);
#018 wmEvent = HIWORD(wParam);
#019 // 菜单选项命令响应:
#020 switch (wmId)
#021 {
#022 case IDM_ABOUT:
#023 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
#024 break;
#025 case IDM_EXIT:
#026 DestroyWindow(hWnd);
#027 break;
#028 default:
#029 return DefWindowProc(hWnd, message, wParam, lParam);
#030 }
#031 break;
#032 case WM_PAINT:
#033 hdc = BeginPaint(hWnd, &ps);
#034 //
#035 EndPaint(hWnd, &ps);
#036 break;
#037 case WM_DESTROY:
#038 PostQuitMessage(0);
#039 break;
#040 default:
#041 return DefWindowProc(hWnd, message, wParam, lParam);
#042 }
#043 return 0;
#044 }

第8行定义消息处理函数
第14行开始根据不同的消息作处理。
第29行和第41行都是调用DefWindowProc函数来处理未处理的消息。


有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。

[VC]WindowProc和DefWindowProc函数,布布扣,bubuko.com

时间: 2024-11-18 14:43:26

[VC]WindowProc和DefWindowProc函数的相关文章

WindowProc和DefWindowProc的区别

1. WindowProc是你给自己的窗口定义的窗口处理函数 DefWindowProc是windows平台提供的默认窗口处理函数 如果某些消息你不需要做特别的处理,调用DefWindowProc进行处理就可以了,不需要你自己再去些那些windows的"标准动作" 2. 根据1,显然,你只能定义WindowProc而不能定义DefWindowProc 看看MFC的CWnd源码就一目了然了 LRESULT CWnd::WindowProc(UINT message, WPARAM wPa

VC++中的延时函数

原文链接:http://www.educity.cn/develop/478947.html VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作. 方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时 间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间

VC中常见API函数用法(经验版)

1.设置对话框为无边框方法 ModifyStyle(WS_CAPTION | WS_THICKFRAME, 0, SWP_FRAMECHANGED); 2.设置控件灰色与不灰色 void CMthread1Dlg::OnStop() { // TODO: Add your control notification handler code here m_bRun = FALSE; GetDlgItem(IDC_START)->EnableWindow(TRUE); GetDlgItem(IDC_

VC字符串转换常用函数

最近在做一些关于VC的ActiveX小插件,经常会遇到字符串处理的问题,狂查CSDN和MSDN,结果并不理想.先说明一下,相关处理函数在VC++6.00测试通过.也许很多人不能理解,现在都什么年代了,还用VC6.0,其实VC开发插件有一个好处就是部署的时候方便一些,不用考虑浏览器端用户是否安装了.net Framework.那个.net Framework随着推出新版本越来越大,要让用户花那么多时间去安装那个庞然大物,而实际用到的东西却很少很少,这样很多人会不干的.另外,服务端的是java开发的

VC++编写DLL导出函数及其调用方法

DLL (Dynamic Link Library)动态链接库,是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,其优点主要有:1. 有助于节省内存:2. 有助于资源共享:3. 不需编译的软件系统升级:4. 支持多语言程序.当然,有的时候我们也可以将一些核心的或者不愿意公开提供的函数编写为DLL,从而起到隐藏和保护的作用. 下面结合实例详细说明在Visual Studio 2008 SP1 IDE中如何创建.编写和导出VC++ MFC DLL,以及如何调用生成的DLL.(完整

vc++下给main函数中的argv[i]初始化

在VC++中设置工程的调试状态:工程-->设置-->调试-->程序变量: int main(int argc , char* argv[]){ printf("%S\n",argv[i]);//   i变量代表自定义数字. return 0; }

vc++如何创建程序-函数的重载

重载构成的条件:函数的参数类型,参数个数不同,才能构成函数的重载 函数重载分为两种情况: 1 .(1)void output(); (2)int output(); 2 .(1)void output(int a,int b=5); (2)int output(int a); this 指针 1. this指针是一个隐含的指针,指向对象本身,代表对象的地址 2. 一个类所有的对象调用的成员函数都是统一代码段,那么成员函数又是怎末识别属于同一对象的数据成员呢? ---------成员函数除了接受两

【vc】高精度时间函数的使用

方法一: 函数定义如下: int UsSleep(int us);//返回实际的微秒延时时间 代码实现如下: 1 //参数一表示 需要等待的时间 微秒为单位 2 int UsSleep(int us) 3 { 4 //储存计数的联合 5 LARGE_INTEGER fre; 6 //获取硬件支持的高精度计数器的频率 7 if (QueryPerformanceFrequency(&fre)) 8 { 9 LARGE_INTEGER run,priv,curr,res; 10 run.QuadPa

VC API常用函数简单例子大全[转]

第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCSTR lpWindowName); 第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时填两个参数的,也就是说,你只要知道窗口的类名或窗口的标题就可以了,没有的那个就用NULL代替. 比如现在有一个窗口名为"无标题.txt - 记事本"的记事本程序.那么我就可以用上面的函数获得这个