1. 让MFC支持拖放
m_pMainWnd->DragAcceptFiles(TRUE);
char zsFilePath[MAX_PATH];
所以可以直接启用默认流程,条件是CDocument::OpenDocumentFile()被重载成
期望的样子
static UINT indicators[] =
数组中加入自己的String ID, 这里决定了新增项的位置
3.1 Message Map中加入声明
例如 ON_UPDATE_COMMAND_UI(ID_INDICATOR_LAYER,OnUpdateLayerPane)
3.2 函数声明和实现
声明: afx_msg void OnUpdateLayerPane(CCmdUI *pCmdUI);
实现:
void CMainFrame::OnUpdateLayerPane(CCmdUI *pCmdUI)
例如
m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(ID_INDICATOR_LAYER),
例如 void CMainFrame::UpdateLayerPane(int nActiveLayer, int nTotalLayer)
a) 完成一个callback函数
int CALLBACK BrowserCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
{
switch(uMsg)
{
case BFFM_INITIALIZED:
default:
}
return 0;
}
b) 调用SHBrowseForFolder()之前初始化参数时设置
bif.lpfn = BrowserCallbackProc;
1).CXXApp::InitInstance()中增加语句
2).CMainFrame响应ON_WM_DROPFILES消息、
3).void CMainFrame::OnDropFiles(HDROP hDropInfo) 中增加实现
int nFileCount = DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);
if(nFileCount > 1)
{
MessageBox("Only the first file is loaded!");
}
DragQueryFile(hDropInfo,0,zsFilePath,MAX_PATH);
DragFinish(hDropInfo);
AfxGetApp()->OpenDocumentFile(zsFilePath);
函数说明参见MSDN
PS: 3中增加的实现是 CMainFrame::OnDropFiles(HDROP hDropInfo) 默认实现
2. 增加状态栏项目
1). "Resource/String Table"中增加新的String ID, 设置初值
2). MainFrm.cpp开头的
{
ID_SEPARATOR,
// status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
3). 在CMainFrame中加入消息响应函数
{
pCmdUI->Enable(TRUE);
}
4). 在CMainFrame::OnCreate()中创建新项目
ID_INDICATOR_LAYER,SBPS_NORMAL , 90);
5). 为新项目提供接口
{
CString zsText;
zsText.Format("Layer [%d/%d]",nActiveLayer + 1, nTotalLayer);
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_LAYER),zsText,TRUE);
}
3.SID 启动隐藏到系统盘 不闪烁
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
//
the CREATESTRUCT cs
cs.style = WS_POPUP;
cs.dwExStyle |= WS_EX_TOOLWINDOW;
return TRUE;
}
4. CRectTracker
一个简单的应用是在OnLButtonDown()中调用以下代码
m_pMoveTrack->TrackRubberBand(this, point) //开始绘制鼠标跟踪框
m_pMoveTrack->GetTrueRect(&m_rcTrack);//获得跟踪结果
注意返回的m_rcTrack是当前屏幕坐标,即窗口左上角是(0,0),需要考虑scrollbar和缩放的影响
不过这个类似乎更加适合用来做基类
5. SHBrowseForFolder()设置默认路径
::SendMessage(hWnd,BFFM_SETSELECTION,1,lpData);
break;
break;
bif.lParam = (LPARAM)(LPCSTR)m_zsOut; //默认路径