有谁知道免注册COM和拖放功能之间可能存在哪种关系?
具体来说,我们有一个巨大的C++ CAD/CAM应用程序,包括许多EXE和数百个DLL.其中许多用作COM服务器(进程内和进程外)和/或客户端,还实现ActiveX控件.
大多数ActiveX控件和CMDIFrameWnd其中一个EXE 的主要窗口都实现了拖放功能.ActiveX控件实现了drop source和drop target,主窗口只是drop target,特别是来自Windows Explorer的文件.
拖/放实施是非常标准的并且基于来自衍生出的两个数据成员COleDataSource和COleDropTarget用于分别放置源和放置目标.所述COleDropTarget衍生的部件与在窗口的相应窗口注册OnCreate方法.它还覆盖OnDragEnter,OnDragOver并OnDrop以类似的方式方法.即,系统提供的COleDataObject参数被要求特定格式(特别是CF_HDROP),并且在肯定答案的情况下,从剪贴板提取数据(例如,文件路径).代码如下所示:
static FORMATETC g_FileFmt = {CF_HDROP, 0, DVASPECT_CONTENT, 0, TYMED_HGLOBAL};
....
// Inside OnDragEnter, OnDragOver or OnDrop method
STGMEDIUM stgmedium = {0,0,0};
if (pDataObject->IsDataAvailable(g_FileFmt.cfFormat))
{
HRESULT hr = pDataObject->GetData(g_FileFmt.cfFormat, &stgmedium);
HDROP hdrop = (HDROP)GlobalLock(stgmedium.hGlobal);
if (hdrop != 0)
{
int FilesCount = DragQueryFile(hdrop, (UINT)-1, 0, 0);
if (FilesCount != 0)
{
TCHAR FileName[_MAX_PATH]; …Run Code Online (Sandbox Code Playgroud) 在调试应用程序以尝试提高性能时,我发现它在处理大于0xC000的消息时会浪费时间.这显然是RegisterWindowMessageAPI 创建的消息.但是,该应用程序使用了超过两百个这样的消息; 有没有办法通过数值找到邮件的原始名称?
该GetAtomName和GlobalGetAtomName失败,
ERROR_INVALID_HANDLE
错误.
我创建了一个包含以下样式的工具栏:
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
| CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE
| TBSTYLE_FLAT | TBSTYLE_LIST;
Run Code Online (Sandbox Code Playgroud)
然后我用纯文本按钮填充工具栏:
bool InsertButton(int Index, int CmdId, BYTE Style, BYTE State,
int TxtIdx, DWORD_PTR lParam)
{
TBBUTTON tbb = { 0 };
tbb.idCommand = CmdId;
tbb.fsStyle = Style; // == BTNS_AUTOSIZE | BTNS_DROPDOWN
tbb.fsState = State;
tbb.iBitmap = I_IMAGENONE;
tbb.iString = TxtIdx;
tbb.dwData = lParam;
return (bool)CToolBarCtrl::InsertButton(Index, &tbb);
}
Run Code Online (Sandbox Code Playgroud)
填充工具栏后,我想获得其按钮的实际大小.但GetButtonInfo返回零大小.
int GetBtnSize(int Idx) const
{
TBBUTTONINFO tbbi = { sizeof(tbbi), …Run Code Online (Sandbox Code Playgroud) 我有一个模板课
template<typename T>
class D : public B {...}
Run Code Online (Sandbox Code Playgroud)
其中B是在类D中实现的纯虚拟接口。但是,对于一种类型T0,实现具有附加数据和处理此数据的附加成员函数。因此,在这种情况下,我必须专门研究D类:
template<>
class D<T0> : public B {...}
Run Code Online (Sandbox Code Playgroud)
同时,此专业化中所有其他方法的实现与通用情况完全相同,我不想复制粘贴它。问题是,如果可能的话,如何从类中调用类D中的泛型实现D<T0>。
PS。当然,正如@MaxLanghof和@Klaus所建议的那样,有一个具有中间派生类C的解决方案。但是,在此解决方案中,可以实例化C<T0>我不想要的class 。如果没有其他解决方案,那么我将使用该解决方案。也许在C ++ 11/14中,有一些现代的构造可以在这种情况下提供帮助?
c++ ×2
winapi ×2
c++11 ×1
com ×1
manifest ×1
mfc ×1
regfreecom ×1
side-by-side ×1
visual-c++ ×1
windows ×1