VC总结

数据转换:

CString –>  double :   double dNum = atof(str);

double –>  CString :   CString cStr = (TCHAR*)(_bstr_t)dNum;

#include<comutil.h>     comsuppwd.lib

CString –> std::string :   std::string = (char*)(_bstr_t(cStr));

std::string –> CString: CString cStr = (TCHAR*)(_bstr_t(str.c_str()));

CString –> char*: LPTSTR p  = cStr.GetBuffer();

string –> int :

#include <sstream> 
#include <string> 
std::string text = "152"; 
int number; 
std::stringstream ss; 
ss < < text;//可以是其他数据类型 
ss >> number; //string -> int 
ss < < number;// int->string 
string str = ss.str();

 

字符串转换:http://blog.csdn.net/jinhill/article/details/4025968

CString操作指南:http://blog.csdn.net/wilsonwong/article/details/1329420

---------------------------------------------------------------------------------------------------------------------------

数据格式化:

CString cFormatStr;

cFormatStr.Format(“%0.2f”,fOrg);  //格式化为2位小数

时间日期:CTime cTime;

                     cTime = CTime::GetCurrentTime();

                    CString cTimeStr = cTime.Format(“%Y-%m-%d”);

		TCHAR szMsg[MAX_PATH];
		//将格式化的字符串写入szMsg
		StringCchPrintf(szMsg,_countof(szMsg),TEXT("%d is a number!"),number);
		AfxMessageBox(szMsg);


---------------------------------------------------------------------------------------------------------------------------

控件使用技巧:

1、静态文本响应事件:修改文本ID,Notify属性选为true.

2、静态文本显示位图:

  • 建立一个文本控件,修改ID,并为其增加控制变量m_img
  • m_img.ModifyStyle(0,SS_BITMAP|SS_CENTERIMAGE);

HBITMAP hBmp = (HBITMAP)::LoadImage(0,imgPath,IMAGE_BITMAP,0,0,LP_LOADFROMFILE);

m_img.SetBitmap(hBmp);

3、Button禁用或者启用:CWnd类的EnableWindow(BOOL)方法。TRUE为启用。 

4、对话框控件显示与隐藏:   CWnd::ShowWindow(SW_HIDE)和CWnd::ShowWindow(SW_NORMAL)

5、VC从文件中加载图片:http://blog.csdn.net/jinhill/article/details/4251551

 

 

 

---------------------------------------------------------------------------------------------------------------------------

对话框技巧:

1、设置对话框背景色:

方法1:设置单个对话框的背景色:

  • 在对话框类添加全局变量:CBrush m_brush;
  • 在OnInitDialog()中添加代码:
BOOL CShowImgDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    m_brush.CreateSolidBrush(RGB(255,255,255));//设置白色背景
    return TRUE;  
}


  • 重写WM_CTLCOLOR响应函数:
HBRUSH CShowImgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    return m_brush;
}
2、打开目录对话框:
       
  CString sFolderPath;
    BROWSEINFO bi;
    TCHAR Buffer[MAX_PATH];
    //初始化入口参数bi开始
    bi.hwndOwner = NULL;
    bi.pidlRoot = NULL;
    bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
    bi.lpszTitle = TEXT("选择路径");
    bi.ulFlags = BIF_RETURNONLYFSDIRS;
    bi.lpfn = NULL;
    bi.iImage = 0;
   //初始化入口参数bi结束
   LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
   if(pIDList)
   {
       SHGetPathFromIDList(pIDList, Buffer);
       //取得文件夹路径到Buffer里
       sFolderPath = Buffer;//将路径保存在一个CString对象里
   }

---------------------------------------------------------------------------------------------------------------------------
客户区坐标与屏幕坐标之间的转换问题:

1、ClientToScreen 函数:这个函数的功能:该函数将指定点的用户坐标转换成屏幕坐标。

函数原型:BOOL ClientToScreen(HWND hWnd,LPPOINT lpPoint);

      CWnd::ClientToScreen(LPPOINT lpPoint)  (ClientToScreen(LPRECT lpRect))

        实现的是同样的效果,只不过是窗口句柄缺省为调用此函数的窗口。

2、ScreenToClient 函数:函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。

函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);

3、CWnd::GetClientRect(CRect rect)  函数:此函数得到的区域是相对于调用此函数的窗口指针所指向的窗口的客户区域,坐标点是相对于此窗口而言的。

4、CWnd::GetWindowRect(rect) 函数:此函数得到的区域坐标是相对于屏幕左上角而言

---------------------------------------------------------------------------------------------------------------------------
文件操作

遍历文件夹下所有的文件:

