打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
vc++经典技巧总结

1.如何禁止对话框关闭按钮和浮动工具条上的系统菜单 
1、禁止对话框中的关闭按钮有二种方法。 
第一种方法,用ModiftMenu()涵数来实现: 
CMenu* pMenu = this->GetSystemMenu(FALSE); 
pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED ); 
第二种方法,用EnableMenuItem()涵数来实现: 
CMenu* pMenu = this->GetSystemMenu(FALSE); 
pMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED); 
2、禁止浮动工具条上的系统菜单。 
新建一个CToolBar的派生类CxxToolBar,在新类中的左键双击(CxxToolBar::OnLButtonDblClk(…)) 
和左键单击(CxxToolBar:: OnLButtonDown(…))涵数中分别加入下面代码既可: 
if (IsFloating()) //工具条正在浮动状态中 

  CWnd* pMiniFrame; 
  CWnd* pDockBar; 
  pDockBar = GetParent(); 
  pMiniFrame = pDockBar->GetParent(); 
  //去除其上系统菜单 
  pMiniFrame->ModifyStyle(WS_SYSMENU, NULL); 
  //重绘工具条 
  pMiniFrame->ShowWindow(SW_HIDE); 
  pMiniFrame->ShowWindow(SW_SHOW); 

3、禁止窗口最大化按钮 
在PreCreateWindow()涵数中去掉WS_MAXIMIZEBOX风格显示既可。 
BOOL CxxFrameWnd::PreCreateWindow(CREATESTRUCT& cs) 

cs.style &= ~WS_MAXIMIZEBOX; 
return CFrameWnd::PreCreateWindow(cs); 
}

2.如何拷贝一个工程的对话框资源到另一个工程中? 
有两种方法可以实现: 
1)你可以直接拷贝resource,用VC++以文本的方式或者直接用文本编辑器打开.rc文件,将有关的片段从 
一个工程拷贝到另一个工程.你可以通过查找如下字样的片段(此片段用来定义对话框资源)来拷贝你要 
的部分: 
IDD_MYDIALOG_ID DIALOG DISCARDABLE 0, 0, 235, 55 
这里的IDD_MYDIALOG_ID是你的对话框的ID,将到此片段结尾的部分全拷下来,通常你还要给新的工程 
加一个ID(通过DevStudio的工具或者直接修改resource.h文件). 
2)可以通过DevStudio的copy/paste功能.首先,在编辑器以"auto"模式打开.rc文件,这时resource 
正确的显示出来.然后,选中要拷贝的对话框的ID,在Edit菜单里选Copy或者按住Ctrl+C.然后打开目标 
resource文件,在Edit菜单里选Paste或者按住Ctrl+V.

3.如何实现点一下对话框外面的区域,自动隐藏对话框? 
[问题提出] 
如果想在点击对话框外面的地方使得对话框关闭,该如何做? 
[解决方法] 
试试下面的代码,原理是在激活对话框时,捕获鼠标的动作,当鼠标点击时判断是否点击在对话框外,是的话就释放对话框. 
[程序实现] 
建立名为My的对话框程序.实现如下步骤: 
在MyDlg.h中加入: 
class CShowWindow1Dlg : public CDialog 

  // Construction 
  public: 
  int m_cx; 
  int m_cy; 
  …… 
}; 
在MyDlg.cpp中: 
//定义消息映象,处理鼠标单击及激活 
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 
//{{AFX_MSG_MAP(CMyDlg) 
ON_WM_LBUTTONDOWN() 
ON_WM_ACTIVATE() 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) 

CRect rect; 
GetClientRect(&rect); 
rect.InflateRect(m_cx, m_cy); 
//Release dialog if the user click outside it. 
if(!rect.PtInRect(point)) 

  EndDialog(IDCANCEL); 

CDialog::OnLButtonDown(nFlags, point); 

void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 

