MFC使用入门
1 调出控制台
在APP类中的InitInstance()增加以下代码:
AllocConsole();
SetConsoleTitle(_T("Debug Output"));
_tfreopen(_T("CONOUT$"), _T("w"), stdout);
2 文本框显示默认的字符
只要在OnInitDialog函数添加
GetDlgItem(IDC_EDIT6)->SetWindowText("20");
就可以了,就在对话框出现(OnInitDialog)之前显示文本框的默认字符(20)
3 添加了slider后删除,点对话框上的确定按扭,直接崩溃,原因是删除了控件但映射没有删除,解决办法,搜索ID,将doexchage里的映射删除就行。
4 在解决问题3时,删除了
DoDataExchange函数中的
//{{AFX_DATA_MAP(CMfc_ctl2Dlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
导致类向导一开就错,VC中的注释是不可以乱删除的!
5 slider的使用
这个slider很有问题 1.为其关联一个控件变量,在对话框初始化的时候为其设置范围,报错
2.为其关联一个控件变量,在onscroll中使用它获取位置时,报错(已经查明和之前乱删除东西有关,和slider无关)
添加slider,在对话框中用重载虚函数OnHScroll响应它,写入下面代码:
CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
slider_pos=pSlidCtrl->GetPos();
总算这种方式不会报错了~~~
6 combox的使用
添加combox,绑定控件变量,在initial dialog时添加
m_combo.AddString("com1");
m_combo.AddString("com2");
m_combo.AddString("com3");
m_combo.AddString("com4");
在类向导里添加响应函数OnSelchangeCombo1()添加:
if (1==Comm_Open_Flag) {
MessageBox("串口已打开");
return;
}
int sel=m_combo.GetCurSel();
switch(sel) {
case 0:
strcpy(com_name,"com1");
break;
...........................
7 tab控件的使用
参考日志
http://lycynthia.blog.sohu.com/55576164.html
1 设控件的关联控件变量为m_tabctl
2 创建对话框资源,方法为在资源目录里右击选择插入dialog
3 从对话框资源生成一个新的对话框类,选择类向导,创建新类,从dialog类中继承
4 在原来的对话框类中增加新类的实例
5 在原来的对话框类的oninitialdialog函数中增加以下代码:
TCITEM item;
item.mask = TCIF_TEXT;
item.pszText = "第一页";
m_tabctrl.InsertItem (0,&item);
item.pszText ="第二页";
m_tabctrl.InsertItem (1,&item);
m_mm1.Create (IDD_DIALOG1,&m_tabctrl);
m_mm2.Create (IDD_DIALOG2,&m_tabctrl);
m_mm1.SetWindowPos (NULL,10,30,400,100,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,400,100,SWP_HIDEWINDOW);
6 在原来对话框中增TAB控件的响应函数,当标签页改变时,执行以下代码:
CRect r;
m_tabctrl.GetClientRect (&r);
switch(m_tabctrl.GetCurSel())
{
case 0:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW );
break;
case 1:
m_mm1.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_HIDEWINDOW);
m_mm2.SetWindowPos (NULL,10,30,r.right -20,r.bottom -40,SWP_SHOWWINDOW );
break;
}
主要是改变窗口大小的,暂时我就不管这些了。
7 在对话框中添加菜单,和6添加TAB控件的一个关键所在是,这里的MENU不用新创建类,而是关联到DIALOG类上。具体细节我也没搞懂总之步骤如下:
参考了http://blog.163.com/ly8784@126/blog/static/63745477201021654023625/
insert一个menu资源,类向导,和已存在的dialog类关联,
先增成员变量HMENU m_hMenu1;
然后在初始化函数OnInitDialog()添加一下代码:
m_hMenu1=LoadMenu(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU1));//导入资源,创建菜单
::SetMenu(this->GetSafeHwnd(),m_hMenu1);//添加到对话框
最后记得在OnDestroy中DestroyMenu(m_hMenu1);
8 创建模态对话框
1) 插入对话框资源,以这个资源创建类,从对话框类继承
2) 调出代码如下:
mydig dlg;
int result=dlg.DoModal(); //调用对话框类的成员函数
if(result==IDOK)
AfxMessageBox("单击确定按钮");
else
AfxMessageBox("单击取消按钮");
3) 记住,要识别创建的类mydig必须include头文件
9 MDI中修改默认打开视图的数量
见贴《MFC多文档应用程序同时显示两个视图》
10 MDI中如何在几个文档都创建完后,对所有文档实施平铺?
在BOOL CDMFCApp::InitInstance()里添加:
CMDIFrameWnd *pFrame1=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
pFrame1->MDITile(MDITILE_HORIZONTAL);
然后发现初始化时的子窗口是平铺了,但新添加的子窗口却没有和之前的窗口一起被平铺,所以,作出以下修改,首先,将上面在app中的代码注释了,然后重载OnNewFIle函数(重载后不会新建文档,需要自手动加代码来新建文档),添加以下代码:
//获取文档模板列表
POSITION pos=theApp.GetFirstDocTemplatePosition();
//取得一个文档模板,我取的是第一个,你可以去任何一个模板
CDocTemplate* pDocTempl=theApp.GetNextDocTemplate(pos);
//利用文档模板创建新文档
pDocTempl->OpenDocumentFile(NULL);
//平铺所有文档
CMDIFrameWnd *pFrame1=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
pFrame1->MDITile(MDITILE_HORIZONTAL);