MFC编程学习

1.对话框的key消息先要被PreTranslateMessage函数处理,然后转到onKeyDown处理 ,所有屏蔽一些按键可以到PreTranslateMessage函数里进行(注意过滤WM_KEYDOWN 和 WM_SYSKEYDOWN(一些系统按键))


2.组合键的判断

BOOL bCtrlKeyDown =
GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);


BOOL bAltKeyDown =
GetAsyncKeyState(VK_MENU)>>((sizeof(SHORT) * 8) - 1);


if ((nChar==VK_F8 && bCtrlKeyDown && bAltKeyDown))
{
MessageBox("ctrl+alt+F8");
}


3.查找和杀进程

======================获取进程名称============================

TCHAR szProcessName[MAX_PATH] = TEXT("");
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ ,
                                   FALSE, process_id );

    // Get the process name.
    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;


        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
           GetModuleBaseName( hProcess, hMod, szProcessName, 
                              sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }
 
    CloseHandle( hProcess );

=======================获取进程列表=====================================

DWORD process_list[1024],cbNeeded,process_count;
if(!EnumProcesses(process_list,sizeof(process_list),&cbNeeded))
{
return;
}

===========================杀进程==================================

HANDLE process_handle = OpenProcess(PROCESS_VM_WRITE|PROCESS_TERMINATE, false, process_list[i]);//注意权限PROCESS_ALL 无法使用
if(process_handle == NULL) continue;
TerminateProcess(process_handle,0);
CloseHandle(process_handle);


4.VC和BCB的DLL导入导出(最好加extern "C")

#define DLLEXPORT extern "C" __declspec(dllexport)

#define DLLIMPORT extern "C" __declspec(dllimport)  _stdcall   //BCB导入dll中函数要加_stdcall关键字


5.CRT库和MFC库冲突解决

当在MFC中使用C++标准库时会报

nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) already

解决方法:

选择:菜单“项目”-->“设置”->链接-->Input。
在第一行“对象/库模块”中最前面输入Nafxcwd.lib;Libcmtd.lib
在第二行“忽略库”框中,输入Nafxcwd.lib;Libcmtd.lib。
确定,重新链接,通过!


6.多字节单字节转换

void ToolHelper::UTF8ToUnicode(const char* utf8,wchar_t** unicode)
{
    int  len = 0;
    len = strlen(utf8);
int  unicodeLen = ::MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0);
*unicode = (wchar_t*)malloc(unicodeLen*sizeof(wchar_t));
    memset((*unicode),0,unicodeLen*sizeof(wchar_t));
::MultiByteToWideChar(CP_UTF8,0,utf8,-1,(LPWSTR)(*unicode),unicodeLen+1);
}


//将utf8转换为多字节
void ToolHelper::UTF8ToANSI(const char* utf8,char** ansiChar)
{
int  len = 0;
    len = strlen(utf8);
    int  unicodeLen = ::MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0);
    wchar_t* tempchar=NULL;
tempchar = (wchar_t*)malloc(unicodeLen*sizeof(wchar_t));
    memset(tempchar,0,unicodeLen*sizeof(wchar_t));
    ::MultiByteToWideChar(CP_UTF8,0,utf8,-1,(LPWSTR)tempchar,unicodeLen+1);
    DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,tempchar,-1,NULL,0,NULL,FALSE);
    *ansiChar =(char*)malloc(dwNum);
    ::WideCharToMultiByte(CP_OEMCP,NULL,tempchar,-1,(*ansiChar),dwNum,NULL,FALSE);
if(tempchar!=NULL)
    {
        free(tempchar);
        tempchar=NULL;
}
}
//将多字节转换为utf8
void ToolHelper::ANSIToUTF8(const char* ansiChar,char**utf8Code)
{
    wchar_t *chBuf;
    char * p=NULL;
    int iLen;
    iLen = ::MultiByteToWideChar(CP_ACP, 0, ansiChar,-1 , NULL, 0);
chBuf = (wchar_t*)malloc(iLen*sizeof(wchar_t));
    memset(chBuf,0,iLen*sizeof(wchar_t));
    iLen =::MultiByteToWideChar(CP_ACP, 0, ansiChar, -1, chBuf, iLen+1);
    iLen = ::WideCharToMultiByte(CP_UTF8, 0, chBuf,-1 , NULL, 0,NULL,NULL);
    p = (char*)malloc(iLen);
    memset(p,0,iLen * sizeof(char));
    iLen =::WideCharToMultiByte(CP_UTF8, 0, chBuf, -1,  p, iLen+1,NULL,NULL);
*utf8Code=p;


if(chBuf!=NULL)
    {
free(chBuf);
        chBuf=NULL;
    }
}