CFileFind ff;
    BOOL bRes =  ff.FindFile(m_currentPathStr+TEXT("\\images\\*.bmp"));
    while (bRes)
    {
        bRes = ff.FindNextFile();
        if(!ff.IsDirectory() && !ff.IsDots())//如果是文件
        {
            //.....
        }
    }
void  SearchFile(CString strDir){
	CFileFind ff;
	CString szDir = strDir;//文件目录
	if(szDir.Right(1)!=TEXT("\\")){
		szDir += TEXT("\\");
	}
	szDir += TEXT("*.*");
	BOOL bRes = ff.FindFile(szDir);
	while(bRes){
		bRes = ff.FindNextFile();
		if(!ff.IsDirectory() && !ff.IsDots()){//是文件

		}else if(ff.IsDirectory() && !ff.IsDots()){//目录
			SearchFile(ff.GetFilePath());//递归调用
		}
	}
	ff.Close();
}

创建文件,读写文件1
CStdioFile stdFile(TEXT("file.conf"),CStdioFile::modeCreate|CStdioFile::modeWrite) ;
	if(!stdFile){
		AfxMessageBox(TEXT("创建配置文件失败!"));
		return;
	}
	for(vector<CString>::iterator iter =configFileVec.begin();iter!=configFileVec.end();iter++ ){
		stdFile.WriteString(*iter);
	}
	stdFile.Close();


---------------------------------------------------------------------------------------------------------------------------


1、手动添加响应WM_HOTKEY消息

.h文件中:afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);

.cpp文件中:

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
    ON_WM_CREATE()
    //.....
     ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()

响应函数:

LONG CMainWnd::OnHotKey(WPARAM wParam,LPARAM lParam)            
{   

    UINT fuModifiers = (UINT) LOWORD(lParam); // key-modifier flags    
    UINT uVirtKey = (UINT) HIWORD(lParam);     // virtual-key code    

    //判断响应了什么热键   
    if( MOD_CONTROL|MOD_ALT == fuModifiers && 'T' == uVirtKey )   
    {   
        AfxMessageBox(_T("你按下了组合键 ctrl + alt+T"));     
    } 

    return 0;           
} 

2.在init()或者OnCreate()中注册:

   //Register热键   
#ifdef _DEBUG //debug版本   
    int nRet = RegisterHotKey(GetSafeHwnd(),ID_HOTKEY_CTRL_ALT_T,MOD_CONTROL|MOD_ALT,'T'); //热键 ctrl +alt+T
    if(!nRet)   
        AfxMessageBox(_T("RegisterHotKey Ctrl+Alt+T false"));   
    
#else //release版本   
    RegisterHotKey(GetSafeHwnd(),ID_HOTKEY_CTRL_ALT_T,MOD_CONTROL|MOD_ALT,'T'); //热键 ctrl +alt+T 

#endif  

3、用完后在合适的时机注销快捷键:

#ifdef _DEBUG      
    int nRet = UnregisterHotKey(GetSafeHwnd(), ID_HOTKEY_CTRL_ALT_T);    
    if(!nRet)   
        AfxMessageBox(_T("UnregisterHotKey Ctrl+Alt+T false"));   
    
#else   
    UnregisterHotKey(GetSafeHwnd(), ID_HOTKEY_CTRL_ALT_T);    
    
#endif 

---------------------------------------------------------------------------------------------------------------------------

文本编程:

1、创建文本插入符:void CreateSolidCaret(int nWidth, int nHeight);

设置插入符的位置: static void PASCAL CWnd::SetCaretPos(POINT point);

2、获得当前设备描述表的字体的度量信息:

BOOL CDC::GetTextMetrics(
   LPTEXTMETRIC lpMetrics 
) const;
获得某个特定字符串在窗口中显式时所占据的宽度和高度:
CSize CDC::GetTextExtent(
   const CString& str 
) const;
3、路径层:在路径层内绘制,不会覆盖该区域原有的内容
BOOL CDC::BeginPath();
BOOL CDC::EndPath();
4、设置字体
CFont font;
font.CreatePointFont(300,"华文行楷",NULL);
CFont *pOldFont = dc.SelectObject(&font);
---------------------------------------------------------------------------------------------------------------------------

窗体控制:

1、获得窗体的大小和位置:void CWnd::GetWindowRect(LPRECT lpRect);

2、设置窗体位置和大小:

BOOL SetWindowPos(
   const CWnd* pWndInsertAfter,
   int x,   //左上角x坐标
   int y,   //左上角y坐标
   int cx,  //窗体宽度
   int cy,  //窗体高度
   UINT nFlags //控制窗体:如SWP_DRAWFRAME:在窗体周围绘制一个边框
);
3、修改窗体的过程函数,使用:LONG ::SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong);
WNDPROC prevProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT2)->m_hWnd,GWL_WNDPROC,(LONG)NewWndProc);

