150分求解 1.用GetDialogItem()然后再Resize.....2.不知道唉~可能应该根据当前点的控件的ID来判断 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 pBtn->MoveWindow不行,当我用时控件就不见啦! 你的两段程序都不存在问题,只是此写得有点别扭.(很普通的应用)m_wndBut.SetWindowPos( this,cx/80,cy/100,cx/10,cy/50,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_N OACTIVATE)------>m_wndBut.SetWindowPos( NULL,0,0,cx/10,cy/50,SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW|SWP_NOACTIVATE)如果你不成功,一定是另外的原因,判断很简单,用调试启动程序(不设断点),正常运行后,在在ONSIZE入口处设一断点,拉动你的对话框的边框,进入断点,可以判断出问题的源.SetWindowPos和TrackPopupMenu没问题.(可能条件不成立,或消息没加入到BEGIN_MESSAGE_MAP--END_MESSAGE_MAP宏中,即它们之间没 ON_WM_SIZE() ON_WM_CONTEXTMENU()) 关于一,我也不太懂。关于二,也许能帮上点忙:好多对话框中用到的控件都不会响应WB_CONTEXTMENU消息,所以这个工作得自己作。在PreTranslateMessage()函数中进行如下处理: if(pMsg->message==WM_RBUTTONUP) { CPoint point; ::GetCursorPos(&point); CRect rect; m_ContentEdit.GetWindowRect(&rect); //将m_ContentEdit替换为你自己的控件。 if(rect.PtInRect(point)) { //ShowCursor(TRUE); CMenu menu; // 装入菜单 menu.LoadMenu(IDR_TEXT_POPUP); // 显示菜单 if(!m_ContentEdit.CanPaste()) menu.EnableMenuItem(ID_EDIT_PASTE,MF_GRAYED); if(!m_ContentEdit.CanUndo()) menu.EnableMenuItem(ID_EDIT_UNDO,MF_GRAYED); menu.GetSubMenu(0)->TrackPopupMenu( TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y,this); } 1. 在OnSize()函数中获得改变的尺寸,得到X和Y方向的变化量,根据公式计算出每一个控件要移动的距离,再使用GetDlgItem(IDC_XXX)->MoveWindow()函数就可以了。2. 对每一个选项产生一条消息的消息响应函数。 1:只要把 this => NULL 就行了!不过有一点要注意:你用了SWP_NOMOVE,那控件的左上角就不会改变了,也就是说SetWindows(...)中的x,y已经不起作用了!! 另外,用MoveWindow(...)也能实现!2:同意happylaodu(青菜豆腐),只要判断当前点是否在控件区域内就能搞定了! 谢谢各位高人!第一个问题我已经解决了,代码段如下:/**************************/void CMyICQDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if(m_wndButMainMn.GetSafeHwnd()) { if(cx>200) m_wndButMainMn.MoveWindow(0,cy-30,70,30); else m_wndButMainMn.MoveWindow(0,cy-30,cx/3,30); } if(m_wndButDsp.GetSafeHwnd()) { if(cx>200) m_wndButDsp.MoveWindow(cx/3,cy-30,70,30); else m_wndButDsp.MoveWindow(cx/2,cy-30,cx/3,30); } if(m_wndTabCtrl.GetSafeHwnd()) { m_wndTabCtrl.SetWindowPos(this,0,0,cx,cy-40,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_NOACTIVATE); } if(m_wndTree.GetSafeHwnd()) { m_wndTree.SetWindowPos(this,0,0,cx,cy-80,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_NOACTIVATE); }}/******************************/或许各位对第二个问题不大清楚,现在重复一遍:在对话框里的控件是:CTree,我已经在树里添加了一些结点,现在:我用右键点击叶结点(如"A"),怎么才能弹出关于结点"A"的菜单? 第一个问题:不要使用 if (m_wndButMainMn.GetSafeHwnd()),可以用:if (::IsWindow(m_wndButMainMn.m_hWnd)) 上次以为你是初学的,代码是别了那看的,如果你的代码是从类向导中导出的,为z会不能运行?最多把你的代码改为如下:void CMyICQDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here/* HTREEITEM hItem; CMenu menuPopu; UINT* pFlages=NULL; if(menuPopu.CreatePopupMenu()) { menuPopu.AppendMenu(MF_STRING,ID_MENU_A,"Test"); } hItem=m_wndTree.HitTest( point,pFlages ); if(hItem!=NULL) menuPopu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);*/ CRect pt; CMenu menuPopu; if(menuPopu.CreatePopupMenu()) { menuPopu.AppendMenu(MF_STRING,ID_HELP,"Test"); } ::GetWindowRect(m_wndTree.m_hWnd ,&pt); if(pt.PtInRect (point)) menuPopu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);}然后在你的对话框中击右键,只在m_wndTree区域中会弹出菜单来吧. 上哪儿实习呢? 好不容易把vs2005装上了,一天的时间就弄这个了 有什么mfc书是按照例子一步一步的叫? 关于显示图片问题 win32 中怎么调用MFC 这边打帝国的程序员进来冒个泡吧, varValue.m_pstring->GetBuffer(1)); SetDlgItemInt 未设置成功的问题 程序最小化到任务栏时,闪烁 有人会用VC做人工智能吗? 新手问题:关于类 请问:用CSocketFile怎么发送文件?
m_wndBut.SetWindowPos( this,cx/80,cy/100,cx/10,cy/50,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_N OACTIVATE)------>
m_wndBut.SetWindowPos( NULL,0,0,cx/10,cy/50,SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW|SWP_NOACTIVATE)如果你不成功,一定是另外的原因,判断很简单,用调试启动程序(不设断点),正常运行后,在在ONSIZE入口处设一断点,拉动你的对话框的边框,进入断点,可以判断出问题的源.SetWindowPos和TrackPopupMenu没问题.(可能条件不成立,或消息没加入到BEGIN_MESSAGE_MAP--END_MESSAGE_MAP宏中,即它们之间没 ON_WM_SIZE() ON_WM_CONTEXTMENU())
关于二,也许能帮上点忙:
好多对话框中用到的控件都不会响应WB_CONTEXTMENU消息,所以这个工作得自己作。
在PreTranslateMessage()函数中进行如下处理:
if(pMsg->message==WM_RBUTTONUP)
{
CPoint point;
::GetCursorPos(&point);
CRect rect;
m_ContentEdit.GetWindowRect(&rect); //将m_ContentEdit替换为你自己的控件。
if(rect.PtInRect(point))
{
//ShowCursor(TRUE);
CMenu menu;
// 装入菜单
menu.LoadMenu(IDR_TEXT_POPUP);
// 显示菜单
if(!m_ContentEdit.CanPaste())
menu.EnableMenuItem(ID_EDIT_PASTE,MF_GRAYED);
if(!m_ContentEdit.CanUndo())
menu.EnableMenuItem(ID_EDIT_UNDO,MF_GRAYED);
menu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
point.x, point.y,this);
}
2. 对每一个选项产生一条消息的消息响应函数。
另外,用MoveWindow(...)也能实现!
2:同意happylaodu(青菜豆腐),只要判断当前点是否在控件区域内就能搞定了!
/**************************/
void CMyICQDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if(m_wndButMainMn.GetSafeHwnd())
{
if(cx>200)
m_wndButMainMn.MoveWindow(0,cy-30,70,30);
else
m_wndButMainMn.MoveWindow(0,cy-30,cx/3,30);
} if(m_wndButDsp.GetSafeHwnd())
{
if(cx>200)
m_wndButDsp.MoveWindow(cx/3,cy-30,70,30);
else
m_wndButDsp.MoveWindow(cx/2,cy-30,cx/3,30);
}
if(m_wndTabCtrl.GetSafeHwnd())
{
m_wndTabCtrl.SetWindowPos(this,0,0,cx,cy-40,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_NOACTIVATE);
} if(m_wndTree.GetSafeHwnd())
{
m_wndTree.SetWindowPos(this,0,0,cx,cy-80,SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+SWP_NOACTIVATE);
}}
/******************************/
或许各位对第二个问题不大清楚,现在重复一遍:
在对话框里的控件是:CTree,我已经在树里添加了一些结点,现在:
我用右键点击叶结点(如"A"),怎么才能弹出关于结点"A"的菜单?
if (::IsWindow(m_wndButMainMn.m_hWnd))
最多把你的代码改为如下:
void CMyICQDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
/* HTREEITEM hItem;
CMenu menuPopu;
UINT* pFlages=NULL;
if(menuPopu.CreatePopupMenu())
{
menuPopu.AppendMenu(MF_STRING,ID_MENU_A,"Test");
}
hItem=m_wndTree.HitTest( point,pFlages );
if(hItem!=NULL)
menuPopu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
*/ CRect pt;
CMenu menuPopu;
if(menuPopu.CreatePopupMenu())
{
menuPopu.AppendMenu(MF_STRING,ID_HELP,"Test");
}
::GetWindowRect(m_wndTree.m_hWnd ,&pt);
if(pt.PtInRect (point))
menuPopu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);}
然后在你的对话框中击右键,只在m_wndTree区域中会弹出菜单来吧.