CDialog::OnActivate(nState, pWndOther, bMinimized); 
if( nState == WA_ACTIVE || nState == WA_CLICKACTIVE) 
SetCapture(); 
else 
ReleaseCapture(); 

BOOL CMyDlg::OnInitDialog() 

CDialog::OnInitDialog(); 
….. 
OSVERSIONINFO info; 
memset((char*)&info, 0, sizeof(OSVERSIONINFO)); 
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
if(GetVersionEx(&info)) 
{ //we don’t run on Win32s, so check only two values 
  if(info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) 
  { //On windows 95 
m_cx = GetSystemMetrics(SM_CXFIXEDFRAME); 
m_cy = GetSystemMetrics(SM_CYFIXEDFRAME); 
  } 
  else 
  { //On NT 
m_cx = GetSystemMetrics(SM_CXDLGFRAME); 
m_cy = GetSystemMetrics(SM_CYDLGFRAME); 
  } 


  说明: 
  1)WM_ACTIVATE消息在ClassWizard中没有,按如下步骤添加,右击CMyDlg类,选Add Windows Message Handle,接着在Filter for messages available to中选Window,在New Windows messages/events列表中就会出现WM_ACTIVATE,选中,点击Add Handler 
  2)SM_CXDLGFRAME,SM_CYDLGFRAME  NT中取得有WS_DLGFRAMEstyle风格的窗口的高和宽 95中已经废弃而采用SM_CX_FIXEDFRAME和SM_CYFIXEDFRAME

4. 初始化应用程序的大小 
如果想使应用程序界面(文档)在开始运行是按你的尺寸展现在屏幕上, 
添加代码如下: 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 

int xsize=::GetSystemMetrics(SM_CXSCREEN); 
int ysize=::GetSystemMetrics(SM_CYSCREEN); 
cs.cx=xsize*5/10; 
cs.cy=ysize*5/10; 
cs.x=(xsize-cs.cx)/2; 
cs.y=(ysize-cs.cy)/2;   

其中的5/10是你的初始界面占屏幕的百分比,可以自己修改。如果想使应用程序大小固定添加cs.style&=~WS_THICKFRAME;

5. 如何得到视图指针? 
[问题提出] 
现在你有一个多线程的Demo,你想在多线程里处理视图指针里的函数,我们给这个函数起个名字:Put();该如何实现呢? 
  //有两种方法可以实现你的要求: 
  //1)第一种方法: 
  //要是多线程不是在App.cpp里出现,那么要在多线程的.cpp中加上extern CYourApp theApp; 
  //获得文档模板: 
  POSITION curTemplatePos = theApp.GetFirstDocTemplatePosition(); 
  CDocTemplate *m_doc=theApp.GetNextDocTemplate(curTemplatePos); 
  //获得文档: 
  curTemplatePos=m_doc->GetFirstDocPosition(); 
  CYourDoc *m_pdoc=(CA8Doc*)m_doc->GetNextDoc(curTemplatePos); 
  //获得视图: 
  curTemplatePos=m_pdoc->GetFirstViewPosition(); 
  CYourView *m_pview=(CYourView*)m_pdoc->GetNextView(curTemplatePos); 
  //调用视图函数: 
  m_pview->Put(); 
  //2)第二种方法: 
  //获得窗体指针: 
  CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; 
  //获得与该窗体符合的视图: 
  CYourView *m_pView = (CYourView *) pFrame->GetActiveView(); 
  //调用视图函数: 
  m_pView->Put();

6. 如何使我的程序在启动时不创建一个新文档? 
在程序的InitInstance中的ProcessShellCommand函数之前加入: cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing

7. 如何将标题栏上的右键菜单屏蔽掉? 
[解决方法] 
右键菜单是系统菜单,只要将其WS_SYSMENU的属性去掉即可. 
[程序实现] 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 

  …….. 
  long style = GetWindowLong(m_hWnd, GWL_STYLE); 
  style &= ~WS_SYSMENU; 
  SetWindowLong(m_hWnd, GWL_STYLE, style); 
  return 0; 
}