4、获得窗口句柄的方法:

  • HWND ::GetNextWindow(HWND hWnd,UINT wCmd);
  • HWND ::GetWindow(HWND hWnd,UINT uCmd);
  • HWND ::GetNextDlgTabItem(HWND hDlg,HWND hCtrl,BOOL bPrevious);

5、按回车使得焦点在对话框上控件之间依次传递:

void COrderInfoDlg::OnOK()
{
    GetNextDlgGroupItem(GetFocus())->SetFocus();
    //CDialog::OnOK();
}
并在[格式]—>[tab键顺序]中调整Tab顺序。

------------------------------------------------------------------------------------------------------------------

菜单

1、菜单命令路由:视图类-->文档类-->框架类-->应用程序类

2、菜单的有关函数:

获得菜单:        CMenu* CWnd::GetMenu()const;

获得菜单的子菜单: CMenu* CMenu::GetSubMenu(int nPos);

标记菜单:        UINT CMenu::CheckMenuItem(UINT nIDCheckItem,UNIT nCheck);

图形标记菜单:    BOOL CMenu::SetMenuItemBitmaps(UNIT nPosition,UNTI nFlags,…);

禁用菜单:        UNIT CMenu::EnableMenuItem(UNIT nIDEnableItem,UNIT nEnable);  (…,MF_BYPOSITION|MF_DISABLE|MF_GRAYD)且m_bAutoMenuEnable = FALSE

移除,设置菜单:  BOOL CWnd::SetMenu(CMenu* pMenu);    SetMenu(NULL)(移除菜单);

---------------------------------------------------------------------------------------------------------------

绘图:

1、OnPaint与OnDraw:

OnPaint是CWnd的成员函数. OnDraw是CView的成员函数,OnPaint是WM_PAINT消息引发的重绘消息处理函数,在OnPaint中会调用OnDraw来进行绘图。

 



----------------------------------------------------------------------------------------------------------

截图:

/************************************************************************/
/*将图像截取为HBITMAP 
*/
/************************************************************************/
static HBITMAP CopyScreenToBitmap(LPRECT lpRect)
{
	//创建屏幕设备描述表
	HDC       hScrDC;
	//创建内存设备描述表
	HDC       hMemDC; 
	//位图句柄
	HBITMAP    hBitmap, hOldBitmap; 

	int       nX, nY, nX2, nY2;      
	// 选定区域坐标
	int       nWidth, nHeight;

	// 确保选定区域不为空矩形
	if (IsRectEmpty(lpRect))
		return NULL;
	//为屏幕创建设备描述表
	hScrDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);

	//为屏幕设备描述表创建兼容的内存设备描述表
	hMemDC = CreateCompatibleDC(hScrDC);
	// 获得选定区域坐标
	nX = lpRect->left;
	nY = lpRect->top;
	nX2 = lpRect->right;
	nY2 = lpRect->bottom;

	//确保选定区域是可见的
	if (nX < 0)
		nX = 0;
	if (nY < 0)
		nY = 0;
	/*
	if (nX2 > m_xScreen)
	nX2 = m_xScreen;
	if (nY2 > m_yScreen)
	nY2 = m_yScreen;*/

	//获得位图的宽度和长度
	nWidth = nX2 - nX;
	nHeight = nY2 - nY;
	// 创建一个与屏幕设备描述表兼容的位图
	hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
	// 把新位图选到内存设备描述表中
	hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
	// 把屏幕设备描述表拷贝到内存设备描述表中
	BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
	hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
	//得到屏幕位图的句柄
	//清除 
	DeleteDC(hScrDC);
	DeleteDC(hMemDC);
	// 返回位图句柄			
	if (OpenClipboard(theApp.m_pMainWnd->m_hWnd)) {
		EmptyClipboard();//清空剪贴板
		//把屏幕内容粘贴到剪贴板上,
		SetClipboardData(CF_BITMAP, hBitmap);
		//关闭剪贴板
		CloseClipboard();
	}
	return  hBitmap;
}

