1.关于通过代码获得应用程序主窗口的指针
基于MFC框架的主窗口指针保存在CWinThread::m_pMainWnd 中,调用AfxGetMainWnd()函数即可得到,如:
AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);//程序最大化
2.关于改变窗口风格
调用PreCreateWindow() 函数,改变CREATESTRUCT中的参数,如:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
// 初始化大小屏幕1/3的窗口…………………………
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;
cs.y = ((cs.cy * 3) - cs.cy) / 2;
cs.x = ((cs.cx * 3) - cs.cx) / 2;
return TRUE;
}
3.关于去掉程序窗口上“无标题”字样
重载CWnd::PreCreateWindow()函数以去掉FWS_ADDTOTITLE风格
cs.style &= ~FWS_ADDTOTITLE;//除去自动添加标题风格
调用CWnd::SetWindowText()函数来设置标题
4.防止把文档名预置成应用程序名
重载CWnd::PreCreateWindow()函数以去掉FWS_PREFIXTITLE风格
cs.style &= ~FWS_PREFIXTITLE;
5.改变窗口标题的内容
重载CWnd::PreCreateWindow()函数更改
// cs.lpszName = "My Testing Program";//此法不行,最终控制窗口标题的是变量m_strTitle的值
m_strTitle = "My Testing Program";
6.在程序运行时改变窗口标题
法1:程序中适当的地方加入以下代码
AfxGetApp()->m_pMainWnd->SetWindowText("My Title");
或者
AfxGetMainWnd()->SetWindowText("My Title");
法2:文档对象中调用
CDocument::SetTitle(L"My Title");//改的是小窗口的标题
7.在文档改变时为窗口标题显示一个“*”号
void CMyDoc::SetModifiedFlag(BOOL bModified)
{
CString strTitle = GetTitle();
CString strDirtyFlag = L" *";//前面要加个“L”转换
if (!IsModified() && bModified)
{
SetTitle(strTitle + strDirtyFlag);
}
else if(IsModified() && !bModified)
{
int nTitleLength = strTitle.GetLength();
int nDirtyLength = strDirtyFlag.GetLength();
SetTitle (strTitle.Left(nTitleLength - nDirtyLength));
}
UpdateFrameCounts();
CDocument::SetModifiedFlag(bModified);
}
8.改变窗口图标
向窗口发送WM_SECTION消息,如:
HICON hIcon = AfxGetApp() -> LoadIcon(IDI_ICON);
ASSERT(hIcon);
AfxGetMainWnd()->SendMessage(WM_SECTION, TRUE, (LPARAM) hIcon);
9.最高窗口的实现
在主框架窗口类CMainFrame中的PreCreateWindow()函数中加入:
cs.dwExStyle = WS_EX_TOPMOST;
实现基于对框的应用程序的最高窗口,则要重载OnIniDialog()函数,加入如下代码:
const CWnd* pWndInsertAfter;
pWndInsertAfter = &wndTopMost;
SetWindowPos(pWndInsertAfter, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
10.运行时使程序处于最前面
法1:SetWindowPos(&wndTopMost, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
这种情况下,当程序运行时,尽管用户激活了其他程序,但这个程序总会在最前面(标题变灰)
法2:用户的程序弹出到当前所有程序的最前面
SetWindowPos(&wndTop, NULL, NULL,NULL, NULL,SWP_NOMOVE | SWP_NOSIZE)
或者 BringWindowToFront();
//让程序始终处于所有程序的最前面
void CMyView::OnViewStatusTopanyway()
{
AfxGetMainWnd()->SetWindowPos(&wndTop, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
}
//让程序弹出到当前的最前面
void CMyView::OnViewStatusTopmove()
{
//AfxGetMainWnd()->SetWindowPos(&wndTop, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
AfxGetMainWnd()->BringWindowToTop();
}
11.得到子窗口在主窗口中的相对坐标
可以先用ClientToScreen()函数转成屏幕坐标,然后ScreenToClient()函数转成主函数坐标;
或 MapWindowPoints(hwndChild, hwndParent, (POINT FAR *)lprc, 2);
其中lprc设成子窗口内的坐标(0,0,width,height)
12.移动窗口
调用CWnd::SetWindowPos()函数并指定SWP_NOSIZE标志。目的位置与父窗口有关。调用CWnd::MoveWindow()函数时必须要指定窗口的大小。
SetWindowPos(NULL, 100, 100, 0, 0, SWP_NOSIZE | SWP_NOZORDER);//移动窗口到父窗口的(100,100)处
13.重置窗口的大小
调用CWnd::SetWindowPos()函数并指定SWP_NOMOVE标志,也可以调用CWnd::MoveWindow()函数,但必须指定窗口的位置
//得到窗口的尺寸大小
CRect reWindow;
GetWindowRect(reWindow);
//使窗口变为原来的2倍宽和2倍高
SetWindowPos(NULL, 0, 0, reWindow.Width*2, reWindow.Height*2, SWP_NOMOVE | SWP_NOZORDER);