有一点发现:
条件:ATL-》FULL Control中选择InVisible at Runtime,在ATL中产生的工程文件中这一个这样的宏:
BEGIN_MSG_MAP(CXTimer)
CHAIN_MSG_MAP(CComControl<CXTimer>)
DEFAULT_REFLECTION_HANDLER()//就是这里!!!!!!!!
MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()
在ATLWIN.h中发现如下定义:
#define DEFAULT_REFLECTION_HANDLER() if(DefaultReflectionHandler(hWnd, uMsg, wParam, lParam, lResult)) return TRUE;再往下发现:
template <class TBase>
BOOL CWindowImplRoot< TBase >::DefaultReflectionHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult)
{
switch(uMsg)
{
case OCM_COMMAND:
case OCM_NOTIFY:
case OCM_PARENTNOTIFY:
case OCM_DRAWITEM:
case OCM_MEASUREITEM:
case OCM_COMPAREITEM:
case OCM_DELETEITEM:
case OCM_VKEYTOITEM:
case OCM_CHARTOITEM:
case OCM_HSCROLL:
case OCM_VSCROLL:
case OCM_CTLCOLORBTN:
case OCM_CTLCOLORDLG:
case OCM_CTLCOLOREDIT:
case OCM_CTLCOLORLISTBOX:
case OCM_CTLCOLORMSGBOX:
case OCM_CTLCOLORSCROLLBAR:
case OCM_CTLCOLORSTATIC:
lResult = ::DefWindowProc(hWnd, uMsg - OCM__BASE, wParam, lParam);
return TRUE;
default:
break;
}
return FALSE;
}
从以上的可以看出,WM_CREATE初忽略,我想只有定制自已的这个函数,这是方法之一,你先试一下,至于你的第一种方法,我在帮你找一下????对了,你是如何取得容器的HWND,能告诉我吗???,我的mail:[email protected]我有个想法,等我试一下再给你答案????
条件:ATL-》FULL Control中选择InVisible at Runtime,在ATL中产生的工程文件中这一个这样的宏:
BEGIN_MSG_MAP(CXTimer)
CHAIN_MSG_MAP(CComControl<CXTimer>)
DEFAULT_REFLECTION_HANDLER()//就是这里!!!!!!!!
MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()
在ATLWIN.h中发现如下定义:
#define DEFAULT_REFLECTION_HANDLER() if(DefaultReflectionHandler(hWnd, uMsg, wParam, lParam, lResult)) return TRUE;再往下发现:
template <class TBase>
BOOL CWindowImplRoot< TBase >::DefaultReflectionHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult)
{
switch(uMsg)
{
case OCM_COMMAND:
case OCM_NOTIFY:
case OCM_PARENTNOTIFY:
case OCM_DRAWITEM:
case OCM_MEASUREITEM:
case OCM_COMPAREITEM:
case OCM_DELETEITEM:
case OCM_VKEYTOITEM:
case OCM_CHARTOITEM:
case OCM_HSCROLL:
case OCM_VSCROLL:
case OCM_CTLCOLORBTN:
case OCM_CTLCOLORDLG:
case OCM_CTLCOLOREDIT:
case OCM_CTLCOLORLISTBOX:
case OCM_CTLCOLORMSGBOX:
case OCM_CTLCOLORSCROLLBAR:
case OCM_CTLCOLORSTATIC:
lResult = ::DefWindowProc(hWnd, uMsg - OCM__BASE, wParam, lParam);
return TRUE;
default:
break;
}
return FALSE;
}
从以上的可以看出,WM_CREATE初忽略,我想只有定制自已的这个函数,这是方法之一,你先试一下,至于你的第一种方法,我在帮你找一下????对了,你是如何取得容器的HWND,能告诉我吗???,我的mail:[email protected]我有个想法,等我试一下再给你答案????
解决方案 »
- 系统A如何获取系统B的拥有输入焦点的窗口的句柄
- 关于socket的奇怪问题
- 如何象写字版那样在SDI程序可以打开多种文件?
- 在vc/Mfc中#include<iostream.h>还有用不?
- CRecordset的Open()函数中如何传递参数?
- 移动控件求助
- 本人想购买一些小游戏(娱乐)软件源代码:升级/拖拉机/斗地主/围棋等等--只要实现人与人玩就可以了,价格和付费方式面议。
- VC高手,有个问题:我选中一段文字,怎么通过颜色对话框来改变字体的颜色?
- 平板电脑上(Windows系统)的屏幕上下、左右滑动怎么实现的?
- 如何开启对话框?
- 我的困惑---VC|VB哪种更实用???
- 图象象素级的快速操作如何实现?????????
inline HRESULT CComControlBase::InPlaceActivate(LONG iVerb, const RECT* /*prcPosRect*/)
{
...........省略一把
OLEINPLACEFRAMEINFO frameInfo;
RECT rcPos, rcClip;
CComPtr<IOleInPlaceFrame> spInPlaceFrame;
CComPtr<IOleInPlaceUIWindow> spInPlaceUIWindow;
frameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
HWND hwndParent;
if (m_spInPlaceSite->GetWindow(&hwndParent) == S_OK)
{
m_spInPlaceSite->GetWindowContext(&spInPlaceFrame,
&spInPlaceUIWindow, &rcPos, &rcClip, &frameInfo); if (!m_bWndLess)
{
if (m_hWndCD)
{
ShowWindow(m_hWndCD, SW_SHOW);
if (!::IsChild(m_hWndCD, ::GetFocus()))
::SetFocus(m_hWndCD);
}
else
{
HWND h = CreateControlWindow(hwndParent, rcPos);
ATLASSERT(h != NULL); // will assert if creation failed
ATLASSERT(h == m_hWndCD);
h; // avoid unused warning
}
} pIPO->SetObjectRects(&rcPos, &rcClip);
}
这个对于你的第一种应该有帮助吧!,行不行我不知道,我想做事了,有空再来帮你一把。
我也菜死了............................
当我采用Winodw Only的时候,在WM_CREATE响应函数中使用GetParent()就可以了,很简单。此时,控件的m_hWnd != NULL。
我还试过这个办法:不选择Window Only,这样的话,无法响应WM_CREATE消息,我找到一个也许可以的进行初始化的地方,是InPlaceActive,在这里,使用下面的代码
HDC hDC;
// Get the HDC from the client
m_spInPlaceSite->GetDC(NULL, OLEDC_NODRAW, &hDC);
hTheWnd = WindowFromDC(hDC);
这样得到的句柄就是容器的句柄。但是,InPlaceActive,在WindowLess的时候,相应两次,而且,我也不很清楚是否在某些情况下还会被调用,所以,我感觉这个函数不是一个好地方。我想解决的问题是当我在Window Only时,我可以将该控件隐藏起来,不知道该怎么做了,:(
;
if (m_spInPlaceSite->GetWindow(&hwndParent) == S_OK)
{
m_spInPlaceSite->GetWindowContext(&spInPlaceFrame,
&spInPlaceUIWindow, &rcPos, &rcClip, &frameInfo); if (!m_bWndLess)//你是Window Only,
{
if (m_hWndCD)//我想这个也不为空
{
ShowWindow(m_hWndCD, SW_SHOW);//我想这行是关键????
if (!::IsChild(m_hWndCD, ::GetFocus()))
::SetFocus(m_hWndCD);
}
else
{
HWND h = CreateControlWindow(hwndParent, rcPos);
ATLASSERT(h != NULL); // will assert if creation failed
ATLASSERT(h == m_hWndCD);
h; // avoid unused warning
}
}我在ATL的源程序中发现,在为Window Only的时候,h_hWndCD到处都在使用,
我跟踪后,发现,在OnCreate中调用ShowWindow(SW_HIDE)返回false,跟踪进入SetModify,发现,其中并不含有WS_VISIBLE属性,可是,建立完之后,用spy看,有这个属性,7456,这好像和ShowWindow(SW_HIDE)的返回值对应上了,msdn中说,如果ShowWindow(SW_HIDE)返回false,说明窗口已经隐藏了,:(另外,你贴的这段代码,我看了,可能是这个原因,可是,他既然可以SW_SHOW,就应该可以SW_HIDE吧,呵呵。而且我在InPlaceActive和OnCreate中调用时,采用了ATLTRACE,发现,InPlaceActive在OnCreate之前执行,奇怪。