最近,为了配合网站的一项活动,需要开发一款IE的插件(ActiveX),完成图像截图,上传等功能,开发过程也算顺利。但还是有必要把其中几个问题记录一下。
控件的状态:
现在很多开发软件都支持“所见即所得”的开发,用于设计UI。再设计ActiveX时,应注意在代码中区分设计时和运行时的状态。如可能在设计时,就不响应鼠标双击等消息。否则可能导致开发环境崩溃。
可以使用:
if(AmbientUserMode())
{
//运行时代码
}
Static控件的消息:
Windows的开发,一切以“窗口”这一基本概念开始,即Static控件也是一个窗口。故我做一些自定义控件时,有时候即继承CStatic来实现。这时值得一提的是,在Static控件默认的消息处理机制中用样式定义,默认对个别消息(鼠标消息)进行了屏蔽,即不接收。一般解决的办法可以采用重载 CStatic的PreSubclassWindow函数,代码可能类似:
void Ui_Control::PreSubclassWindow()
{
DWORD dwStyle = this->GetStyle();
::SetWindowLong(this->m_hWnd,GWL_STYLE, dwStyle | SS_NOTIFY);//加入SS_NOTIFY,控件将会发送通知消息如WM_LBUTTONDOWN等
CStatic::PreSubclassWindow();
}
COleControl的键盘输入:
与Static类似,COleControl在类中默认不接收键盘输入。加入你要开发一款需要键盘输入的控件,可以处理WM_GETDLGCODE消息,并在处理函数中返回相应的键盘输入的常量即可,如:
UINT CPassCtrl::OnGetDlgCode()
{
//返回值指定了空间接收的键盘输入的按键类型
return DLGC_WANTCHARS|DLGC_WANTARROWS;
}
具体常量定义及含义请查询MSDN。