1.自己捕捉特定的组合键:
--------------------------------------------------------------
BOOL CMMDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
BOOL b = GetAsyncKeyState(VK_CONTROL) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(VK_MENU) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(65) >> ((sizeof(short) * 8)-1); //这里不分大小写
if(b)
{
AfxMessageBox("你按下了Ctrl+Alt+A组合键。") ;
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
-------------------------------------------------------------
另外,GetAsyncKeyState和::GetKeyState这两个函数也可以帮你检测Shift、Ctrl和Alt这些键的状态。
2.快速从得到的全路径文件名中分离出盘符、路径名、文件名和后缀名:
------------------------------------------------
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
GetModuleFileName(0,path_buffer,_MAX_PATH);
_splitpath( path_buffer, drive, dir,fname , ext); //用这个函数转换
------------------------------------------------
3.快速从数字的字符串中提取出特定长度的数字:
-------------------------------------------------------
int a[4];
sscanf("2004115819185","%07d%02d%02d%02d",&a[0],&a[1],&a[2],&a[3]); //按指定长度分隔
--------------------------------------------------------
或:
-------------------------------------------------------
CString s="aaa,bbb,ccc,ddd";
char a1[4],a2[4],a3[4],a4[4]; //这里要注意多留点空间以存放各子串的长度
sscanf(s,"%[^,],%[^,],%[^,],%[^,]",a1,a2,a3,a4); //按指定字符(这里是逗号)分隔
AfxMessageBox(a4);//显示ddd
-------------------------------------------------------
4.json [{},{}]数组 "{ }"字符串
5.其实%I64d就是打印很大的整数
6.151 改变CStatic控件的前景、背景色:http://community.csdn.net/Expert/topic/4507 /4507710.xml?temp=.1524164
处理WM_CTLCOLOR消息:
---------------------------------------------------------------------
HBRUSH CQQDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr;
// TODO: Change any attributes of the DC here
if(CTLCOLOR_STATIC == nCtlColor)
//if(CTLCOLOR_STATIC == nCtlColor && pWnd->GetDlgCtrlID()==IDC_TOOL) //改成这样就只对IDC_TOOL这一个静态文本控件起作用了
{
pDC->SetBkColor(RGB(255,255,255)); //背景色为白
pDC->SetTextColor(RGB(0,0,0)); //前景色为黑
hbr = CreateSolidBrush(RGB(255,255,255)); //其它区域也为白
//上面三行代码改成下面这三行就创建空心刷子,就可以实现在背景上写字的效果了
//pDC->SetBkMode(TRANSPARENT);
//pDC->SetTextColor(RGB(0,0,0));
//hbr = CreateStockObject(NULL_BRUSH);
}
else
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Return a different brush if the default is not desired
return hbr;
}
----------------------------------------------------------------------
再加一个判断if (pWnd->GetDlgCtrlID()==IDC_....)就可以指定是改变哪个的颜色了,其它控件的颜色的改变方法和这个大同小异。
7.SW_HIDE 不会根据层次将焦点还原给下层窗口,所以记得只有最小化和关闭消息才会将焦点还原给下层
8.SetWindowspos 最后一个参数别传空!!! 隐藏调用后会使其他窗体丢失焦点的!!
9.获取置顶窗口父窗口句柄
m_hActWnd = ::GetForegroundWindow();
// HWND hTemp = NULL;
// while(TRUE)
// {
// hTemp = m_hActWnd;
// hTemp = ::GetParent(hTemp);
//
// if (hTemp == NULL)
// {
// break;
// }
// }
10.如何不让子窗口跟父窗一起最小化?貌似只有让它们断绝“父子关系”。
Examlpe:
CXxxDlg Xxxdlg=new CXxxDlg();
Xxxdlg->Create(IDD_XXX_QUOTE);
Xxxdlg->ShowWindow(SW_SHOW);
解决方法:可以让创建子窗口时指定其父窗口为桌用即可
CXxxDlg Xxxdlg=new CXxxDlg();
Xxxdlg->Create(IDD_XXX_QUOTE, GetDesktopWindow());
Xxxdlg->ShowWindow(SW_SHOW);
11.如何设置焦点到所指定窗体 注:如果激活窗口卡死的话,会卡在PALOG("step 5");这个地方
PALOG("step 1");
HWND hForeWnd = ::GetForegroundWindow();
PALOG("step 2");
DWORD dwForeID = GetWindowThreadProcessId(hForeWnd, NULL);
PALOG("step 3");
DWORD dwCurID = GetCurrentThreadId();
PALOG("step 4");
AttachThreadInput(dwCurID, dwForeID, TRUE);
PALOG("step 5");
m_edtPayCode.SetFocus();
PALOG("step 6");
AttachThreadInput(dwCurID, dwForeID, FALSE);
PALOG("step 7");
12.还是焦点问题 窗体create.(id,父窗体); 后,创建窗体会默认被置顶
所以在创建窗体的初始化函数中要加上
ModifyStyle(0, WS_EX_NOACTIVATE, SWP_NOACTIVATE);
--------------------------------------------------------------
BOOL CMMDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
BOOL b = GetAsyncKeyState(VK_CONTROL) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(VK_MENU) >> ((sizeof(short) * 8)-1);
if(b)
{
b = GetAsyncKeyState(65) >> ((sizeof(short) * 8)-1); //这里不分大小写
if(b)
{
AfxMessageBox("你按下了Ctrl+Alt+A组合键。") ;
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
-------------------------------------------------------------
另外,GetAsyncKeyState和::GetKeyState这两个函数也可以帮你检测Shift、Ctrl和Alt这些键的状态。
2.快速从得到的全路径文件名中分离出盘符、路径名、文件名和后缀名:
------------------------------------------------
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
GetModuleFileName(0,path_buffer,_MAX_PATH);
_splitpath( path_buffer, drive, dir,fname , ext); //用这个函数转换
------------------------------------------------
3.快速从数字的字符串中提取出特定长度的数字:
-------------------------------------------------------
int a[4];
sscanf("2004115819185","%07d%02d%02d%02d",&a[0],&a[1],&a[2],&a[3]); //按指定长度分隔
--------------------------------------------------------
或:
-------------------------------------------------------
CString s="aaa,bbb,ccc,ddd";
char a1[4],a2[4],a3[4],a4[4]; //这里要注意多留点空间以存放各子串的长度
sscanf(s,"%[^,],%[^,],%[^,],%[^,]",a1,a2,a3,a4); //按指定字符(这里是逗号)分隔
AfxMessageBox(a4);//显示ddd
-------------------------------------------------------
4.json [{},{}]数组 "{ }"字符串
5.其实%I64d就是打印很大的整数
6.151 改变CStatic控件的前景、背景色:http://community.csdn.net/Expert/topic/4507 /4507710.xml?temp=.1524164
处理WM_CTLCOLOR消息:
---------------------------------------------------------------------
HBRUSH CQQDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr;
// TODO: Change any attributes of the DC here
if(CTLCOLOR_STATIC == nCtlColor)
//if(CTLCOLOR_STATIC == nCtlColor && pWnd->GetDlgCtrlID()==IDC_TOOL) //改成这样就只对IDC_TOOL这一个静态文本控件起作用了
{
pDC->SetBkColor(RGB(255,255,255)); //背景色为白
pDC->SetTextColor(RGB(0,0,0)); //前景色为黑
hbr = CreateSolidBrush(RGB(255,255,255)); //其它区域也为白
//上面三行代码改成下面这三行就创建空心刷子,就可以实现在背景上写字的效果了
//pDC->SetBkMode(TRANSPARENT);
//pDC->SetTextColor(RGB(0,0,0));
//hbr = CreateStockObject(NULL_BRUSH);
}
else
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Return a different brush if the default is not desired
return hbr;
}
----------------------------------------------------------------------
再加一个判断if (pWnd->GetDlgCtrlID()==IDC_....)就可以指定是改变哪个的颜色了,其它控件的颜色的改变方法和这个大同小异。
7.SW_HIDE 不会根据层次将焦点还原给下层窗口,所以记得只有最小化和关闭消息才会将焦点还原给下层
8.SetWindowspos 最后一个参数别传空!!! 隐藏调用后会使其他窗体丢失焦点的!!
9.获取置顶窗口父窗口句柄
m_hActWnd = ::GetForegroundWindow();
// HWND hTemp = NULL;
// while(TRUE)
// {
// hTemp = m_hActWnd;
// hTemp = ::GetParent(hTemp);
//
// if (hTemp == NULL)
// {
// break;
// }
// }
10.如何不让子窗口跟父窗一起最小化?貌似只有让它们断绝“父子关系”。
Examlpe:
CXxxDlg Xxxdlg=new CXxxDlg();
Xxxdlg->Create(IDD_XXX_QUOTE);
Xxxdlg->ShowWindow(SW_SHOW);
解决方法:可以让创建子窗口时指定其父窗口为桌用即可
CXxxDlg Xxxdlg=new CXxxDlg();
Xxxdlg->Create(IDD_XXX_QUOTE, GetDesktopWindow());
Xxxdlg->ShowWindow(SW_SHOW);
11.如何设置焦点到所指定窗体 注:如果激活窗口卡死的话,会卡在PALOG("step 5");这个地方
PALOG("step 1");
HWND hForeWnd = ::GetForegroundWindow();
PALOG("step 2");
DWORD dwForeID = GetWindowThreadProcessId(hForeWnd, NULL);
PALOG("step 3");
DWORD dwCurID = GetCurrentThreadId();
PALOG("step 4");
AttachThreadInput(dwCurID, dwForeID, TRUE);
PALOG("step 5");
m_edtPayCode.SetFocus();
PALOG("step 6");
AttachThreadInput(dwCurID, dwForeID, FALSE);
PALOG("step 7");
12.还是焦点问题 窗体create.(id,父窗体); 后,创建窗体会默认被置顶
所以在创建窗体的初始化函数中要加上
ModifyStyle(0, WS_EX_NOACTIVATE, SWP_NOACTIVATE);