学习MFC一周总结:添加:调色板、保存图片、撤销功能,及加载自定义光标(截图软件,功能添加)(20150504)
使用开发工具:VS 2012;
学习日期:20150504
//--------------------------------------------------------------------
第一步:添加调色板;
首先,我们要明白MFC提供了一个类 CColorDialog,它支持在应用中使用颜色选择对话框。那么,我们的函数实现如下:
1 //调用调色板
2 void CNotifyIconView::OnToolPalette( void )
3 {
4 CColorDialog nPalette;
5 nPalette.DoModal();
6 m_nColor = nPalette.GetColor();
7 }
第二步:保存图片功能;
先认识MFC提供了两个类 CFileDialog和CImage;保存代码实现如下:
1 //保存图片
2 void CNotifyIconView::OnSave(void)
3 {
4 static TCHAR BASED_CODE szFilter[] = _T("JPEG(*.jpg)|*.jpg|PNG(*.png)|*.png|BMP(*.bmp)|*.bmp|All Files (*.*)|*.*|"); //可保存的类型
5
6 //这里需要注意,CFileDialog的构造函数第一个参数:如果为TRUE, 则创建文件打开对话框;如果为FALSE,则构造一个File Save As(另存为)对话框。
7 CFileDialog fileDlg( false , _T("jpg") , _T("未命名") , OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , szFilter);
8 if ( IDOK == fileDlg.DoModal() ) //调用文件对话框
9 {
10 CImage img; //装图片的变量
11 CMainFrame * pFrame = ( CMainFrame * )AfxGetMainWnd();
12 //保存图片 给变量附加一个对象,并保存这个对象(获得选择的路径)
13 img.Attach( (HBITMAP)pFrame->m_lstDeskTopBmp.back()->m_hObject );
14 img.Save( fileDlg.GetPathName() );
15 }
16 }
第三步:添加撤销功能;
在这里,我们知道,截屏软件截屏之后,每次画图操作,都会形成一张bmp图片存入一个专用链表中(这也是我们设计这个软件的思路)。
1 //后退绘图 1.删除图片 2.删除节点 3.刷新
2 void CNotifyIconView::OnBack()
3 {
4 // TODO: 在此添加命令处理程序代码
5 CMainFrame * pFrame = ( CMainFrame * )AfxGetMainWnd();
6 //如果链表剩下不止一个节点
7 if ( pFrame->m_lstDeskTopBmp.size() > 1 )
8 pFrame->m_lstDeskTopBmp.pop_back();
9 //删除一个之后,还是原来的图,除非等下次画图操作才能重绘,所以这里要主动发送重绘的消息
10 this->SendMessage( WM_PAINT );
11 }
第四步:加载自定义光标:实现每次选择不同的工具,变为不同的光标;
这里,我们要先认识一个win32API的函数SetClassLong(为窗口类设置一个Long变量条目),此函数可以直接修改WNDCLASSEX structure中的部分内容(有nIndex参数决定);
此外还有函数SetWindowLong(在窗口结构中为指定的窗口设置信息),同样可以实现。
DWORD WINAPI SetClassLong(
_In_ HWND hWnd,
_In_ int nIndex,
_In_ LONG dwNewLong
);

可在触发处直接调用:
1 ::SetClassLong( this->m_hWnd , GCL_HCURSOR , (LONG)m_nCursorPen ); //这里选择修改光标GCL_HCURSOR
SetWindowLong 和SetClassLong区别
另外,可以对自己画的光标设置任意的作用点,在VS资源-光标界面的工具栏有此工具。

浙公网安备 33010602011771号