
Frame里面只能加载CView或者由CView继承而来的子类,不能直接加载对话框。 你可以考虑d出的方式加载对话框。或者将对话框的基类改成CFormView,在修改对应的位置,基本上就是初始化的几个消息要修改一下。 class CDlgView: public CFormView 只需要改几个消息的。
如何修改frame窗口的背景颜色?
MDI窗口的客户区是由frame窗口拥有的另一个窗口覆盖的。为了改变frame窗口背景的颜色,只需要这个客户区的背景颜色就可以了。你必须自己处理WM_ERASEBKND消息。下面是工作步骤:
创建一个从CWnd类继承的类,就叫它CMDIClient吧;
在CMDIFrameWnd中加入CMDIClient变量;(具体情况看下面的代码)
#include "MDIClienth"
class CMainFrame : public CMDIFrameWnd
{
protected:
CMDIClient m_wndMDIClient;
}
重载CMDIFrameWnd::OnCreateClient,下面是这段代码,请注意其中的SubclassWindow();
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext pContext)
{
if ( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )
{
m_wndMDIClientSubclassWindow(m_hWndMDIClient);
return TRUE;
}
else
return FALSE;
}
最后要在CMDIClient中加入处理WM_ERASEBKGND的函数。
如何改变view的背景颜色?
若要改变CView,CFrameWnd或CWnd对象的背景颜色需要处理WM_ERASEBKGND消息,下面就是一个范例代码:
BOOL CSampleView::OnEraseBkgnd(CDC pDC)
{
//设置brush为希望的背景颜色
CBrush backBrush(#ff8080);
//保存旧的brush
CBrush pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);
//画需要的区域
pDC->PatBlt(rectleft, recttop, rectWidth(), rectHeight(), PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
若要改变CFromView继承类的背景颜色
下面是一个范例代码:
HBRUSH CMyFormView::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor)
{
switch (nCtlColor)
{
case CTLCOLOR_BTN:
case CTLCOLOR_STATIC:
{
pDC->SetBkMode(TRANSPARENT);
//不加任何处理或设置背景为透明
}
case CTLCOLOR_DLG:
{
CBrush back_brush;
COLORREF color;
color = (COLORREF) GetSysColor(COLOR_BTNFACE);
back_brush = new CBrush(color);
return (HBRUSH) (back_brush->m_hObject);
}
}
return(CFormView::OnCtlColor(pDC, pWnd, nCtlColor));
}
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
主框架代码:
#include "ChildFrmh"
class CMainFrame : public CMDIFrameWnd
{
DECLARE_DYNAMIC(CMainFrame)
public:
CMainFrame();
Attributes
public:
CChildFrame m_pAdd;
}
CMainFrame::OnManageAdd()
{
创建新子框架和视
m_pAdd = new CChildFrame();
CCreateContext context;
contextm_pNewViewClass=RUNTIME_CLASS(CAddView);
if(!m_pAdd->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_PREFIXTITLE ,this, &context )) return;
m_pAdd->InitialUpdateFrame(NULL,TRUE);
}
子框架类:
class CAddView : public CFormView
{
protected:
CAddView(); protected constructor used by dynamic creation
DECLARE_DYNCREATE(CAddView)
Form Data
public:
CString m_strID;
CString m_strPasswd;
CString m_strName;
}
请问主框架中如何反问子框架的成员?
m_strID,m_strPasswd等?
解析:
CMDIFrameWnd pFrame = (CMDIFrameWnd)AfxGetApp()->m_pMainWnd;
CMyChildFrame pChild = (CMyChildFrame) pFrame->GetActiveFrame();
CAddViewpView = (CFormJHRK ) pChild->GetActiveView();
在窗口销毁函数里面删除
添加WM_DESTROY 消息响应函数
CMyFrame::DestroyWindow()
{
m_pMyview->CloseWindow();
delete m_pMyview;
}
你最好可以在初始化时将m_pMyview=NULL;在在程序运行中可以根据需要判断窗口是否已经创建。
主菜单就是在CmainFrame里添加IDM_TEST消息响应ON_COMMAND
m_pMyframe是与m_pMyview相连的,只要m_pMyview关闭了,相应的资源就释放掉了,就像CMainFrame pMainFrame = new CMainFrame;同样不需要手动删除。
贴图没有显示呀。你可以试一试把改变其他控件位置的代码放在一个定时器消息函数里,程序运行后启动一定时器,比如定时100毫秒,进入定时器消息函数后先关闭定时器,在调整控件位置。这样可以保证框架和视图已经最大化后才进行调整控件位置。
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
我写了一个基于CFormView的多重文旦程序,我为他的子框架窗口(基于CFormView)添加了:afx_msg void OnMove(int x, int y)函数,为何当我移动子框架窗口时,OnMove(int x, int y)函数没有被调用,OnMove函数只有在子框架窗口生成时被调用
怎样实现在子框架窗口移动时调用OnMove(int x, int y)?
解析:
void CMainFrame::OnMove(int x, int y)
{
CMDIFrameWnd::OnMove(x, y);
MessageBox("MainFrame::OnMove!");
TODO: Add your message handler code here
---------------------得到子架窗口的指针-------------------------------------
CMDIFrameWnd pFrame = (CMDIFrameWnd)AfxGetApp()->m_pMainWnd;
CMyChildFrame pChild = (CMyChildFrame) pFrame->GetActiveFrame();
if(pChild->GetActiveView()==NULL)假如没有当前子架窗口
return;
CString m_ChildFrameName="";储存主架窗口的名称
GetWindowText(m_ChildFrameName);得到主架窗口的名称
----------------------------------------------------------------------------
------------------------隐藏进货入库窗口的d出式列表框-----------------------
int a=m_ChildFrameNameFind("进货入库");判断当前窗口是不是进货入库窗口
MessageBox(m_ChildFrameName);
if(a!=-1)假如是进货入库子架窗口
{
CFormJHRK pView = (CFormJHRK ) pChild->GetActiveView();
pView->m_LineBottomSetFocus();设置焦点到m_LineBottom控件--为防止其他控件得到焦点
if(pView->m_EGYSm_poplist->IsWindowVisible())
{
pView->m_EGYSm_poplist->ShowWindow(false);隐藏供应商列表框
}
if(pView->m_EYGm_poplist->IsWindowVisible())
{
pView->m_EYGm_poplist->ShowWindow(false);隐藏员工列表框
}
if(pView->m_ECKm_poplist->IsWindowVisible())
{
pView->m_ECKm_poplist->ShowWindow(false);隐藏仓库列表框
}
if(pView->m_EKPLXm_poplist->IsWindowVisible())
{
pView->m_EKPLXm_poplist->ShowWindow(false);隐藏开票类型列表框
}
return;
}
------------------隐藏进货入库窗口的d出式列表框结束------------------------
/也跟着主框架窗体移动
::PostMessage(pView->m_EGYSGetSafeHwnd(),MYMESSAGE_EDIT_MOVED,0,0);
::PostMessage(pView->m_EYGGetSafeHwnd(),MYMESSAGE_EDIT_MOVED,0,0);
::PostMessage(pView->m_ECKGetSafeHwnd(),MYMESSAGE_EDIT_MOVED,0,0);
::PostMessage(pView->m_EKPLXGetSafeHwnd(),MYMESSAGE_EDIT_MOVED,0,0);
另外一种方法
/ CView pView = this->GetActiveFrame()->GetActiveView();
if(pView==NULL)
HWND mm=static_cast<CFormJHRK>(pView)->m_EGYSGetSafeHwnd();
::PostMessage(mm,MYMESSAGE_EDIT_MOVED,0,0);/
}
以上就是关于MFC关于如何在CView中显示对话框全部的内容,包括:MFC关于如何在CView中显示对话框、如何修改frame窗口的背景颜色、在VC++MDI的主框架中如何反问子框架的成员等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)