MFC笔记

来源:互联网 发布:淘宝买家信誉如何提升 编辑:程序博客网 时间:2024/06/07 19:31
一、(1)API:(Application Programming Interface): 应用程序中调用这个函数,操作系统就会执行相应的功能,这个过程就叫做系统调用。
        (2):对事件作出反应的过程,这个通过消息(是一个结构体)来实现

typedef struct {
    HWND hwnd;
    UINT message;
    WPARAM wParam;//是整形,消息附加参数
    LPARAM lParam;
    DWORD time;   //消息被传递的时间
    POINT pt;     //光标
} MSG, *PMSG

(3)句柄(HWND):资源的标识,通过句柄去索引我们所需要的资源。
 
    (4):消息队列:先进先出的消息缓冲区。
二、WinMain:Windows程序的入口函数

int WINAPI WinMain(

    HINSTANCE hInstance,        //当前实例:handle to current instance
    HINSTANCE hPrevInstance,    //前一个实例:handle to previous instance
    LPSTR lpCmdLine,            //字符串指针类型,命令行参数
    int nCmdShow                //显示的状态 show stat
);


//注意:在程序中我们经常要用到一类变量,这个变量里的每一位都对应某种特征,当为1时表示有这种特征。当想要去掉某种特性时,可以将该特征~取反后与之&。


三、C++的一些回顾:




四、获得字体的信息:创建字处理插入符号
CDC::GetTextMetrics(TextMETRIC );获得字体信息


只有字体满足升序和降序的条件,才不会覆盖字体,能把字体完整的显示出来()


//具体代码
    CClientDC dc(this);
    TEXTMETRIC tm;         //字体信息结构体
    dc.GetTextMetrics(&tm);//获取当前字体信息

    CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//创建插入符号
    ShowCaret();           //显示插入符号

2、创建图形插入符:CreateCaret();
 


//CBitmap bitmap;出错原因事该对象在函数完之后析构了,因为是局部变量
      m_bitmap.LoadBitmap(130);
      CreateCaret(&m_bitmap);
      ShowCaret();

3、输出一段话到窗口:
      virtualvoidOnDraw(CDC*pDC); //重写以绘制该视图
该函数在窗口重新绘制的时候会调用

void CFive_LessonView::OnDraw(CDC* pdc/*pDC*/)
{
      CFive_LessonDoc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
      if (!pDoc)
            return;
      CString str("Never give up,Even succeed!");
      pdc->TextOut(100,100,str);
      // TODO: 在此处为本机数据添加绘制代码
      CString str1;
      str1.LoadString(61445);//参数:字符串资源的ID
      pdc->TextOut(0,200,str1);
}
CString::LoadString:该函数可以调用字符串资源
字符在屏幕上的长度和宽度:CDC::GetTextExtent(str);返回只是一个长度类对象 CSize
4、路进程

void CFive_LessonView::OnDraw(CDC* pdc/*pDC*/)//该消息是在窗口发生重新绘制的时候会调用,且该函数是虚函数,在View类中本身就有的
{
      CFive_LessonDoc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
      if (!pDoc)
            return;
    CString str("Never give up,Even succeed!");
      pdc->TextOut(100,100,str);
      // TODO: 在此处为本机数据添加绘制代码
      CSize sz = pdc->GetTextExtent(str);
      CString str1;
      str1.LoadString(61445);
      pdc->TextOut(0,200,str1);

      pdc->BeginPath();//路进程开始
      pdc->Rectangle(100,100,100+sz.cx,100+sz.cy);
      pdc->EndPath();//路进程结束,相当于是我的地盘我做主,
      pdc->SelectClipPath(RGN_DIFF);//路进程模式匹配
      for (int i = 0;i<300;i+=10)
      {
            pdc->MoveTo(0,i);
            pdc->LineTo(300,i);

            pdc->MoveTo(i,0);
            pdc->LineTo(i,300);
      }
}

