《Windows核心编程》の窗口过程的使用
1)设计一个窗口过程:
下面的实例代码展现了经典的窗口过程的结构。窗口过程使用switch语句处理传入的消息参数uMsg,
LRESULT CALLBACK MainWndProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam) // second message parameter
{
switch (uMsg)
{
case WM_CREATE:
// Initialize the window.
return 0;
case WM_PAINT:
// Paint the window's client area.
return 0;
case WM_SIZE:
// Set the size and position of the window.
return 0;
case WM_DESTROY:
// Clean up window-specific data objects.
return 0;
//
// Process other messages.
//
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
2)将窗口过程和具体的窗口类相关联:
我们是在注册窗口类的时候关联窗口过程的,过程是在填充WNDCLASS结构时,传入的lpfnWndProc参数就是窗口过程函数的地址,在窗口类注册完成时,窗口过程就自动和任何由该窗口类创建的窗口相关联了:
int APIENTRY WinMain(
HINSTANCE hinstance, // handle to current instance
HINSTANCE hinstPrev, // handle to previous instance
LPSTR lpCmdLine, // address of command-line string
int nCmdShow) // show-window type
{
WNDCLASS wc;
// Register the main window class.
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "MainMenu";
wc.lpszClassName = "MainWindowClass";
if (!RegisterClass(&wc))
return FALSE;
//
// Process other messages.
//
}
3)窗口子类化:
要子类化一个窗口,我们使用SetWindowLong函数,指定要子类化的窗口句柄,同时设置GWL_WNDPROC属性,并传入子类窗口过程。SetWindowLong函数返回原来窗口过程的指针,我们可以使用这个指针来传递消息给原窗口过程;子类窗口过程必须使用CallWindowProc函数来调用原窗口过程。
下面的代码展现了如何子类化对话框中编辑控件,子类窗口过程允许编辑控件在获得输入焦点的情况下接收所有键盘输入,包括Enter和Tab键:
WNDPROC wpOrigEditProc;
LRESULT APIENTRY EditBoxProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
HWND hwndEdit;
switch(uMsg)
{
case WM_INITDIALOG:
// Retrieve the handle to the edit control.
hwndEdit = GetDlgItem(hwndDlg, ID_EDIT);
// Subclass the edit control.
wpOrigEditProc = (WNDPROC) SetWindowLong(hwndEdit,
GWL_WNDPROC, (LONG) EditSubclassProc);
//
// Continue the initialization procedure.
//
return TRUE;
case WM_DESTROY:
// Remove the subclass from the edit control.
SetWindowLong(hwndEdit, GWL_WNDPROC,
(LONG) wpOrigEditProc);
//
// Continue the cleanup procedure.
//
break;
}
return FALSE;
UNREFERENCED_PARAMETER(lParam);
}
// Subclass procedure
LRESULT APIENTRY EditSubclassProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
if (uMsg == WM_GETDLGCODE)
return DLGC_WANTALLKEYS;
return CallWindowProc(wpOrigEditProc, hwnd, uMsg,
wParam, lParam);
}
转载于:https://www.cnblogs.com/android-html5/archive/2010/08/28/2533997.html
《Windows核心编程》の窗口过程的使用相关推荐
- 窗口消息——Windows核心编程学习手札之二十六
窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...
- chHANDLE_DLGMSG(windows核心编程)讲解
看完<Windows程序设计>后开始看<windows核心编程>, 结果看第一个案例的时候就很惊人的发现,Jeffery大牛的代码很深奥.乍一看好像没有包含<window ...
- 插入DLL和挂接API——Windows核心编程学习手札之二十二
插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...
- Windows核心编程之核心总结(第一章 错误处理)(2018.5.26)
前沿 学习Windows核心编程是步入Windows编程殿堂的必经之路,2018年寒假重温了计算机操作系统知识,前阵子又过学习Windows程序设计方面的基础,正所谓打铁要乘热,所以我又入了Windo ...
- windows核心编程--2、windows的画笔画刷以及一些简单的应用
一.前言 该系列前几篇: windows核心编程–1.使用vs2019编写第一个win32项目 二.相关工具 IDE:vs2019 其他格式图片转ico脚本(贴在文末 ...
- [笔记]Windows核心编程《十九》DLL基础
系列文章目录 [笔记]Windows核心编程<一>错误处理.字符编码 [笔记]Windows核心编程<二>内核对象 [笔记]Windows核心编程<三>进程 [笔记 ...
- Windows核心编程_HOOK(续)_APIHOOK
啰嗦啰嗦: 开始之前还是要啰嗦几句,看到自己博客粉丝增加,访问量也越来越多,感到非常开心,而且好评也是不少,指错也非常感谢,从错误中发现了很多问题,非常感谢,也高兴自己的文章能帮助到其它人. 就比如之 ...
- [C++]《Windows核心编程》读书笔记
这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- DLL基础——Windows核心编程学习手札之十九
DLL基础 --Windows核心编程学习手札之十九 Windows API中的所有函数都包含在DLL中,3个最重要的DLL是Kernel32.dll,它包含用于管理内存.进程和线程的各个函数:Use ...
最新文章
- httpClient3.1 笔记
- [caffe]深度学习之CNN检测object detection方法摘要介绍
- oracle 赋值到cmd,CMD操作oracle数据导库过程图解
- python历史背景_python学习之旅1-1(python背景、安装介绍)
- SQL Server商业智能–在已建立的数据仓库中扩展事实表
- 可以运行的Oracle Advanced Queue的例子
- 拼多多摄像头是否安全的检测
- NJUPT南邮 | 离散数学_实验一
- 中国十大徒步路线,你走过几个?
- 高分子材料老化的内外因、性能评价与预防措施
- 常用数据结构与经典算法 简单讲解与示例代码
- 【OpenCV】56 二值图像分析–直线拟合与极值点寻找
- python Re模块学习
- 缓和曲线与原曲线任意点坐标计算程序
- 红旗linux 硬件,红旗软硬件兼容性查询 | 中科红旗
- 学习FFmpeg API –解码视频
- RAID磁盘阵列模式
- 如何恢复未保存的Excel文件
- Linux文件打开函数open()
- 从心出发,华展云2.0荣耀发布
热门文章
- 关键词热度分析工具_阿里国际站外贸独立站关键词的收集
- C++常用的容器(vector、set、list、map)
- 以SYSTEM用户运行CMD
- android 悬浮窗口和主界面同时显示,Android 悬浮窗口(及解决6.0以上无法显示问题)...
- python 与别的程序通信_《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池...
- 更改exe程序图标_更改电脑文件夹颜色、样式、图标,让文件夹不再是单一的黄色...
- AUTOSAR从入门到精通100讲(三十九)-AUTOSAR 通信服务-Com模块两部曲-概念详解
- 机器学习算法应用30篇(一)-支持向量机(SVM)理论与实践
- oracle 启用闪回数据库,如何启用Oracle10g闪回数据库特性
- nginx 上传文件漏洞_文件上传及解析漏洞