现在的位置: 首页 > 综合 > 正文

一些VC编程中的技巧[持续更新]

2012年11月29日 ⁄ 综合 ⁄ 共 4047字 ⁄ 字号 评论关闭

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;
}

抱歉!评论已关闭.