5、字符输入:
OnCreate:当窗口正在创建的时候会使用,可以像其中添加工具栏,光标,以及一些位置初始化的条件。
 OnCreate()是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。在view类中,Create 是虚函数由框架调用,是用来“生成一个窗口的子窗口”。 而OnCreate 函数是用来“表示一个窗口正在生成”。一个窗口创建(Create)之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。因为在MFC里面用一种消息映射的机制来响应消息,也就是可以用函数来响应相应的消息。


void CFive_LessonView::OnLButtonDown(UINT nFlags, CPoint point)
{
      // TODO: 在此添加消息处理程序代码和/或调用默认值

      SetCaretPos(point);//将光标移动到鼠标左键按下的点
      m_strLine.Empty(); //清空字符串
      m_ptOrignal = point; //记录鼠标左键按下的点
      CView::OnLButtonDown(nFlags, point);
}

字符输入的处理

void CFive_LessonView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
      // TODO: 在此添加消息处理程序代码和/或调用默认值
      CClientDC dc(this);
      TEXTMETRIC tm;
      dc.GetTextMetrics(&tm);
//如果是换行符号
      if (nChar == 0x0d)
      {
            m_strLine.Empty();
            m_ptOrignal.y += tm.tmHeight;
      }
      //如果是backspace
      else if (nChar == 0x08)
      {
            COLORREF clr = dc.SetTextColor(dc.GetBkColor());//获得当前背景颜色
            dc.TextOut(m_ptOrignal.x,m_ptOrignal.y,m_strLine);
            m_strLine = m_strLine.Left(m_strLine.GetLength()-1);
            dc.SetBkColor(clr);
      }
      else
      {
            m_strLine += (char)nChar;
      }
      CSize cz1 = dc.GetTextExtent(m_strLine);
      CPoint pt;
      pt.x = m_ptOrignal.x+cz1.cx;
      pt.y = m_ptOrignal.y;
    SetCaretPos(pt);
      dc.TextOut(m_ptOrignal.x,m_ptOrignal.y,m_strLine);

      CView::OnChar(nChar, nRepCnt, nFlags);
}

7、改变字体风格(CEditView/CRichEditView)

CFont::CreatePointFont
BOOL CreatePointFont(  
  int nPointSize,
  LPCTSTR lpszFaceName,  
  CDC* pDC = NULL );


void CFive_LessonView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CClientDC dc(this);
    TEXTMETRIC tm;
    dc.GetTextMetrics(&tm);
//如果是换行符号
    if (nChar == 0x0d)
    {
        m_strLine.Empty();
        m_ptOrignal.y += tm.tmHeight;
    }
    //如果是backspace
    else if (nChar == 0x08)
    {
        COLORREF clr = dc.SetTextColor(dc.GetBkColor());
        dc.TextOut(m_ptOrignal.x,m_ptOrignal.y,m_strLine);
        m_strLine = m_strLine.Left(m_strLine.GetLength()-1);
        dc.SetBkColor(clr);
    }
    else
    {
        m_strLine += (char)nChar;
    }
/*************************************************/
    CFont font;
    font.CreatePointFont(120,_T("Arial"),&dc);
    CFont *pfont = dc.SelectObject(&font);
/*********************************************************/
    CSize cz1 = dc.GetTextExtent(m_strLine);
    CPoint pt;
    pt.x = m_ptOrignal.x+cz1.cx;
    pt.y = m_ptOrignal.y;
    SetCaretPos(pt);
    dc.TextOut(m_ptOrignal.x,m_ptOrignal.y,m_strLine);
    dc.SelectObject(pfont); /*************************************/
    CView::OnChar(nChar, nRepCnt, nFlags);
}


CDC::DrawText