static BOOL SaveBmp(HBITMAP hBitmap,LPTSTR lpFileName) 
{   
	HDC     hDC;         
	//设备描述表
	int     iBits;      
	//当前显示分辨率下每个像素所占bit位数
	WORD    wBitCount;   
	//位图中每个像素所占bit位数
	//定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数
	DWORD           dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
	BITMAP          Bitmap;        
	//位图属性结构
	BITMAPFILEHEADER   bmfHdr;        
	//位图文件头结构
	BITMAPINFOHEADER   bi;            
	//位图信息头结构 
	LPBITMAPINFOHEADER lpbi;          
	//指向位图信息头结构
	HANDLE          fh, hDib, hPal;
	HPALETTE     hOldPal=NULL;
	//定义文件,分配内存句柄,调色板句柄

	//计算位图文件每个像素所占bit位数
	hDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
	iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
	DeleteDC(hDC);
	if (iBits <= 1)
		wBitCount = 1;
	else if (iBits <= 4)
		wBitCount = 4;
	else if (iBits <= 8)
		wBitCount = 8;
	else if (iBits <= 24)
		wBitCount = 24;
	else
		wBitCount = 32;
	//计算调色板大小
	if (wBitCount <= 8)
		dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD);

	//设置位图信息头结构
	GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
	bi.biSize            = sizeof(BITMAPINFOHEADER);
	bi.biWidth           = Bitmap.bmWidth;
	bi.biHeight          = Bitmap.bmHeight;
	bi.biPlanes          = 1;
	bi.biBitCount         = wBitCount;
	bi.biCompression      = BI_RGB;
	bi.biSizeImage        = 0;
	bi.biXPelsPerMeter     = 0;
	bi.biYPelsPerMeter     = 0;
	bi.biClrUsed         = 0;
	bi.biClrImportant      = 0;

	dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;
	//为位图内容分配内存
	hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
	lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
	*lpbi = bi;
	// 处理调色板   
	hPal = GetStockObject(DEFAULT_PALETTE);
	if (hPal)
	{
		hDC = ::GetDC(NULL);
		hOldPal=SelectPalette(hDC,(HPALETTE)hPal,FALSE);
		RealizePalette(hDC);
	}
	// 获取该调色板下新的像素值
	if(0==GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,
		(BITMAPINFO *)&bi,DIB_RGB_COLORS))
	{
		//Quit();
		PostQuitMessage(0);
		return FALSE;
	}
	//恢复调色板   
	if (hOldPal)
	{
		SelectPalette(hDC, hOldPal, TRUE);
		RealizePalette(hDC);
		::ReleaseDC(NULL, hDC);
	}
	//创建位图文件    
	fh=CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
	if (fh==INVALID_HANDLE_VALUE)
		return FALSE;
	// 设置位图文件头
	bmfHdr.bfType = 0x4D42; // "BM"
	dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize; 
	bmfHdr.bfSize = dwDIBSize;
	bmfHdr.bfReserved1 = 0;
	bmfHdr.bfReserved2 = 0;
	bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;
	// 写入位图文件头
	WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
	// 写入位图文件其余内容
	WriteFile(fh, (LPSTR)lpbi, sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize , &dwWritten, NULL); 
	//清除   
	GlobalUnlock(hDib);
	GlobalFree(hDib);
	CloseHandle(fh);
	return TRUE;
}

使用:

        RECT rect;
	rect.left = theApp.m_wndPos.x;//看自己的需要了
	rect.top = theApp.m_wndPos.y;
	rect.right = rect.left+ theApp.m_wndSize.cx;
	rect.bottom = rect.top + theApp.m_wndSize.cy;
	HBITMAP hBitmap = CopyScreenToBitmap(&rect);

	SaveBmp(hBitmap,strPath.GetBuffer());//strPath:保存的路径

----------------------------------------------------------------------------------------------------------------

消息

Windows消息分类:

  • 标准消息:出WM_COMMAND以外的所有以WM_开头的消息
  • 命令消息:WM_COMMAND:在MFC中以ID区分,在SDK中以wParam参数识别。派生自CCmdTarget的类都可接受这样的消息。
  • 通告消息:控件产生的消息,为了向父窗体通知事件发生。WM_COMMAND

派生自CCmdTarget的类只能接收命令消息和通告消息。派生自CWnd的类可接受所有消息。

 

MFC下自定义消息:ON_MESSAGE

1、定义消息ID:#define WM_ADDINPUTINFO  10000

2、定义响应函数:

virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
3、响应函数:

LRESULT  COutputWnd::OnAddInputInfo(WPARAM  wParam,LPARAM lParam){
	 AfxMessageBox(TEXT("ssss"));
	return 0;
 }
4、加到MESSAGE_MAP:

BEGIN_MESSAGE_MAP(COutputWnd, CDockablePane)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_MESSAGE(WM_ADDINPUTINFO, &COutputWnd::OnAddInputInfo)
END_MESSAGE_MAP()



深度解析VC中的消息:http://blog.csdn.net/jinhill/article/details/5084990
--------------------------------------------------------------------------------------------------------------------

如何在控制台下使用VC的部分类或方法:

1、#include<afx.h>

2、工程属性 ->配置属性->常规->MFC的使用:在静态库中使用MFC


你可能感兴趣的:(VC总结)