现在的位置: 首页 > 综合 > 正文

mfc 常用方法

2018年06月07日 ⁄ 综合 ⁄ 共 2890字 ⁄ 字号 评论关闭

1. 在任务栏隐藏对话框

      ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);


2. 使对话框为顶层窗口

        SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE)


3. 在运行时添加最大化,最小化按钮

    SetWindowLong(this->m_hWnd, GWL_STYLE,
                  GetWindowLong(this->m_hWnd, GWL_STYLE) |
                  WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
     UpdateWindow();


4. 使能对话框右上角关闭按钮
    在OnInitDialog中

    方法一:
       CMenu* menu = GetSystemMenu(FALSE);
       menu->ModifyMenu(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED );

    方法二:
       CMenu* menu = GetSystemMenu(FALSE);
       menu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);


5. 当对话框一部分在屏幕外时,显示全部对话框

    SendMessage(DM_REPOSITION);


6. 改变鼠标外形
    添加 WM_SETCURSOR 消息映射函数

    BOOL CTest6Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
    {
         SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HELP));

         return 0; 
    }


7. 改变对话框背景色和文本颜色
    在CTest6App的InitInstance中添加
    SetDialogBkColor(RGB(255,0,0), RGB(0,255,0));


8. 改变对话框caption上的图标
    导入自己的图标资源到工程中,把原来ID为 IDR_MAINFRAME 的资源删除,把新的图标的ID命名为IDR_MAINFRAME


9. 在主对话框显示前,显示一个login对话框
     BOOL CTest6App::InitInstance()
     {
          //...
          int nResponse;
          CLoginDlg loginDlg;

          nResponse = loginDlg.DoModal();
          if (nResponse == IDOK)
          {
          }
          if (nResponse == IDCANCEL)
          {
               return FALSE;
          }
 
          CTest6Dlg dlg;
          m_pMainWnd = &dlg;
          int nResponse = dlg.DoModal();
          if (nResponse == IDOK )
          {
          }
          else if (nResponse == IDCANCEL)
          {
          }
          return FALSE;
     }

然后重载CLoginDlg对话框的哦OnOK(),在其中判断条件
void CLoginDlg::OnOK()
{
     if (条件满足)
        CDialog::OnOK();
     else
        AfxMessageBox(_T("invalid password!"));
}


10. 在对话框中添加工具栏

    方法一:添加以下代码到 OnInitDialog 中
 
     if ( !m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1) )
     {
          TRACE0("Failed to Create Dialog Toolbar\n");
          EndDialog(IDCANCEL);
     }

     CRect rcClientOld; // 久客户区RECT
     CRect rcClientNew; // 加入TOOLBAR后的CLIENT RECT
     GetClientRect(rcClientOld); //
     // Called to reposition and resize control bars in the client area of a window
     // The reposQuery FLAG does not really traw the Toolbar.  It only does the calculations.
     // And puts the new ClientRect values in rcClientNew so we can do the rest of the Math.
     //重新计算RECT大小
     RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                       AFX_IDW_CONTROLBAR_LAST,
                       0,
                       reposQuery,
                       rcClientNew);

    // All of the Child Windows (Controls) now need to be moved so the Tollbar does not cover them up.
     //所有的子窗口将被移动,以免被TOOLBAR覆盖
     // Offest to move all child controls after adding Tollbar
     //计算移动的距离
     CPoint ptOffset(rcClientNew.left-rcClientOld.left,
       rcClientNew.top-rcClientOld.top);

     CRect rcChild;
     CWnd* pwndChild = GetWindow(GW_CHILD);  //得到子窗口
     while(pwndChild) // 处理所有子窗口
     {
          //移动所有子窗口
         pwndChild->GetWindowRect(rcChild);
          ScreenToClient(rcChild);
    

抱歉!评论已关闭.