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 【画矩形。。。】
22static/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; 即可
 451220》--------------------------负责效果
 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 string212 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("
");
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 
538static/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
View Code

 ////////////////////////////////////////////////////////////////////////////////、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

响应重绘后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(" 系统总内存:%6fG ",  (float)MemStatus.dwTotalPhys/1024/1024/1024);   //

//    StrFreeMemory.Format(" 系统可用内存:%6fG ",  (float)MemStatus.dwAvailPhys/1024/1024/1024);  //

//    StrFb.Format(" 核:%d ", 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(" 单核或小于.5 ");//

   }

//    StrFb1.Format(" 内存使用率:%f ", 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;

原文地址:https://www.cnblogs.com/Miami/p/3141010.html