//将宽字节转换为utf8
void ToolHelper::UnicodeToUTF8(const wchar_t* unicode,char** utf8Code)
{
    char* szText=NULL;
    DWORD dwNum = ::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,NULL,0,NULL,FALSE);
    szText=(char*)malloc(dwNum+1);
    ::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,szText,dwNum,NULL,FALSE);
    wchar_t *chBuf;
    char * p=NULL;
    int iLen;
    iLen = ::MultiByteToWideChar(CP_ACP, 0, szText,-1 , NULL, 0);
chBuf = (wchar_t*)malloc((iLen+1)*sizeof(wchar_t));
memset(chBuf,0,(iLen)*sizeof(wchar_t));
    iLen =::MultiByteToWideChar(CP_ACP, 0, szText, -1, chBuf, iLen+1);
    iLen = ::WideCharToMultiByte(CP_UTF8, 0, chBuf,-1 , NULL, 0,NULL,NULL);
    p = (char*)malloc(iLen);
    memset(p,0,iLen * sizeof(char));
    iLen =::WideCharToMultiByte(CP_UTF8, 0, chBuf, -1,  p, iLen+1,NULL,NULL);
    *utf8Code=p;
    if(szText!=NULL)
    {
        free(szText);
        szText=NULL;
}
if(chBuf!=NULL)
    {
free(chBuf);
        chBuf=NULL;
    }
}


//将多字节转换为宽字节
void ToolHelper::CharToWChar(const char *ansiChar, wchar_t **unicode)
{
    int ansiLen=strlen(ansiChar)+1 ;
    int   nwLen   =   ::MultiByteToWideChar(CP_ACP,   0,   ansiChar, ansiLen ,   NULL,   0);
    *unicode=(wchar_t*)malloc(nwLen*sizeof(wchar_t));
memset(*unicode,0,nwLen*sizeof(wchar_t));
::MultiByteToWideChar(CP_ACP,   0,   ansiChar,   -1,   *unicode,   nwLen);
}


//将宽字节转换为多字节
void ToolHelper::WCharToChar(const wchar_t *unicode,char **ansiChar)
{
DWORD dwNum = ::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,NULL,0,NULL,FALSE);
*ansiChar=(char*)malloc(dwNum);
memset(*ansiChar,0,dwNum);
::WideCharToMultiByte(CP_OEMCP,NULL,unicode,-1,*ansiChar,dwNum,NULL,FALSE);
}


7.判断文件是否存在

int file_exists(const char *filepath) 

  return (_access(filepath, 0) == 0); 


8.VC2010命令行编译

MSBuild EasyKeyTool.sln /t:Rebuild /p:Configuration=Release


9.修改应用程序图标

 HICON hIcon = ::LoadIconW(hInstance, MAKEINTRESOURCE(IDI_CEFCLIENT) );
 ::SendMessage( hWnd, WM_SETICON, TRUE,  (LPARAM)hIcon );
 ::SendMessage( hWnd, WM_SETICON, FALSE, (LPARAM)hIcon );

10.C/C++混合编译时,注意把C的代码使用extern "C"括号起来

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus


#ifdef    __cplusplus
}
#endif // __cplusplus


11.导出Dll函数

a.新建一个Win32的Dll工程

b.使用代码导出函数

#if 0
#define DLL_EXPORT extern "C" __declspec(dllexport)
#else
#define DLL_EXPORT
#endif

DLL_EXPORT
int _cdecl add(int a,int b);

 使用def文件导出函数

LIBRARY mydll
EXPORTS 
add @1

图片控件使用

CImage m_PicSrc;

m_PicSrc.Load( L"c:\\1.jpg");
CDC* pDC = GetDlgItem(IDC_STATIC_PIC)->GetWindowDC();
m_PicSrc.Draw( pDC -> m_hDC, 1, 1 );
ReleaseDC( pDC );


截获mfc控件的消息方法

1.重新继承一个控件,重写相应事件

2.主窗口windowproc

int wmId, wmEvent;
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);


图像绘制双缓存

RECT rect;
m_InvoicePic.GetClientRect(&rect);
 
CDC* pDC = GetDlgItem(IDC_STATIC_PIC)->GetWindowDC();
CDC memDC;
CBitmap memBitmap;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
memDC.SelectObject(&memBitmap);
memDC.FillSolidRect(&rect,pDC->GetBkColor());

int x=0,y=0;
GetShowPicPos(&x,&y);
m_PicSrc.Draw( memDC, 0, y );
 
pDC->BitBlt(0,0,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);
memDC.DeleteDC();
memBitmap.DeleteObject();
ReleaseDC( pDC );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值