MFC笔记
来源:互联网 发布:淘宝买家信誉如何提升 编辑:程序博客网 时间:2024/06/07 19:31
一、(1)API:(Application Programming Interface): 应用程序中调用这个函数,操作系统就会执行相应的功能,这个过程就叫做系统调用。
(2):对事件作出反应的过程,这个通过消息(是一个结构体)来实现
typedef struct {
HWND hwnd;
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
__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
- MFC笔记
- mfc笔记
- MFC 笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- MFC笔记
- mfc笔记
- mfc笔记
- MFC 笔记
- VIM插件攻略
- 控制启动进程占用的资源——ulimit命令
- metasploit 初学(一)
- android 如何正确循环删除list中的数据
- Guess Number Higher or Lower
- MFC笔记
- 封装
- 认真之下,进步就会很快
- java string 首字母大写方法
- IntelliJ IDEA的使用教程
- springmvc 上传文件两种方式比较以及上传问题解决
- MDI父窗体中的子窗体最大化后消除子窗体在父窗体菜单栏中的图标
- 日志收集(for 分析错误/做统计):
- 107. Binary Tree Level Order Traversal II