学习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资源-光标界面的工具栏有此工具。

 

posted @ 2015-05-09 20:13  netosoul  阅读(475)  评论(0)    收藏  举报