8.如何全屏显示(没有标题,没有菜单,没有工具条) 
[解决方法] 
重载CMainFrame的ActivateFrame函数: 
void CMainFrame::ActivateFrame(int nCmdShow)  

  CRect cRectdesktop; 
  WINDOWPLACEMENT windowplacement; 
  ::GetWindowRect(::GetDesktopWindow(),&cRectdesktop); 
  ::AdjustWindowRectEx(&cRectdesktop,GetStyle(),TRUE,GetExStyle()); 
  windowplacement.rcNormalPosition=cRectdesktop; 
  windowplacement.showCmd=SW_SHOWNORMAL; 
  SetWindowPlacement(&windowplacement);  
  CFrameWnd::ActivateFrame(nCmdShow); 
}

9.如何设置有背景颜色的文本 
(1)[解决方法] 
用到了CDC::SetBkMode(); 
[程序实现]  
void CMyView::OnDraw(CDC* pDC) 

  CMyDoc* pDoc = GetDocument(); 
  ASSERT_VALID(pDoc); 
  CRect rcView;//加這兩句 
  GetClientRect(rcView); 
  // TODO: add draw code for native data here 
  CString str (_T("Perfect Text..."));  
  pDC->SetBkMode(TRANSPARENT);  
  rcView.OffsetRect (1,1);  
  pDC->SetTextColor(RGB (0,0,0));  
  pDC->DrawText(str,str.GetLength(),rcView,DT_SINGLELINE | DT_CENTER | DT_VCENTER);  
  rcView.OffsetRect(-1,-1);  
  pDC->SetTextColor(RGB (255,0,0));  
  pDC->DrawText(str,str.GetLength(),rcView,DT_SINGLELINE | DT_CENTER | DT_VCENTER);  

(2) 建立名为My的SDI或MDI,并响应WM_ERASEBKGND. 
BOOL CMyView::OnEraseBkgnd(CDC* pDC)  

  // TODO: Add your message handler code here and/or call default 
  CBrush Brush (RGB(114,147,171));  
  // Select the brush into the device context .  
  CBrush* pOldBrush = pDC->SelectObject(&Brush);  
  // Get the area that needs to be erased .  
  CRect ViewClip;  
  pDC->GetClipBox(&ViewClip);  
  //Paint the area.  
  pDC->PatBlt(ViewClip.left,ViewClip.top,ViewClip.Width(),ViewClip.Height(),PATCOPY);  
  //Unselect brush out of device context .  
  pDC->SelectObject (pOldBrush );  
  // Return nonzero to half fruther processing .  
  return TRUE; 
  return CView::OnEraseBkgnd(pDC); 

此方法也适合基类是EditView的SDI或MDI的情况,但是字体的颜色和底色不行.建议用WM_CTLCOLOR.

10.串太长时往让其末尾显示一个省略号(在SDI或MDI的View中) 
[问题提出] 
如何在串太长时往让其末尾显示一个省略号(在SDI或MDI的View中)? 
[程序实现] 
建立名为My的SDI或MDI工程. 
void CMyView::OnDraw(CDC* pDC) 

  CMyDoc* pDoc = GetDocument(); 
  ASSERT_VALID(pDoc); 
  // TODO: add draw code for native data here 
  pDC->DrawText(CString("It’s a long string,so we will add a '…’ at the end."),CRect (110, 110, 180, 130),DT_LEFT | DT_END_ELLIPSIS);  
  //Add ellpsis to middle of string if it does not fit  
  pDC->DrawText(CString("It’s a long string,so we will add a '…’ at the end."),CRect (110, 140, 300, 160),DT_LEFT | DT_PATH_ELLIPSIS);  
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CDC 中的FillRect(),FrameRect(),InvertRect(),DrawIcon()的小例子
MFC中CDC的使用?绘图
VC中坐标系的建立 zz
XTToolkitPro使用
如何去掉CMainframe系统标题栏
单文档实现多视图
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服