windows开发中的一点总结
工作大半年了,MFC开发中遇到的一些问题和总结~~~
1 /*********************************************************/ 2 【vector<UrlPort>】 3 【PreTranslateMessage】 4 【MyDrawText】 5 【按钮图片替换】 6 【client or screen 高度/宽度】 7 【浏览框 设计】/【选择路径】/【选择文件弹出框】 8 【CString字符/字符串 替换】 9 【MyDrawText】 10 【CPaintDC】 11 【快速在另一个工程中添加已经有的对话框资源】 12 【CString 和 char* 等之间的转换】 13 【“超链接”到某网址】 14 【判断某点是否在某rect内】 15 【这三句和下面这一句必加,否则Png图片不能读取】 16 【去掉标题栏】 17 //----------------------------------------------------------------- 18 【IPCClient点登录后,再点其它窗口,最终导致程序主界面】 19 【0407SY_PC m_min.SetButtonImage(pBuffer); 中断】 20 【获取控件rect】 21 【画矩形。。。】 22 【static/label控件背景透明】 23 【release, debug下通用的scopy】 24 【BitBlt(原图大小), StretchBlt(缩放)】 25 【exe位置 GetModulePath】 26 【CFileDialog, BROWSEINFO 会改变程序运行path, 从而可能导致异常】 27 【按行读取文件MFC】 28 【ListBox_Draw】 29 30 /*********************************************************/
1 【一】 2 类中: 3 static vector<UrlPort> vup; 4 类外: 5 vector<UrlPort> CDVRClientMainDlg::vup; 6 ---------------------------------------------- ---------------------------------------------- 7 char *filename=_T("login\\\\login.png"); 8 size_t len=strlen(filename); 9 size_t converted=0; 10 wchar_t *pBuffer; 11 len=len+1; 12 pBuffer=(wchar_t *)malloc(len*sizeof(wchar_t)); 13 mbstowcs_s(&converted,pBuffer,len,filename,_TRUNCATE); 14 m_btnlogin.SetButtonImage(pBuffer); 15 ------------------------------------ -------------------- 16 17 【一】布局控件 18 Button16 19 CWnd * pWnd = NULL; 20 rtBtce.left = 5; 21 rtBtce.top = 600; 22 rtBtce.right = rtBtce.left + 130; 23 rtBtce.bottom = rtBtce.top + 23; 24 ---------------------------------- - 此处只负责布局,不负责效果------------------------------------- 25 rtBtbgn.left = 45; 26 rtBtbgn.top = 125; 27 rtBtbgn.right = rtBtbgn.left + 60; 28 rtBtbgn.bottom = rtBtbgn.top + 23; 29 pWnd = GetDlgItem(IDC_BUTTON_BEGIN); 30 if(pWnd && IsWindow(pWnd->m_hWnd)) 31 { 32 pWnd->MoveWindow(rtBtbgn); 33 } 34 。。。。。。。。。。。。。。。。。。 35 //static-all 36 rtallStatic.right = rectList.right - 125; 37 rtallStatic.left = rtallStatic.right - 40; 38 rtallStatic.top = rectList.bottom - 40; 39 rtallStatic.bottom = rtallStatic.top + 40; 40 m_stcAll.MoveWindow(rtallStatic); 41 42 ------------------------------------------------------------ ---------------------------------------------- 43 本类中的成员变量(一般static)在其它cpp中改变,将.h文件加载过去,然后 44 CmyClass::varible=xx; 即可 45 《1220》--------------------------负责效果 46 m_sliderBr.SetBitmapChannel( IDB_VERTICAL_NORMAL,IDB_VERTICAL_ACTIVE ); 47 m_sliderBr.SetBitmapThumb( IDB_BITMAP_VER_CE2, IDB_BITMAP_VER_CE1, TRUE ); 48 m_sliderBr.DrawFocusRect(FALSE); 49 50 m_sliderBr.SetRange(0,10); 51 m_sliderBr.SetPos( 5 ); 52 53 //前两个int—滑块相应效果 54 //后两个int—channel相应效果 55 m_sliderBr.SetMargin( 0, 0, 2, 2 );//hong_1218--小滑块 56 m_sliderBr.SetVertical();//垂直滑动效果 57 = ============================================ 58 int nWScreen = GetSystemMetrics(SM_CXSCREEN); 59 int nHScreen = GetSystemMetrics(SM_CYSCREEN); 60 CRect rect; 61 rect.right=nWScreen-10; 62 rect.left=rect.right-250; 63 rect.top=0; 64 rect.bottom=nHScreen-100; 65 m_list.MoveWindow(rect);//列表 66 【《1223》】 67 对话框不能截获响应OnLButtonDown时,在PreTranslateMessage下处理 68 POINT p1; 69 GetCursorPos(&p1); 70 ScreenToClient(&p1); 71 72 CRECT m_pRectLink; 73 GetDlgItem(IDC_s)->GetWindowRect(&m_pRectLink); 74 ScreenToClient(&m_pRectLink); 75 76 77 78 //**********************************************************// 79 没映射ON_WM_LBUTTON()的情况下: 80 BOOL CLoginDlg::PreTranslateMessage(MSG* pMsg) 81 { 82 /* if(pMsg->message==WM_LBUTTONDOWN) 83 { 84 GetCursorPos(&p1); 85 ScreenToClient(&p1); 86 //在这里添加单击按下事件的程序 87 if((p1.x > m_pRectLink.left) && (p1.x < m_pRectLink.right) 88 && (p1.y > m_pRectLink.top) && (p1.y < m_pRectLink.bottom)) 89 { 90 ShellExecute(NULL, NULL, _T("http://www.baidu.com"), NULL,NULL, SW_SHOWNORMAL); 91 } 92 } 93 */ 94 return CDialog::PreTranslateMessage(pMsg); 95 } 96 ------------------------------------------------------------------------------------ ---------------------------- 97 98 99 100 101 102 103 有映射ON_WM_LBUTTONDOWN()的情况下: 104 void CLoginDlg::OnLButtonDown(UINT nFlags, CPoint point) 105 { 106 // TODO: 在此添加消息处理程序代码和/或调用默认值 107 ............................. 108 .............................. 109 //_1223 110 if((point.x > m_pRectLink.left) && (point.x < m_pRectLink.right) 111 && (point.y > m_pRectLink.top) && (point.y < m_pRectLink.bottom)) 112 { 113 ShellExecute(NULL,NULL,_T("http://www.baidu.com"),NULL,NULL, SW_SHOWNORMAL); 114 } 115 CDialog::OnLButtonDown(nFlags, point); 116 } 117 //**********************************************************// 118 void CLoginDlg::OnMouseMove(UINT nFlags, CPoint point)//_1223光标资源设置 119 { 120 // TODO: 在此添加消息处理程序代码和/或调用默认值 121 if((point.x > m_pRectLink.left) && (point.x < m_pRectLink.right) 122 && (point.y > m_pRectLink.top) && (point.y < m_pRectLink.bottom)) 123 { 124 HCURSOR hCursor; 125 hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR2); 126 SetCursor(hCursor); 127 } 128 CDialog::OnMouseMove(nFlags, point); 129 } 130 131 【《1224》】 132 【一、】 133 void CLoginDlg::MyDrawText(COLORREF color) 134 { 135 /* //绘入静态文本框文字_1224 136 CWnd* pWnd_k = GetDlgItem(IDC_s); //_1224 137 CDC* pDC_k = pWnd_k->GetDC(); 138 pDC_k->SetTextColor(RGB(0,0,0)); 139 CRect rt ; 140 pWnd_k->GetClientRect(rt); 141 pDC_k->DrawText("快速注册",rt,0); 142 ReleaseDC(pDC_k); 143 */ 144 145 CRect rt ; 146 CWnd* pWnd = GetDlgItem(IDC_s); //_1224 147 pWnd->GetClientRect(rt); 148 CDC* pDC = pWnd->GetDC(); 149 ASSERT_VALID(pDC); 150 CFont font; 151 font.CreateFont(14,0,0,0,150,FALSE,FALSE,0,ANSI_CHARSET, 152 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Aerial"); 153 pDC->SelectObject(&font); 154 155 pDC->SetTextColor(color); 156 pDC->SetBkMode(TRANSPARENT);//文字背景“透明” 157 pDC->DrawText("快速注册",rt,0); 158 ReleaseDC(pDC); 159 } 160 【二、】 161 void CTopLeftDlg::MyDrawText(COLORREF color, CString str, CRect rt, int nSize) 162 { 163 164 //创建字体 165 CDC* pDC = GetDC(); 166 CFont font; 167 font.CreateFont(nSize,0,0,0,150,FALSE,FALSE,0,ANSI_CHARSET, 168 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, 169 DEFAULT_PITCH&FF_SWISS,"Aerial"); 170 pDC->SelectObject(&font); 171 172 //drawtext 173 pDC->SetTextColor(color); 174 pDC->SetBkMode(TRANSPARENT);//文字背景“透明” 175 pDC->DrawText(str , &rt, DT_CENTER | DT_VCENTER); 176 177 pDC->SelectObject(&font); 178 font.DeleteObject(); 179 ReleaseDC(pDC); 180 } 181 182 【按钮图片替换】 183 filename=_T("login\\\\server.png"); 184 len=strlen(filename); 185 converted=0; 186 len=len+1; 187 pBuffer=(wchar_t *)malloc(len*sizeof(wchar_t)); 188 mbstowcs_s(&converted,pBuffer,len,filename,_TRUNCATE); 189 m_btntempsetwireless.SetButtonImage(pBuffer); 190 注意按钮属性,设置OverDraw为TRUE 191 192 193 /*****************************************************************************/ 194 /********************** 【总结】 ******************************/ 195 /*****************************************************************************/ 196 【一】,底部scrollbtToolBar显示有余留的问题 197 :ResizeControlsPos(void)中处理SW_HIDE、SW_SHOW。 198 如: 199 pWnd = GetDlgItem(IDC_BT_SHOWHIDE_LEFTFRAME); 200 if(pWnd && IsWindow(pWnd->m_hWnd)) 201 { 202 pWnd->MoveWindow(rtShowHideLeftFrame); 203 pWnd->ShowWindow(SW_HIDE);//_1224 204 //不加第二句则有,显示余留 205 } 206 【二】主窗口的wndpross()可以拦截WM_CLOSE消息,这样消息映射就不会有响应。 207 208 【三】优化时注意消息的响应是否正常,如从外界引用的控件类 209 210 211 【CString to string】 212 char *p = strusername.GetBuffer(strusername.GetLength()); 213 string str(p); 214 strusername.ReleaseBuffer(); 215 216 【CMenu/】 217 //响应右键点击,产生右键菜单的删除文件选项 218 void CSystemInfoDlg::OnNMRclickList2(NMHDR *pNMHDR, LRESULT *pResult) 219 { 220 //AfxMessageBox("右键菜单L02!"); 221 //ScreenToClient(&pt); 222 //ClientToScreen(&pt); 223 224 CPoint pt; 225 GetCursorPos(&pt); 226 227 CMenu menu; 228 menu.CreatePopupMenu(); 229 menu.AppendMenu(0,ID_PIC,"删除文件");//ID_PIC,resource.h中定义 230 231 menu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this); 232 233 } 234 235 //响应右键菜单-删除文件PreTranslateMessage() 236 void CSystemInfoDlg::DeletePic() 237 { 238 // AfxMessageBox("删除图片!"); 239 // CListCtrl m_list; 240 POSITION pos = m_list.GetFirstSelectedItemPosition(); 241 int nItem = m_list.GetNextSelectedItem(pos); 242 CString picfullname = m_list.GetItemText(nItem,1); 243 244 // m_list.DeleteItem(nItem); 245 DeleteFile(picfullname); 246 247 //保证右边序号一起变化 248 m_list.DeleteAllItems(); 249 OnBnClickedPlFind(); 250 } 251 252 【client or screen 高度/宽度】 253 // int nWScreen = GetSystemMetrics(SM_CXSCREEN); 254 // int nHScreen = GetSystemMetrics(SM_CYSCREEN); 255 CRect rectList; 256 GetClientRect(rectList); 257 258 【浏览框 设计】 259 BROWSEINFO bi; 260 char dispname[100],path[100]; 261 ITEMIDLIST *pidl; 262 263 bi.hwndOwner =GetSafeHwnd(); 264 bi.pidlRoot =0; 265 266 bi.pszDisplayName =dispname; 267 bi.lpszTitle ="选择文件夹"; 268 // bi.ulFlags =BIF_RETURNONLYFSDIRS; 269 bi.ulFlags =BIF_NEWDIALOGSTYLE; 270 bi.lpfn =0; 271 bi.lParam =0; 272 bi.iImage =0; 273 274 275 if(pidl=SHBrowseForFolder(&bi)) 276 { 277 if(SHGetPathFromIDList(pidl,path)==true) 278 { 279 GetDlgItem(IDC_CPATH)->SetWindowText(path); 280 } 281 } 282 283 284 【CString字符/字符串 替换】 285 CString CPageDvrViewDlg::ReplaceChar(CString& strContent,CString strSrc,CString strDest) 286 { 287 CString strReturn; 288 int nBeginPos = 0; 289 int nEndPos = 1; 290 while(nEndPos >= 0) 291 { 292 nEndPos = strContent.Find(strSrc,nBeginPos); 293 if(nEndPos < 0) break; 294 strReturn += strContent.Mid(nBeginPos,nEndPos - nBeginPos); 295 strReturn += strDest; 296 nBeginPos = nEndPos + strSrc.GetLength(); 297 } 298 strReturn += strContent.Right(strContent.GetLength() - nBeginPos); 299 return strReturn; 300 } 301 302 【MyDrawText】 303 void CLoginDlg::MyDrawText(COLORREF color) 304 { 305 CRect rt ; 306 CWnd* pWnd = GetDlgItem(IDC_STATIC7); //_1226 307 pWnd->GetClientRect(rt);//获得drawtext目标区域 308 309 //创建字体 310 CDC* pDC = pWnd->GetDC(); 311 CFont font; 312 font.CreateFont(16,0,0,0,150,FALSE,FALSE,0,ANSI_CHARSET, 313 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Aerial"); 314 pDC->SelectObject(&font); 315 316 //drawtext 317 pDC->SetTextColor(color); 318 pDC->SetBkMode(TRANSPARENT);//文字背景“透明” 319 //pDC->DrawText("注册",rt,0); 320 pDC->DrawText("注 册",rt,0); 321 ReleaseDC(pDC); 322 } 323 void CMailRightDlg::MyDrawText(COLORREF color, CString str, CRect rt, int nSize, int nWeight) 324 { 325 326 //创建字体 327 CDC* pDC = GetDC(); 328 CFont font; 329 font.CreateFont(nSize,0,0,0,nWeight,FALSE,FALSE,0,ANSI_CHARSET, 330 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, 331 DEFAULT_PITCH&FF_SWISS,_T("宋体"));//Aerial, 宋体 332 pDC->SelectObject(&font); 333 334 //drawtext 335 pDC->SetTextColor(color); 336 pDC->SetBkMode(TRANSPARENT);//文字背景“透明” 337 pDC->DrawText(str , &rt, DT_LEFT | DT_VCENTER); 338 339 pDC->SelectObject(&font); 340 font.DeleteObject(); 341 ReleaseDC(pDC); 342 } 343 344 345 【CPaintDC】 346 //画竖条,看不到,则已被嵌入的框框挡住 347 CPaintDC dc(this); 348 CRect rt1,rt2; 349 GetClientRect(&rt1); 350 rt2 = rt1; 351 rt1.top += 64; 352 rt1.bottom -= 32; 353 rt1.left = 253; 354 rt1.right = rt1.left + 17; 355 dc.FillSolidRect(rt1,RGB(158,218,239)); 356 357 358 【选择路径弹出框】 359 void CSetPathDlg::OnBnClickedBtnBrow2() 360 { 361 // TODO: 在此添加控件通知处理程序代码 362 BROWSEINFO bi; 363 char dispname[100],path[100]; 364 ITEMIDLIST *pidl; 365 366 bi.hwndOwner =GetSafeHwnd(); 367 bi.pidlRoot =0; 368 369 bi.pszDisplayName =dispname; 370 bi.lpszTitle ="选择文件夹"; 371 // bi.ulFlags =BIF_RETURNONLYFSDIRS; 372 bi.ulFlags =BIF_NEWDIALOGSTYLE; 373 bi.lpfn =0; 374 bi.lParam =0; 375 bi.iImage =0; 376 377 if(pidl=SHBrowseForFolder(&bi)) 378 { 379 if(SHGetPathFromIDList(pidl,path)==true) 380 { 381 GetDlgItem(IDC_EDT_SET_PATH2)->SetWindowText(path); 382 } 383 } 384 } 385 386 【选择文件弹出框】 387 void CAlarmInfoDlg::OnBnClickedButtonBrow() 388 { 389 // TODO: 在此添加控件通知处理程序代码 390 391 CFileDialog mFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, 392 "文件类型(*.pk2)||", NULL/*AfxGetMainWnd()*/); 393 394 if(mFileDlg.DoModal()==IDOK) 395 { 396 m_sPk2 = mFileDlg.GetFileExt(); 397 if ( !strcmp(m_sPk2,"pk2")) 398 { 399 m_myPathName=mFileDlg.GetPathName(); 400 m_myFileName=mFileDlg.GetFileName(); 401 } 402 else 403 { 404 MessageBox("请选择pk2类型文件!"); 405 return; 406 } 407 } 408 409 二、保存文件 410 同上,只不过将CFileDialog hFileDlg(true,NULL 改为 CFileDialog hFileDlg(false,NULL, 411 文件类型说明和扩展名间用 | 分隔,可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。 412 CFileDialog mFileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, 413 "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||", NULL); 414 CFileDialog mFileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, 415 "文件类型(*.xsf)|*.xsf|文件类型(*.txt)|*.txt||", NULL); 416 //GetDlgItem(IDC_EDT_SETSYSTEM_LAN) -> SetWindowText(pathName); 417 //m_edtLang.SetWindowText(pathName); 418 UpdateData(false); 419 } 420 421 【保存文件弹出框】: 422 void CChooseIpc::OnBnClickedChooseipcDc1() 423 { 424 // TODO: 在此添加控件通知处理程序代码 425 CString str01, str02; 426 CFileDialog mFileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, 427 "文件类型(*.txt)|*.txt||", NULL); 428 429 if(mFileDlg.DoModal()==IDOK) 430 { 431 str01 = mFileDlg.GetPathName(); 432 str02 = mFileDlg.GetFileExt(); 433 if (str02 != "txt") 434 str01 += _T(".txt"); 435 } 436 437 //--------------------------------------------- 438 CString str1; 439 CFile file; 440 BOOL bl = file.Open (str01,CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate,NULL); 441 if (bl) 442 { 443 int nCount = m_list.GetCount(); 444 for (int i=0; i<nCount; ++i) 445 { 446 m_list.GetText(i, str1); 447 str1 = str1 + CString("\r\n"); 448 file.Write(str1,str1.GetLength()); 449 } 450 451 file.Close(); 452 } 453 else 454 { 455 AfxMessageBox(_T("数据导出失败!")); 456 } 457 } 458 459 【快速在另一个工程中添加已经有的对话框资源】 460 1,在源工程的.rc文件中,将Dialog部分的代码复制到新工程的.rc文件中;类似的如果有用到原资源中相同的资源(如IDB,ICON......等),也将其代码复制到新工程的rc中。 461 462 2,将所有对话框中所用到的控件或者其它资源的ID定义从原resource.h复制到新工程的resource.h中。 463 PS: 一般在同一时间段创建的框框,控件等的ID 均是分类(区域),挨在一直起的。 464 465 3,把相应的对话框的.h/.cpp文件复制到新工程中,只要在新工程用到的地方作好与原工程相同的变量等添加设置即可。 466 467 Q1: 出现无法解析外部连接的情况,一般是.h/.cpp文件没有添加, 或者.rc文件中的问题。 468 469 470 【CString 和 char* 等之间的转换】 471 CString 转 char * CString strtest="wwwwttttttt"; charpoint=strtest.GetBuffer(strtest.GetLength()); 472 -------------- ---------------------------------------------------------------- 473 CString mac; 474 (LPSTR)(LPCTSTR)mac; 475 476 477 478 【“超链接”到某网址】 479 ShellExecute(NULL, NULL, _T("http://113.106.88.132:8080/register.jsp"), NULL,NULL, SW_SHOWNORMAL); 480 481 【判断某点是否在某rect内】 482 m_rectPic.PtInRect(point) 483 484 【这三句和下面这一句必加,否则Png图片不能读取】 485 /* 486 这三句和下面这一句必加,否则Png图片不能读取 487 GdiplusShutdown(gdiplusToken) 488 */ 489 GdiplusStartupInput gdiplusStartupInput; 490 ULONG_PTR gdiplusToken; 491 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 492 493 【去掉标题栏】 494 CIPCClientDlg * pMWnd = (CIPCClientDlg *)::AfxGetMainWnd(); 495 496 if (pMWnd==NULL) 497 { 498 return; 499 } 500 501 //-- 502 pMWnd->ShowWindow(SW_HIDE); 503 pMWnd->ModifyStyle(WS_CAPTION,0,0); //去掉标题栏。 504 505 【IPCClient点登录后,再点其它窗口,最终导致程序主界面不能正常显示】 506 OnInitdialog() 返回FALSE即可. 507 PS:个人总结是:当返回TRUE时表明Windows自动的将输入焦点置于序列上排第一的 某个空件上;而当返回FALSE时只是表明你将输入焦点人为的改变在其他的某个控件上。 508 509 510 511 512 513 【0407SY_PC m_min.SetButtonImage(pBuffer); 中断】 514 由于没加CDialog::OnInitDialog(); 515 516 517 【获取控件rect】 518 CRect rectList, rect1, rect2; 519 m_midRList.GetItemRect(m_ncurSel, &rectList); //list box中的item区域 520 //------------- 521 CRect rect; 522 GetDlgItem(IDC_BUTTON)->GetWindowRect(rect); //控件button 523 524 【嵌入的dlg不显示控件, ondrawitem不响应。。。】 525 1, 把别的dlg嵌入到了此处 526 2, 没设置自绘属性, 或者没添加消息 527 528 529 【画矩形。。。】 530 CClientDC dc(this);//选定当前画图环境 531 CPen pen(PS_SOLID,1,RGB(255,0,0));//做一支红色粗细为的笔 532 dc.SelectObject(&pen);//将pen放到dc上 533 dc.Rectangle(100,100,200,200);//画一个矩形 534 //线条 535 dc.MoveTo(m_rcL5.left, m_rcL5.bottom); //确定初始位置 536 dc.LineTo(m_rcL5.right, m_rcL5.bottom); 537 538 【static/label控件背景透明】 539 HBRUSH CLoginDlg::OnCtlColor(CDC* pDC,CWnd* pWnd, UINT nCtlColor) 540 { 541 HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor); 542 switch (pWnd->GetDlgCtrlID()) 543 { 544 case IDC_STATIC_FINDPWD: 545 pDC->SetBkMode(TRANSPARENT); 546 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 547 case IDC_STATIC_USR: 548 pDC->SetBkMode(TRANSPARENT); 549 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 550 case IDC_STATIC_PWD: 551 pDC->SetBkMode(TRANSPARENT); 552 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 553 case IDC_STATIC_SAVE_PWD: 554 pDC->SetBkMode(TRANSPARENT); 555 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 556 case IDC_STATIC_LIXIAN: 557 pDC->SetBkMode(TRANSPARENT); 558 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 559 case IDC_REG_STATIC_MAIL: 560 pDC->SetBkMode(TRANSPARENT); 561 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 562 case IDC_REG_STATIC_PWD: 563 pDC->SetBkMode(TRANSPARENT); 564 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 565 case IDC_REG_STATIC_RPWD: 566 pDC->SetBkMode(TRANSPARENT); 567 return HBRUSH(GetStockObject(HOLLOW_BRUSH)); 568 default: 569 break; 570 } 571 572 return hbr; 573 } 574 575 【release, debug下通用的scopy】 576 //_0408 577 StrCpyW(g_nofityIconData.szTip, _T("商翼"));//debug 578 579 【BitBlt(原图大小), StretchBlt(缩放)】 580 一, 581 memDC.BitBlt(x,y,rtClient.Width(),rtClient.Height(),&m_bkMemDC,0,0,SRCCOPY); 582 memDC.StretchBlt(x,y,rtClient.Width(),78,&m_bkMemDC,0,0,150,78,SRCCOPY); 583 584 二, 585 //pDC->BitBlt(rcBtn.left, rcBtn.top, rcBtn.Width(), rcBtn.Height(), pDisplayMemDC, 0, 0, SRCCOPY); 586 pDC->StretchBlt(rcTitleBk.left, rcTitleBk.top, rcTitleBk.Width(), rcTitleBk.Height(), pDisplayMemDC, 0, 0, 734, 24, SRCCOPY);//可缩放 587 588 589 590 【ListBox】 591 m_listctrl.ResetContent(); //清空listbox 592 m_list.DeleteAllItems(); //清空listcontrol 593 594 595 【exe位置 GetModulePath】 596 CString strPath; 597 strPath = GetModulePath(); 598 strPath += IMG_BK_PATH; 599 600 【CFileDialog, BROWSEINFO 会改变程序运行path, 从而可能导致异常】 601 char path[255]; 602 GetCurrentDirectory(255, path); 603 strPath.Format(_T("%s"), path); 604 Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 605 Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 606 Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 607 SetCurrentDirectory(strPath); 608 //---------------------------------- --------------------------- 609 编译时注意路径设置 610 611 有时候去掉前半部分,运行出错。 612 613 【按行读取文件MFC】 614 CStdioFile file; 615 CString strLine,strtemp; 616 if(!file.Open( "d:\\test.txt ",CFile::modeRead))return;//打开*.TXT这个文件,打开形式为读取 617 int row = 0; //定义行变量 618 while(file.ReadString(strLine)) 619 { 620 char *str = strLine.GetBufferSetLength(strLine.GetLength()); 621 char *p; 622 if(strLine!="") 623 { 624 for (p=strtok(str," ");p!=NULL;p=strtok(NULL," ")) 625 { 626 strtemp = p; 627 } 628 MessageBox(strtemp); 629 } 630 631 } 632 633 file.Close(); 634 635 636 【ListBox_Draw】 637 DrawPic(m); 638 g_Remote[m] //存放数据值 639 640 m_listctrl.SetItemData(m_listctrl.AddString(g_Remote[m].name), (DWORD_PTR)m); 641 642 643 ON_WM_MEASUREITEM() 644 ON_WM_DRAWITEM() 645 646 Void CLeftFrameDlg::OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct ) 647 { 648 lpMeasureItemStruct->itemHeight =70; 649 CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct); 650 } 651 652 void CLeftFrameDlg::OnDrawItem( int nIDCtl,LPDRAWITEMSTRUCT lpDis ) 653 { 654 } 655 656 657 【窗口响应移动消息】 658 ON_WM_NCHITTEST() 659 660 LRESULT CLoginDlg::OnNcHitTest(CPoint point)//!!!!!!!!! 661 { 662 #define D1 10 663 #define D2 12 664 CRect rect; 665 GetClientRect(&rect); 666 ClientToScreen(&rect); 667 CRect rFrame; 668 669 m_nPosition = -1; 670 rFrame.SetRect(rect.left+D1, rect.top+D1, 671 rect.left + 600, 672 rect.top+50); 673 if( rFrame.PtInRect(point) ) 674 { 675 m_nPosition = 0; 676 return HTCAPTION; 677 } 678 679 680 681 return CDialog::OnNcHitTest(point); 682 } 683 684 【限定MFC的EDT框输入数字且位数】 685 m_edtchannel.SetLimitText(2); //限定输入位; 686 设置属性number------------true
////////////////////////////////////////////////////////////////////////////////、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
响应重绘后listbox中item某个区域的事件
int nCurSel = m_mailList.GetCurSel();
g_nCur = nCurSel; //_0424
CPoint point;
GetCursorPos(&point);
m_mailList.ScreenToClient(&point);
CRect rectList, rect1;
m_mailList.GetItemRect(nCurSel, &rectList);
rect1 = rectList;
rect1.top += 10;
rect1.bottom = rect1.top + 18;
rect1.left += 210;
rect1.right = rect1.left + 15;
if (rect1.PtInRect(point))
{
AfxMessageBox(_T("附件"));
}
【内核数,CPU使用率,installshield安装过程`协议许可】
//判断核数
SYSTEM_INFOsysInfo;
GetSystemInfo(&sysInfo);
//判断内存使用情况, 如果可用内存比小于.4,则使用辅码流
CStringStrTotalMemory, StrUsedMemory, StrFreeMemory, StrFb, StrFb1;
MEMORYSTATUSMemStatus;
::GlobalMemoryStatus(&MemStatus);
// StrTotalMemory.Format("\n系统总内存:%6fG\n", (float)MemStatus.dwTotalPhys/1024/1024/1024); //
// StrFreeMemory.Format("\n系统可用内存:%6fG\n", (float)MemStatus.dwAvailPhys/1024/1024/1024); //
// StrFb.Format("\n\n核:%d\n", sysInfo.dwNumberOfProcessors);//
// OutputDebugString(StrFb);//
floatfb = ((float)MemStatus.dwAvailPhys/1024/1024/1024)/((float)MemStatus.dwTotalPhys/1024/1024/1024);
if ( (2 == sysInfo.dwNumberOfProcessors) || (fb < 0.50) ) //者内存使用率在%以上
{
g_UpDialog->m_PlayVideoCtrl.SetFBL(1);
//OutputDebugString(" \n\n单核或小于.5\n\n");//
}
// StrFb1.Format("\n\n内存使用率:%f\n\n", fb);//
// OutputDebugString(StrTotalMemory+StrFreeMemory+StrFb1);//
/_1122 获得CPU使用率,一般第二次后才能获得
//
// CPU ussage Mode
//
#defineSystemBasicInformation 0
#defineSystemPerformanceInformation 2
#defineSystemTimeInformation 3
#defineLi2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
//_1122 : cpu
typedefstruct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
} SYSTEM_BASIC_INFORMATION;
typedefstruct
{
LARGE_INTEGER liIdleTime;
DWORD dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;
typedefstruct
{
LARGE_INTEGERliKeBootTime;
LARGE_INTEGERliKeSystemTime;
LARGE_INTEGERliExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;
LARGE_INTEGER m_liOldIdleTime;
LARGE_INTEGER m_liOldSystemTime;
intGetCpuuse(void)
{
SYSTEM_PERFORMANCE_INFORMATIONSysPerfInfo;
SYSTEM_TIME_INFORMATION SysTimeInfo;
SYSTEM_BASIC_INFORMATION SysBaseInfo;
double dbIdleTime;
double dbSystemTime;
LONG status;
typedefLONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
PROCNTQSINtQuerySystemInformation;
NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
GetModuleHandle("ntdll"),
"NtQuerySystemInformation"
);
if (!NtQuerySystemInformation)
{
return 0;
}
// get number of processors in the system
status = NtQuerySystemInformation(SystemBasicInformation,
&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
{
return 0;
}
status = NtQuerySystemInformation(SystemTimeInformation,
&SysTimeInfo,sizeof(SysTimeInfo),0);
if (status!=NO_ERROR)
{
return 0;
}
// get new CPU's idle time
status = NtQuerySystemInformation(SystemPerformanceInformation,
&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status != NO_ERROR)
{
return 0;
}
doublem_fNewUsges = 0;
// if it's a first call - skip it
if (m_liOldIdleTime.QuadPart != 0)
{
// CurrentValue = NewValue - OldValue
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(m_liOldIdleTime);
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(m_liOldSystemTime);
// CurrentCpuIdle = IdleTime / SystemTime
dbIdleTime = dbIdleTime / dbSystemTime;
// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;
m_fNewUsges = (UINT)dbIdleTime;
}
// store new CPU's idle and system time
m_liOldIdleTime = SysPerfInfo.liIdleTime;
m_liOldSystemTime = SysTimeInfo.liKeSystemTime;
return (int)m_fNewUsges;
}
///////////////////////////////////////////////
Installshield2010
Disable (BACKBUTTON);
if(!MAINTENANCE)then
SdLicense2 ("License ", "", "", SUPPORTDIR ^ "aa.txt", FALSE);
endif;