VC编程基础之应用程序框架

 

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);

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值