五、菜单的一些操作:
1、属性中的弹出菜单是不可以作为命令来响应的(Pop-up)
2、ID命名要规范
3、对于菜单命令消息的响应:CView-------CDoc------CMainFram------CApp
4、消息  A:标准消息:除WM_COMMAND之外,所有以WM_开头的消息,从CWnd派生的类,都可以接收到这类消息。
             B:命令消息:来自菜单、加速键或工具栏按钮的消息,这类消息都以WM_COMMAND呈现,在MFC中,通过菜单项的标识(ID)来区分不同的命令消息,在SDK中,通过wParam参数标识,从CCmdTarget派生的类,都可以接收到这类消息。
             C:通知消息:由控件产生的消息,例如按钮的单机,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知时间的发生,这类消息也是以WM_COMMAND形式呈现,从CCmdTarget派生的类,都可以接收这类消息。

5、创建标记菜单
菜单本就属于框架窗口:

//在窗口创建完成后对子菜单的一个标记
      GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED);


CWnd::GetMenu();

CMenu* GetMenu( ) const;
//Identifies the menu. The value is NULL if CWnd has no menu. The return value is undefined if CWnd is a child window.

//The returned pointer may be temporary and should not be stored for later use.

CMenu::GetSubMenu();

CMenu* GetSubMenu(  int nPos
) const

CMenu::CheckMenuItem();

菜单的ID从左到右从上到下从0开始,也就是编号
6、创建缺省菜单项(一个子菜单中只有一个缺省菜单项)

CMenu::SetDefaultItem

BOOL SetDefaultItem(  UINT uItem,  BOOL fByPos = FALSE );

 GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
7、图形标记菜单的运用 

BOOL SetMenuItemBitmaps(  UINT nPosition,  UINT nFlags,  const CBitmap* pBmpUnchecked,  const CBitmap* pBmpChecked
);
8、获取图形标记信息的大小

int WINAPI GetSystemMetrics(
  __in  int nIndex
);
//获得系统信息的函数
nIndex
The system metric or configuration setting to be retrieved. This parameter can be one of the following values. Note that all SM_CX* values are widths and all SM_CY* values are heights. Also note that all settings designed to return Boolean data represent TRUE as any nonzero value, and FALSE as a zero value


//显示图形标记菜单
      CString str;
      str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));//获得系统图标的宽度和高度
      MessageBox(str);
      m_bitmap.LoadBitmap(130);
      GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(3,MF_BYPOSITION,&m_bitmap,&m_bitmap);
9、使得菜单项失效

UINT EnableMenuItem(  UINT nIDEnableItem,  UINT nEnable
);

// The code fragment below shows how to disable (and gray out) the
// File\New menu item.
// NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of
// CMainFrame so no ON_UPDATE_COMMAND_UI or ON_COMMAND handlers are
// needed, and CMenu::EnableMenuItem() will work as expected.

CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);


10、使得菜单为空和创建菜单
      SetMenu(NULL);

      CMenu menu;
      menu.LoadMenu(IDR_MAINFRAME);
      SetMenu(&menu);

      menu.Detach();//防止出错
11、MFC菜单项所使用的命令更新

void CMainFrame::OnUpdateFileNew(CCmdUI *pCmdUI)
{
      // TODO: 在此添加命令更新用户界面处理程序代码
      //pCmdUI->Enable(FALSE);
      //if (ID_FILE_NEW == pCmdUI->m_nID)
      if(0 == pCmdUI->m_nIndex)
      {
            pCmdUI->Enable(FALSE);
      }
}

void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)
{
      // TODO: 在此添加命令更新用户界面处理程序代码
      //if (2 == pCmdUI->m_nIndex)
      if(ID_EDIT_CUT == pCmdUI->m_nID)
      {
            pCmdUI->Enable(TRUE);
      }
}
12、单机右键弹出菜单
void CSix_lessonForMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
      // TODO: 在此添加消息处理程序代码和/或调用默认值
    CMenu menu;
      menu.LoadMenu(IDR_MENU1);
      CMenu *pPopup = menu.GetSubMenu(0);

      ClientToScreen(&point);
      pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,this);
      CView::OnRButtonDown(nFlags, point);
}

对弹出的菜单进行响应
void CSix_lessonForMenuView::On32775()
{
      MessageBox("CViewCopy!");
      // TODO: 在此添加命令处理程序代码
}

13、通过代码动态添加菜单






































0 0