1、获取当前程序执行目录
CString getModulePath(void)
{
char curPath[100];
GetModuleFileName(NULL,curPath,100);
char drive[100];
char dir[100];
char fname[100];
char ext[100];
_splitpath(curPath,drive,dir,fname,ext);
CString strDir;
strDir += drive;
strDir += dir;
return strDir;
}
2、使用picture control加载图像
使用cximage的load()函数加载图像:
CxImage image;
image.Load(filename, CXIMAGE_FORMAT_BMP);
HBITMAP m_bitmap = image.MakeBitmap(m_picture_input.GetDC()->m_hDC);
if (m_bitmap == NULL )
AfxMessageBox(filename);
m_picture_input.SetBitmap(m_bitmap);
在开始的时候,上面的代码一直不能成功,原因在需要把m_picture_input对应的picture control的type属性设为bitmap。
3、CEdit控件的数据控制DDX_TEXT
即使定义了函数
void CRegisterView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Text(pDX, IDC_TESTID, register_input);
}
在CEdit控件中输入数字后,调用register_input的值时,仍为空。解决办法:在读取register_input值时先调用UpdateData(true);而在写入register_input值时,后调用UpdateData(false);
4、单文档多视图解决方案
4、1在class CFaceIndentificationApp生成各个视图类
class CFaceIndentificationApp : public CWinApp
{
private:
void create_different_views(void); //初始化生成各个视图
public:
CRegisterView * m_pRegisterView;
CCheckInitView *m_pCheckInitView;
CMainView* m_pMainView;
CView* SwitchView(int view_id); // 选择函数
};
4、2在BOOL CFaceIndentificationApp::InitInstance()函数中加入代码段
if (!ProcessShellCommand(cmdInfo))
return FALSE;
create_different_views(); //生成各个视图
SwitchView(3); //初始化主页面
// 唯一的一个窗口已初始化,因此显示它并对其进行更新
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
4、3生成各个视图代码
void CFaceIndentificationApp::create_different_views(void)
{
CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
CCreateContext newContext;
newContext.m_pCurrentDoc =pCurrentDoc;
m_pRegisterView = new CRegisterView;
((CView*)m_pRegisterView)->Create(NULL,"RegisterView",WS_CHILD,CFrameWnd::rectDefault,m_pMainWnd,1,&newContext);
m_pCheckInitView = new CCheckInitView;
((CView*)m_pCheckInitView)->Create(NULL,"CheckInitView",WS_CHILD,CFrameWnd::rectDefault,m_pMainWnd,2,&newContext);
m_pMainView = new CMainView;
((CView*)m_pMainView)->Create(NULL,"MainView",WS_CHILD,CFrameWnd::rectDefault,m_pMainWnd,3,&newContext);
//当文档模板创建视图的时候,会自动发送WM_INITIALUPDATE消息,
//因此对于我们自己创建的视图,需要人工发送这条消息
m_pRegisterView->OnInitialUpdate();
m_pCheckInitView->OnInitialUpdate();
}
4、4选择视图代码
CView* CFaceIndentificationApp::SwitchView(int view_id)
{
CView* pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView();
CView* pNewView;
switch (view_id) {
case 1:
pNewView = m_pRegisterView;
break;
case 2:
pNewView = m_pCheckInitView;
break;
case 3:
pNewView = m_pMainView;
break;
default:
break;
}
// 交换视图的窗口ID,使RecalcLayout()可以工作
UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
// 显示新的视图,隐藏前一个视图
pActiveView->ShowWindow(SW_HIDE);
pNewView->ShowWindow(SW_SHOW);
((CFrameWnd*)m_pMainWnd)->SetActiveView(pNewView);
((CFrameWnd*)m_pMainWnd)->RecalcLayout();
//重画
pNewView->Invalidate();
return pActiveView;
}