`
yuanjinxiu
  • 浏览: 658297 次
文章分类
社区版块
存档分类
最新评论

Windows API一日一练(9)WindowProc和DefWindowProc函数

 
阅读更多
Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运行这个消息处理函数。
函数WindowProc声明如下:
LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
hwnd是当前窗口的句柄。
uMsg是系统发过来的消息。
wParam是消息参数。
lParam是消息参数。
这个函数一定是静态函数,也就是全局函数,在编译时已经确定了地址。由于它需要设置在注册的窗口类型里,如下:
#008ATOM MyRegisterClass(HINSTANCE hInstance)
#009{
#010WNDCLASSEX wcex;
#011
#012wcex.cbSize = sizeof(WNDCLASSEX);
#013
#014wcex.style = CS_HREDRAW | CS_VREDRAW;
#015wcex.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//
#008LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
#009{
#010int wmId, wmEvent;
#011PAINTSTRUCT ps;
#012HDC hdc;
#013
#014switch (message)
#015{
#016case 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;
#032case WM_PAINT:
#033 hdc = BeginPaint(hWnd, &ps);
#034 //
#035 EndPaint(hWnd, &ps);
#036 break;
#037case WM_DESTROY:
#038 PostQuitMessage(0);
#039 break;
#040default:
#041 return DefWindowProc(hWnd, message, wParam, lParam);
#042}
#043return 0;
#044}
8行定义消息处理函数
14行开始根据不同的消息作处理。
29行和第41行都是调用DefWindowProc函数来处理未处理的消息。
有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。
分享到:
评论

相关推荐

    Windows API一日一练TXT版

    Windows API 一日一练(9)WindowProc 和 DefWindowProc 函数-----------------20 Windows API 一日一练(10)LoadAccelerators 函数------------------------------------------22 Windows API 一日一练(11)...

    在VB中调用API函数动态改变及恢复屏幕设置...

    在VB中调用API函数动态改变及恢复屏幕设置

    易语言用API实现文件拖放

    易语言用API实现文件拖放源码,用API实现文件拖放,WindowProc,DropFiles,SetWindowLongA,CallWindowProcA,DragAcceptFiles,DragQueryFileA,DragFinish

    改变窗体标题栏左上角的菜单,VB源代码.rar

    程序实现有两个关键: 1、通过AppendMenu和GetSystemMenu两个API函数的应用,在系统菜单上添加项目; 2、通过子类化窗体技术的应用,当我们点击添加的条时,能得到消息并做出响应。 这里要仔细理解一下,我们为窗体...

    易语言API拖放功能

    易语言API拖放功能源码,API拖放功能,DragFileOpen,WindowProc,DragFileShut,RunFile,EndTask,SetWindowLong,SetWindowLongA,DragAcceptFiles,DragQueryFile,DragFinish,FindWindow,GetParent,lstrcpy,...

    易语言API实现文件拖放

    易语言API实现文件拖放源码,API实现文件拖放,WindowProc,DropFiles,SetWindowLongA,CallWindowProcA,DragAcceptFiles,DragQueryFileA,DragFinish

    最全的WinAPI手册

    第十三节 消息和消息总队列函数(Message and Message Queue) 165 BroadcastSystemMessage 165 DispatchMessage 166 GetlnputState 167 GetMessage 167 GetMessageExtralnfo 168 GetMessagePos 168 GetMessageTime ...

    监视剪切板的Excel表格数据

    2、在消息响应函数中 WindowProc中 处理WM_CHANGECBCHAIN,把更改的窗口句柄传到下一个。 3、处理 WM_DRAWCLIPBOARD 剪切板数据改变消息:OpenClipboard,EnumClipboardFormats,GetClipboardData……CloseClipboard...

    Windows平台下USB通信原理及编程实现

    Windows平台下USB通信原理及编程实现

    VB6.0进程管理查看程序.rar

    VB6.0进程管理查看程序,仿Windows任务管理器,可...Alt-Delete和Ctrl-Esc 无效的处理,关机等,利用AddressOf取得消息处理函数WindowProc的指针,并将其传给SetWindowLong  lpPrevWndProc用来存储原窗口的指针。。。

    VC++开发一个资源编辑器

    1.子类化控件:使用setwidnowlong函数,指定gwl_wndproc参数 2.屏蔽控件的默认消息 在windowproc中的 return 1 ; 3.执行默认的消息,使用return callwindowproc 5.修改控件的大小位置,使用setwindowpos函数 ...

    VB改变窗体标题栏右上角的菜单

     1、通过AppendMenu和GetSystemMenu两个API函数的应用,在系统菜单上添加项目;  2、通过子类化窗体技术的应用,当我们点击添加的条时,能得到消息并做出响应。  这里要仔细理解一下,我们为窗体新指定了窗体函数...

    [API] 透明提示框

    Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Declare Function GetMessage ...

    VB接收自定义消息.rar

    您可以用API函数SetWindowLong指定处理消息的窗口过程(window procedure)为自定义的函数WindowProc,捕获消息ID为WM_USER+1的自定义消息或系统消息。并且,为了保证窗口能正确的响应消息,需要保存原来默认的窗口...

    用VC设计托盘图标实例

    1.添加一个NOTIFYICONDATA nd...WindowProc中处理这个消息(也可以为这个消息单独定义一个消息响应函数来实现这个功能)。 5。添加一个菜单资源,被消息响应中的命令TrackPopupMenu激发 6。为菜单各项添加响应函数。

    EDA/PLD中的用MFC的消息映像实现动态菜单

    每个Windows 程序员大概都对以前使用的窗口函数WindowProc 记忆犹新,当我们面对各种消息时,我们别无他方,只能使用庞大而机械的switch-case 语句来实现不同的分支选择。在VC5.0 中使用V4.2 版的MFC 基本

    用MFC的消息映像实现动态菜单

    每个Windows 程序员大概都对以前使用的窗口函数WindowProc 记忆犹新,当我们面对各种消息时,我们别无他方,只能使用庞大而机械的switch-case 语句来实现不同的分支选择。在VC5.0 中使用V4.2 版的MFC 基本

    标准MFC WinSock ActiveX控件开发实例

    重载控件消息处理函数WindowProc(),在View->ClassWizard中打开类向导,在消息映射中找到WindowProc,如下图: 图五 重载WindowProc() 四、编写代码 编写VariantToLong()转换函数,该函数代码如下: //类型转换,将...

    一个win32窗口创建示例

    代码如下:/*一个简单的win32窗口调用*/#include<Windows>#include<tchar> //声明窗口函数LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lparam );int WINAPI WinMain( HINSTANCE ...

Global site tag (gtag.js) - Google Analytics