1,怎样改变视图的大小?
一般,你能改变试图大小依靠 MoveWindow()
MFC应用程序,视图是所围绕其框架的子窗口,获取其框架的指针GetParentFrame(),然后依靠MoveWindow()改变框架大小,视图大小自动跟随框架大小改变。
2,如何改变一个CFormView的大小?
首先,你要在你的CFormView中重载OnInitialUpdate()函数,该函数声明如下:
virtual void OnInitialUpdate();
在OnInitialUpdate()添加如下代码:
void ClikethisView::OnInitialUpdate()//ClikethisView从CFormView继承而来
{
// Make the window the size of the main dialog.
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit( /*FALSE*/ );
}
3,如何改变一个视图的背景?
想改变CView、CFrameWnd或者CWnd的背景,需要处理WM_ERASEBKGND 消息。
像下面演示的这样:
BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
{
// 设置背景画刷颜色
CBrush backBrush(RGB(255, 128, 128));
// 保存旧画刷
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect); // 擦掉所要画的区域
pDC->PatBlt(rect.left, rect.top, rect.Width(),
rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
4,改变对话框背景颜色后,如何使控件的背景颜色和对话框背景颜色统一?
请看下面代码: 重载画控件的消息。
HBRUSH dlgtest::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));
}
5,如何获得当前视图的指针?
((CFrameWnd*) AfxGetApp()->m_pMainWnd))->GetActiveDocument();
或者
((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
6,如何获得MDI程序的所有视图?
下面函数对你有用:
CDocument::GetFirstViewPosition(); // DOCCORE.CPP
CDocument::GetNextView(); // DOCCORE.CPP
CMultiDocTemplate::GetFirstDocPosition(); // DOCMULTI.CPP
CMultiDocTemplate::GetNextDoc(); // DOCMULTI.CPP
文档精彩问答:
1,如何获得当前文档指针?
参照:上面“如何获得当前视图指针?”
2,文档什么时候被破坏?
单文档程序的文档当程序退出时被破坏。
多文档程序在最后一个视图关闭时被破坏。
3,如何获得当前打开文档的列表?
下面代码,MyApp从CWinApp继承而来,MyApp的成员变量:
CPtrList m_templateList
void CMyApp::GetDocumentList(CObList * pDocList)
{
ASSERT(pDocList->IsEmpty());
POSITION pos = m_templateList.GetHeadPosition();
while (pos)
{
CDocTemplate* pTemplate =
(CDocTemplate*)m_templateList.GetNext(pos);
POSITION pos2 = pTemplate->GetFirstDocPosition();
while (pos2)
{
CDocument * pDocument;
if ((pDocument=pTemplate->GetNextDoc(pos2)) != NULL)
pDocList->AddHead(pDocument);
}
}
}
4,如何不叫我的程序自动打开文档?
在InitInstance()函数中
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing
1.如何让我的程序运行的时候最大化?
(1)在appwizard第4步选择“advanced"从中选择Mainframe的Maximized
(2)对于MDI程序,在CWinApp::InitInstance() 中做下面改动
// Create main MDI Frame window.
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_nCmdShow = SW_SHOWMAXIMIZED; // 注意添加此行!!!
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
m_pMainWnd = pMainFrame;
(3)对于SDI程序,在CWinApp::InitInstance() 中的OnFileNew()调用之前
m_nCmdShow = SW_SHOWMAXIMIZED;
// 下面创建空文档
OnFileNew();
2,如何给其他线程发消息?
用SendNotifyMessage() 函数。
3,如何让我的程序只运行一次?
const char* MyMainWndClassName = "MyMainWndXQW"
BOOL CMyApp::InitApplication()
{
// Call base class. Default version does nothing.
CWinApp::InitApplication();
WNDCLASS wndcls;
// Start with NULL defaults.
memset(&wndcls, 0, sizeof(WNDCLASS));
// Get class information for default window class.
::GetClassInfo(AfxGetInstanceHandle(),"AfxFrameOrView",&wndcls);
// Substitute unique class name for new class.
wndcls.lpszClassName = MyMainWndClassName;
// Register new class and return the result code.
return ::RegisterClass(&wndcls);
}
BOOL CMyApp::FirstInstance()
{
CWnd *PrevCWnd, *ChildCWnd;
// Determine if another window with our class name exists.
PrevCWnd = CWnd::FindWindow(MyMainWndClassName, NULL);
if (PrevCWnd != NULL)
{
// If so, does it have any pop-ups?
ChildCWnd=PrevCWnd->GetLastActivePopup();
// Bring the main window to the top.
PrevCWnd->BringWindowToTop();
// If iconic, restore the main window.
if (PrevCWnd->IsIconic())
PrevCWnd->ShowWindow(SW_RESTORE);
// If there are pop-ups, bring them along too!
if (PrevCWnd != ChildCWnd)
ChildCWnd->BringWindowToTop();
// Return FALSE. This isn't the first instance
// and we are done activating the previous one.
return FALSE;
}
else
// First instance. Proceed as normal.
return TRUE;
}
CMyApp::InitInstance()
{
if (!FirstInstance())
return FALSE;
// ...
}
4,MDI程序,关闭子窗口同时关闭父窗口,该如何做?
在子窗口的OnClose函数里添加
ASSERT(AfxGetMainWnd() != NULL);
AfxGetMainWnd()->SendMessage(WM_CLOSE);
菜单问题:
1,我在程序中用了MenuBar,结果找不到菜单了,我的方法是:
CMenu *menu;
menu = GetMenu()->GetSubMenu(0);
答:
AfxGetApp()->m_pMainWnd->GetMenu()->GetSubMenu(0);
2,如何动态修改MainFrame的菜单?
CMenu newMenu;
newMenu.LoadMenu (IDR_MENU1);
AfxGetMainWnd()->SetMenu( &newMenu );
AfxGetMainWnd()->DrawMenuBar();
newMenu.Detach ();
回复贴子:
回复人:bestone()
(2001-4-30 23:34:00) 得0分
很好。继续努力。
回复人:111222(111222@0451.com)
(2001-4-30 23:49:00) 得0分
我请大家把自己遇到的常见问题的解答跟在下面:)
问:MFC程序如何处理WM_SETTEXT消息?
答:
MFC没有提供WM_SETTEXT消息的映射函数,所以需要我们自己定义
在message map里面
OnMessage(WM_SETTEXT, OnSetText)
在.h里面声明
void LRESULT CMyClass::OnSetText(wParam, lParam);//bool...等等函数类型自己决定
回复人:111222(111222@0451.com)
(2001-4-30 23:56:00) 得0分
问:如何注册自己的消息?
答:
在message map里面
#define ON_WM_CHKTBLTOGGLE()
{
WM_CHKTBLTOGGLE, 0, AfxSig_vwp, (AFX_PMSG)(AFX_PMSGW)(BOOL
(AFX_MSG_CALL CWnd::*)(BYTE, BYTE))OnChkTblToggle
},
ON_MESSAGE(WM_CHKTBLTOGGLE, OnChkTblToggle)
如此声明消息函数
afx_msg LRESULT OnChkTblToggle(WPARAM wParam, LPARAM lParam);
LRESULT CMyView::OnChkTblToggle(WPARAM wParam, LPARAM lParam)
{
// TODO: write your code here.
}
void CMYView::OnChkTblToggle(UINT, CPoint)
回复人:antwork(人是要有点精神的)
(2001-4-30 23:57:00) 得0分
go on, buddy!
回复人:jumbo6(jumbo6)
(2001-5-1 0:42:00) 得0分
关注
回复人:111222(111222@0451.com)
(2001-5-1 1:26:00) 得0分
问:如何使我的窗口总位于屏幕顶端?
SetWindowPos(&wndTopMost,NULL,NULL,NULL,NULL,SWP_NOMOVE??SWP_NOSIZE)
回复人:111222(111222@0451.com)
(2001-5-1 1:29:00) 得0分
问:如何把窗口带到其他窗口前端?(不是总在前端)
SetWindowPos(&wndTop,NULL,NULL,NULL,NULL,SWP_NOMOVE??SWP_NOSIZE)//注意这里第一个参数不同于上面问题的
BringWindowToFront();//这个也可以
回复人:111222(111222@0451.com)
(2001-5-1 1:34:00) 得0分
问:MFC要完蛋了么?(大家对.net于mfc的关系存在很大疑问嘛~我还没有用过.net,我的硬盘太小、、CPU太老、、内存太少、、、)
答:(不是我说的,是MS的工程师说的,我翻译一下而已)
MFC一直在成长,随着操作系统的改变而改变着,MFC也许会改变方向,或者改换名字,但实质性的东西是不会改变的!MFC不会完蛋(原文是:MFC won't be dead)
回复人:vcbacker(VC支持者)
(2001-5-1 1:45:00) 得0分
很好,多谢你。
回复人:111222(111222@0451.com)
(2001-5-1 2:12:00) 得0分
问:如何改变主窗口标题?
AfxGetApp()->m_pMainWnd->SetWindowText("自己的题目叫什么好呢?");
AfxGetMainWnd()->SetWindowText ( "叫111222吧" )
问:怎么弄一个HDC创建一个CDC?
有时候window API会给你一个DC的句柄,而你想利用其CDC,比如自画ComBox、按钮、tabctrl等等
下面有两种方法从一个hdc创建到CDC,你能把它们利用到任何MFC应用程序中!
方法一:
void MyODList::DrawItem(LPDRAWITEMSTRUCT lpDrawItem)
{
CDC myDC;
myDC.Attach(lpDrawItem->hDC);
//在这里做你想做的!
//I如果你不做下面的 detach, window会很不高兴哦:)
myDC.Detach();
}
方法二:
CDC* pDC = CDC:FromHandle(lpDrawItem->hDC);
没法说出上面良种方法在效率资源上的差异,至少下面的很简单,并且,你不会因忘记detach出错....
回复人:summer_xzw(热锅上的一头蚂蚁)
(2001-5-1 2:23:00) 得0分
支持
回复人:zhaowuqing(我尽力而为)
(2001-5-1 8:56:00) 得0分
应该放到你的个人网站里,放到这时间久了就打不开了,THANKS A LOT
回复人:111222(111222@0451.com)
(2001-5-1 9:47:00) 得0分
全都paste到http://cgi.ifree.533.net/guestbook/igb.cgi
去了
记住http://toilet.533.net这个域名,访问留言板就总能找到这些faq
回复人:cnss(山上有狼)
(2001-5-1 10:29:00) 得0分
关注
回复人:chen_jun_fen(cjf)
(2001-5-1 10:38:00) 得0分
这位仁兄你能告说我 方法2吗?
回复人:chen_jun_fen(cjf)
(2001-5-1 10:53:00) 得0分
谢谢你,可以显示了,
我还有一个问题,可不可以再麻烦你一下,
怎样把屏幕图象截取下来,
千分激动,万分感谢,
我是一个初学者,以后要多多指教老弟,可否
回复人:wjyasd(孤独的人是可爱的.)
(2001-5-1 11:55:00) 得0分
英雄!~~~~~~~~~~~~~~
回复人:111222(111222@0451.com)
(2001-5-1 12:08:00) 得0分
面对着wjyasd的称赞,111222勇敢的站了出来!(也不脸红!)
说道:“我再贴一个
如何去掉窗口的标题条?
答:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
LONG dwStyle = ::GetWindowLong(GetSafeHwnd(), GWL_STYLE):
dwStyle &= ~(WS_CAPTION¦WS_BORDER ):
::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle):
//.....
回复人:ggyy(天上的乌云撵乌云,地上的女人追男人呢!)
(2001-5-1 12:14:00) 得0分
看看:)
回复人:iiowen(精彩瞬间)
(2001-5-1 15:28:00) 得0分
好经典的问题,帮了我好多忙
回复人:xiebo(xiebopublic@263.net)
(2001-5-1 17:37:00) 得0分
To :chen_jun_fen(cjf)
Q:怎样把屏幕图象截取下来,
A:《Visual C++ MFC扩展编程实例》(VC++ MFC Extensions by Example)P.231有你想要的
Good luck!
回复人:jsshfj(网介)
(2001-5-1 21:26:00) 得0分
谢谢你的总结,非常好,多做一些这样的事,对于初学者来说会非常感激你的
回复人:lj9852(老实狼)
(2001-5-1 22:04:00) 得0分
我还没开始学mfc,但我代表菜鸟谢谢你!
回复人:zhouwenjie(小周)
(2001-5-1 22:09:00) 得0分
动态建立ODBC数据源,我今天刚弄出来的。
char* szDesc;
int mlen;
szDesc=new char[256];
//sprintf(szDesc,"DSN=%s: DESCRIPTION=TOC support source: DBQ=%s: FIL=MicrosoftAccess: DEFAULTDIR=D:\\Database:: ","TestDB","D:\\Friends.mdb");
sprintf(szDesc,"DSN=%s^ DESCRIPTION=TOC support source^ DBQ=%s^ FIL=MicrosoftAccess^ DEFAULTDIR=%s^^",
"MyDB",m_gDbIndex_file,m_gDb_path);
mlen = strlen(szDesc);
for (int i=0; i<mlen; i++)
{
if (szDesc[i] == '^')
szDesc[i] = '\0';
}
if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc))
MessageBox("Failed","INFORMATION",MB_OK);
else
MessageBox("Sucess","INFORMATION",MB_OK);
回复人:111222(111222@0451.com)
(2001-5-1 23:53:00) 得0分
上面有个问答
Q:如何不叫我的程序自动打开文档?
A:
在InitInstance()函数中
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing
但是这样文档总也打不开了
“怎样不叫MDI的子窗口自动出现,除非我按NEW”
回复人:vcbacker(VC支持者)
(2001-4-27 17:32:00) 得5分
在App的InitInstance函数里面找下面这一段:
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
在它后面加入:
if(cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew){
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
}
就行了,来自《vc++内幕》