所学5

来源:互联网 发布:检测域名是否被墙 编辑:程序博客网 时间:2024/06/01 20:45
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);

0 0
原创粉丝点击