|
在 VC++ ATL 项目中获取时间控件(如 DateTimePicker)的句柄 m_hWnd,可以通过以下方法实现:
1. 通过 CWindow 基类获取
ATL 控件通常继承自 CWindow 类,可直接访问其 m_hWnd 成员:
HWND hWndDateTime = m_DateTimeCtrl.m_hWnd; // 假设 m_DateTimeCtrl 是控件变量
此方法适用于已通过 DDX_Control 绑定的控件变量。
<noteList>
2. 使用 GetDlgItem 获取控件句柄
若控件未绑定变量,可通过资源 ID 直接获取:
HWND hWndDateTime = GetDlgItem(IDC_DATETIMEPICKER1); // IDC_DATETIMEPICKER1 为控件ID
此方法返回的是原生 HWND,适用于纯 ATL 对话框。
3. 安全获取方式(推荐)
使用 GetSafeHwnd() 方法可避免空指针风险:
HWND hWndDateTime = m_DateTimeCtrl.GetSafeHwnd(); // 安全获取句柄
此方法会检查控件是否有效,是 MFC/ATL 混合项目的首选方式。
4. 动态创建控件的句柄获取
若控件通过 CreateWindow 动态创建,需保存返回的句柄:
HWND hWndDateTime = CreateWindowEx(
0, DATETIMEPICK_CLASS, L"",
WS_CHILD | WS_VISIBLE | DTS_SHORTDATEFORMAT,
10, 10, 200, 30, hParentWnd,
(HMENU)IDC_DATETIMEPICKER1,
_Module.GetModuleInstance(), NULL
);
// 后续可直接使用 hWndDateTime
此方法适用于纯 ATL 无资源文件的项目。
关键注意事项
线程安全:所有句柄操作需在主 UI 线程执行
控件初始化:确保控件已创建完成再获取句柄(如 WM_INITDIALOG 之后)
句柄验证:使用 IsWindow(hWnd) 验证句柄有效性
|
|