一些VC编程中的技巧[持续更新]
1.int转字符串
int n = 10;
char str[255];
sprintf(str,"%d",nLstItem);
2.返回WCHAR/CHAR类型字符串
调用ATL的一个宏来实现:
sprintf(str,"%d",50);
USES_CONVERSION; //这句很重要,这个宏里面定义了一些变量用于转换的变量
LPCTSTR pT = A2T(str); //anscii转tchar调用A2T这个宏,反之则是调用T2A
3.让CListCtrl选择一行
m_LstCtrl.SetExtendedStyle(m_LstCtrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT );
4.在CListCtrl中插入行
m_LstCtrl.InsertItem(0,_T("1"));
m_LstCtrl.SetItemText(0,1,_T("2"));
m_LstCtrl.SetItemText(0,2,_T("3"));
5.设置表头
int n = 0;
m_LstCtrl.InsertColumn(n,_T("编号"),LVCFMT_CENTER);
m_LstCtrl.SetColumnWidth(n++ ,40);
m_LstCtrl.InsertColumn(n,_T("程序路径"),LVCFMT_CENTER);
m_LstCtrl.SetColumnWidth(n++ ,250);
m_LstCtrl.InsertColumn(n,_T("快捷键"),LVCFMT_CENTER);
m_LstCtrl.SetColumnWidth(n ,80);
写在OnInitDialog()函数中
6.获取FileDialog完整路径
CString str = FileDlg.GetPathName();
7.获取所有进程到CComboBox中
m_comboBox.ResetContent();
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("获取进程列表失败"));
}
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while(bMore)
{
CString str;
str.Format(_T("%s\r\n"),pe32.szExeFile);
bMore = ::Process32Next(hProcessSnap,&pe32);
m_comboBox.InsertString(0,str);
}
8.浏览文件
CFileDialog dlg(TRUE,
_T("DLL Files (*.DLL)"),
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,
_T("DLL Files (*.DLL|*dll||"),
NULL);
dlg.DoModal();
CString file = dlg.GetPathName();
9.自定义消息
(1) 手工定义消息,可以这么写
#define WM_MY_MESSAGE(WM_USER+100),
MS 推荐的至少是 WM_USER+100
(2)写消息处理函数,用WPARAM,LPARAM返回LRESULT.
LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)
{
temp目录: Use "GetTempPath"
//加入你的处理函数 irectory"
}
10.在MFC中中初始化SOCKET
调用AfxSocketInit即可
11.出现重复定义类的情况,要检查所包含头文件有没有加#pragma once,加上一般不会出现重复定义的问题
12.共用体……共用同一块内存。。才知道
13.对话框的DDV,首先用ClassWizard将某变量与要进行数据交换的控件进行绑定,然后对数据进行更新,之后调用UpdateData函数。
14.比较文件用fc命令,格式为:fc 文件1 文件2 /b
15.一些对DC的操作:
获取当前桌面的DC:
bool GetScreenDC(ScreenInfo* psi)
{
psi->pDC = new CDC;
psi->pDC->CreateDC(_T("Display"), NULL, NULL, NULL);
psi->nBitPixel = psi->pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
psi->nWidth = psi->pDC->GetDeviceCaps(HORZRES);
psi->nHeight = psi->pDC->GetDeviceCaps(VERTRES);
if(psi->pDC)
{
return true;
}
else
{
return false;
}
}
将DC转化成数组:
bool GetDCBytes(ScreenInfo* psi,COLORREF** p)
{
CDC memDC;//内存DC
memDC.CreateCompatibleDC(psi->pDC);
CBitmap memBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(psi->pDC, psi->nWidth, psi->nHeight);
memDC.SelectObject(memBitmap);
memDC.BitBlt(0, 0, psi->nWidth, psi->nHeight, psi->pDC, 0, 0, SRCCOPY);
*p = new COLORREF[psi->nWidth * psi->nHeight];//申请内存保存位图数据
memBitmap.GetBitmapBits(sizeof(COLORREF)*psi->nWidth*psi->nHeight, *p);
return true;
}
将DC写入到文件:
bool WriteDCToFile(ScreenInfo* psi,char* bmpFile)
{
CDC memDC;//内存DC
memDC.CreateCompatibleDC(psi->pDC);
CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(psi->pDC, psi->nWidth, psi->nHeight);
oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, psi->nWidth, psi->nHeight, psi->pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC
//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息
FILE *fp = fopen(bmpFile, "w+b");
BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;
fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据
GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, psi->nHeight, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据
delete [] p;
fclose(fp);
memDC.SelectObject(oldmemBitmap);
return true;
}