九重天

一步一步的锻炼;一定会慢慢会实现梦想!

2007年1月7日 #

一些常识

1.在控制面板下 -->性能和维护-->管理工具-->服务选
 则进入服务(本地)界面
  a.将Remote Registry设为禁用
  b.将ClipBook设为禁用
  c.将Telnet设为禁用
2.在运行里输入cmd则进入Dos状态;
  a.输入net user 则可以查看 用户的帐户
  b.输入net user Guest 则可以查看 Guest这个帐户的使用情况
  c.输入net user Guest delete 则可以删除该帐户!
3. 在运行里输入gpedit.msc则进入组策略 窗口
 
3.在运行里输入regedit则进入注册表
4.在运行里输入syskey则进入windows 加密对话框
5.在智能ABC中按v 然后在输入1或2或3就会出现特殊字符!
6.防止用脚本写成的病毒方法是:
  在"文件夹选项"对话框中选中"文件类型"然后在
  一注册的文件类型框中找到“ VBScript Script File”和
  “Jscript Script File”项点击“更改”按纽,在弹出的打开
   方式对话框中选择"记事本"

7。利用ping 命令判断网络故障
   a.ping 本机IP 如果有问题显示的内容为
       Request timed out
   b.ping 网关IP 如果正常就说明本机有问题
   c.ping 远程IP 如果正确表明正常接入互联网
8.在局域网隐藏自己的方法
  控制面板-->网络连接 然后打开本地连接的属性
  在常规选项卡里选中“Microsoft网络的文件和打印机共享”
  然后单击卸载 从而将这台电脑隐藏起来了
9。在运行中输入cmd进入MS-DOS方式,然后输入ipconfig/all 就回出现以下信息
    Phical Address...... 00-04-61-4D-A8-62(MAC地址(前面的数字是任意的))
    DHCP Enabled ...No
    IP Address.......192.168.123.76(IP地址(前面的数字是任意的))
10. 然后通过命令(ARP -s IP地址 MAC地址)这样就把静态IP号和网卡号绑定了ARP[-s][-d][-s]各参数的功能如下
  -s --将相应的IP地址和物理地址绑定
  --d --删除所给出的IP地址与物理地址的绑定
  --a --通过查询Arp协议表示显示IP地址与对应物理地址的情况
11.http://ipid.shat.net这个网站显示你的IP地址!
12.代理服务器的设置和取消
   打开IE浏览器-->工具-->Internet(选项)-->连接
   -->局域网设置-->代理服务器(选中)
13. Sygate Personal Firewall 是一个免费的防火墙!
14.窗口炸弹的解决办法:进入 Windows 后将java功能关掉!然后删除恶意代码!
15.网页或信件中的VBScript是调用ActiveX组件来运行的!因此对ActiveX
   控件进行适当的限制是有用的!不运行出现ActiveX安全警告的程序!
16.如果你的注册表被禁用---解锁的方法:
     方法一
     a.先在 windows 中打开一个记事本
     b.然后在里面输入如下的代码
         REGEDIT4(win98)or
  Windows Registry Editor Version 5.00.(xp)
 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
 "DisableRegistryTools"=dword:00000000
     c.最后另存为 enable.reg!注意文件扩展名一定要为.reg;这是注册表默认的扩展名!
     方法二
     a.先在 windows 中打开一个记事本
     b.然后在里面输入如下的代码
      [Version]
 Signature=\"$Windows NT$\"

 [DefaultInstall]
 ADDREG=Myadd

 [Myadd]
 ;解禁注册表编辑器
 HKCU,Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System,DisableRegistryTools,1,0
 c.最后另存为enable.inf文件!然后单击右键选择运行!
   方法三在运行里输入gpedit.msc在弹出的"组策略"窗口中依次展开"本地计算机策略"-->"用户配置"-->"管理模板"下选中"系统"并在右边窗口找到“阻止访问注册表编辑工具”选择为启动!

17.在注册表里查看HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN 下的文件是否是你安装的或是系统自带的
18.在注册表里将hkey_current_user\software\microsoft\windows\currentversion\policies\system
    disableregistrytools(是否可以运行注册表 0表示可以。1表示不行)
19.在注册表里将hkey_current_user\software\policies\microsoft\internet explorer\control panel homepage=1(主页不可更改)0(可更改)
20.在注册表里将hkey_current_user\software\policies\microsoft\internet explorer\restrictions nobrowseroptions=1(主页不可更改)0(可更改)

21.FTP(File Transfer Protocol)文件传输协议;SMTP 简单邮件传输协议(发信服务) POP3(Post Office Protocol 3)(收信服务)
22.使用代理服务器上网一般不会留下你的IP地址,而是代理服务器的地址!
23.UDP(User Data Protocol用户数据报协议)他是面向非连接的协议,他不与对方建立连接,而是直接就把数据包发送过去!
24.TCP(Transmission Control Protocol 传输控制协议)是基于连接的协议,即在正式收发数据前,必须和对方建立可靠的连接!
25.在"我的电脑"里删除"共享文件夹"的方法是:
   HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\MYCOMPUTER\NAMESPACE\DELEGATEFOLDERS将下面的的子键删除
   {59031a47-3127-44a7-89c5-559fe6b30ee}
26.删除"添加/删除"程序中的残余项
   HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTAL
   里面的子键都包含数据项UninstallString!将数据拷贝到运行里;即可完成卸载!
27。禁止windows记录用户所做的操作:
    HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\POLICIES\EXPLORER单击"编辑"-->"新建"-->"DWORD值"创建一个数值名称为NoInstrumentation其值设为1。
28.清楚"文档"菜单的历史记录
HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\POLICIES\EXPLORER单击"编辑"-->"新建"-->"DWORD值"创建一个数值名称为ClearRecentDocsOnExit其值设为1。
29.清楚"文档"内容在注册表中的记录
   HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\RECENTDOCS将该子键下的所有值删除就可以了!
30。清除IE历史记录的方法:
   HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\INTERNET EXPLORER\TYPEDURLS 下面就记录了最近浏览个的网址!
31.禁止系统记录"文档"信息
   HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\policies\explorer单击"编辑"-->"新建"-->"DWORD值"创建一个数值名称为NoRecentDocsHistory其值设为1。
32.彻底隐藏文件的方法
   HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\ADVANCED\FOLDER\FOLDER\HIDDEN\SHOWALL将键值数据项"CheckedValue"的数值数据设置为"0"
33.禁止用户使用任务管理程序的方法!
  HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\policies\SYSTEM将DisableTaskMgr的值设为1。
34。禁止用户更改密码
   HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\policies\SYSTEM单击"编辑"-->"新建"-->"DWORD值"创建一个数值名称为DisableChangePassword其值设为1
35.禁止文件共项的方法
   HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\policies\network单击"编辑"-->"新建"-->"DWORD值"创建一个数值名称为NoFileSharingControl其值设为1
36.禁止远程管理
   HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\policies\system单击"编辑"-->"新建"-->"DWORD值"创建一个数值名称为NoAdminPage其值设为1

posted @ 2007-01-07 14:24 九重天 阅读(375) | 评论 (0)编辑 收藏

2006年12月15日 #

VC实例创建的详细步骤

下面是我学习整理的东西;希望跟大家共享!希望学VC的朋友顺利!
AfxMessageBox("Copy");表示弹出一个消息框 消息是Copy;
1.启动界面的步骤
  a.创建一个单文档框架
  b.在工程菜单里选择添加工程
  c.在添加工程里选择Components and Controls Gallery
  d.Components and Controls Gallery里选Visuan C++ Components
  e.Visuan C++ Components里选择Splash Screen控件
  f.如果想改动启动界面只需要加入新的位图替换原来的位图
  g.如果想延长界面显示时间可以调节SetTimer(1, 1520, NULL);第一个参数对应nIDEvent
2.给菜单里添加位图的步骤
  a.创建一个单文档框架
  b.在视类里添加CBitmap类对象;需要几个位图就添加几个对象
  c.在视类的构造函数里调用CBitmap类对象的成员函数LoadBitmap(位图ID);
   初始化CBitmap类对象
 d.在视类里的OnDraw(CDC* pDC)函数添加一下函数
 e.    CWnd* parent=GetParent();
 CMenu* pmenubar=parent->GetMenu();
 CMenu* pmenu=pmenubar->GetSubMenu(0);
 pmenu->SetMenuItemBitmaps(0,MF_BYPOSITION,&bm_New,&bm_New);
 pmenu->SetMenuItemBitmaps(1,MF_BYPOSITION,&bm_Open,&bm_Open);
 pmenu->SetMenuItemBitmaps(2,MF_BYPOSITION,&bm_Save,&bm_Save);
3. 改变主窗口的大小形状的步骤!
 a.创建一个单文档框架
  b在MainFrm类中添加消息函数WM_SIZE(OnSize())
  c在OnSize()中添加一下函数就可以了:
 d     CRgn m_rgn;
 CRect rc;             
 GetWindowRect(&rc);     
 rc -= rc.TopLeft();       
 m_rgn.CreateRoundRectRgn(rc.left,rc.top,rc.right,rc.bottom,100,100);   
 SetWindowRgn(m_rgn,TRUE);
4 把主窗口分成几部分的步骤
 a.创建一个单文档框架
  b在MainFrm类中重载虚拟函数OnCreateClient(在类向导里可以找到该虚拟函数)
 c.在MainFrm类中添加CSplitterWnd m_Splitter类对象;
  d.OnCreateClient虚拟函数中添加如下代码
       CRect cr;
 GetClientRect(&cr);
 CSize paneSize(cr.Width()/3, cr.Height() /3);
 m_Splitter.CreateStatic(this,3,1);
 m_Splitter.CreateView(0,0,RUNTIME_CLASS(CExampleView),paneSize,pContext);
 m_Splitter.CreateView(1,0,RUNTIME_CLASS(CExampleView),paneSize,pContext);
 m_Splitter.CreateView(2,0,RUNTIME_CLASS(CExampleView),paneSize,pContext);
 return TRUE;
5.在主窗口的两边创建滚动条的步骤
 a.创建一个单文档框架
  b在MainFrm类中重载虚拟函数OnCreateClient(在类向导里可以找到该虚拟函数)
 c.在MainFrm类中添加CSplitterWnd m_Splitter类对象;
  d.OnCreateClient虚拟函数中添加如下代码
       return m_Splitter.Create(this,2,2,CSize(10,10),pContext);
6.创建透明图形的步骤
 a.创建一个对话框框架
 b.在OnInitDialog()函数中添加以下代码,画出图形
 HRGN m_wndRgn;
 CClientDC dc(this);
 CFont mFont; 
 mFont.CreateFont(200, 50, 0, 0, FW_HEAVY, FALSE, FALSE, 0, ANSI_CHARSET,
  OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
  DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS, "宋体");                 
 //open a path brackets , an application can begin calling GDI
 //drawing functions to define the points that lie in the path.
 dc.BeginPath();  
 dc.SetBkMode(TRANSPARENT);  
 CFont * pOldFont;
 pOldFont = dc.SelectObject( &mFont );
 dc.TextOut(0, 0, "◎◎"); 
 dc.EndPath();
 m_wndRgn =::PathToRegion(dc);
 this->SetWindowRgn(m_wndRgn, TRUE);  
 dc.SelectObject(pOldFont );
  c.进入MFC ClassWizard,在Class Info下的Message filter选择Window,
    然后在回到Message Maps中找到(WM_NCHITTEST)添加该消息函数
  图形就会随着鼠标移动
  d.在该消息函数中添加以下代码
  UINT nHitTest = CDialog::OnNcHitTest(point) ;
  return (nHitTest==HTCLIENT)?HTCAPTION:nHitTest;
7.创建界面缓缓进入,缓缓退出的效果
 a.创建一个单文档框架
  b.在StdAfx.h文件的开始部分添加以下代码
   #undef WINVER
   #define WINVER 0x500
 c.在OnCreate()消息函数中添加以下代码
   AnimateWindow(GetSafeHwnd(),1000,AW_SLIDE|AW_HOR_POSITIVE);
  d.创建OnClose()消息函数并添加以下代码
   AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_CENTER);
8.给某一个控件设置鼠标,比如给button按钮设置鼠标的步骤
  a.创建一个对话框框架
  b.在MFC ClassWizard创建(WM_SETCURSOR)消息函数
 c.在该函数下添加以下代码
     CString sClassName;
 HCURSOR m_Cursor;
 ::GetClassName(pWnd->GetSafeHwnd(),sClassName.GetBuffer(80),80);
 if (sClassName=="Button")
 {
  m_Cursor = AfxGetApp()->LoadCursor(IDC_CURSOR1);
  ::SetCursor(m_Cursor);
  return TRUE;
 }
9.在对话框中添加menu菜单的步骤
 a.创建一个对话框框架
 b.在 ResourseView中建立Menu菜单,
 c.在 ResourseView中打开Dialog对话框在属性对话框里在MENU选项下选择
10.在对话框中添加 ToolBar的步骤
 a.创建一个对话框框架
 b.在 ResourseView中建立Toolbar工具条
 c.在Dialog类的OnInitDialog()函数中添加以下代码
        CRect rect;
 GetClientRect(rect);
 if( !m_wndToolBar.Create(this) )
 {
  TRACE0("Failed to create tool bar\n");
  return -1;  // fail to create
 }

 m_wndToolBar.LoadToolBar(IDR_TOOLBAR1);
 m_wndToolBar.MoveWindow(100, 0, rect.right, 32);
 d.根据Toolbar里的图形ID号!创建一个消息函数!添加以下代码
    AfxMessageBox("Click!");单击该图型就会有个消息框!
 e.
11.在对话框中添加 StatusBar的步骤
 a.创建一个对话框框架
 b.在String Table中添加两个状态值
 c.在对话框类.h里添加CStatusBar类对象;
 d.在对话框类.cpp里添加以下代码:
   static UINT indicators[] =
   {
      IDS_PANEL1,//为String Tabl里添加的ID值
      IDS_PANEL2,
   };
    和OnInitDialog()函数里添加
      CRect rect;
 GetClientRect(rect);
 //状态条
 if (!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,
  sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("未能创建状态栏\n");
  return -1;      // 未能创建
 }
 m_wndStatusBar.MoveWindow(0, rect.bottom-20, rect.right, 20 );
12.添加CDialogBar的步骤
  a.创建一个单文档框架
  b.在MainFrm.h中添加一个public:型CDialogBar m_wndDialogBar对象;
  c.在MainFrm.cpp中的OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加如下代码
      m_wndDialogBar.Create( this, IDD_DIALOG1,CBRS_TOP|CBRS_GRIPPER|
       CBRS_TOOLTIPS | CBRS_FLYBY |
       CBRS_SIZE_DYNAMIC,
       IDD_DIALOG1);
 m_wndDialogBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndDialogBar);
13.制作橡皮球的步骤
  a.创建一个单文档框架
  b.在视图类.h中添加CRectTracker m_tracker;类对象,和左键消息
  c.在视图类的初始化函数中添加以下代码
      m_tracker.m_rect.SetRect(0, 0, 30, 30);
 m_tracker.m_nStyle=CRectTracker::resizeInside | CRectTracker::dottedLine;
  d.在视图类的OnDraw()函数中添加以下代码
      CBrush brush (RGB (0, 255, 255));
 CBrush* pOldBrush=pDC->SelectObject(&brush);
 CRect rcEllipse;
 m_tracker.GetTrueRect(rcEllipse);
 pDC->Ellipse(rcEllipse);
 m_tracker.Draw(pDC);
 pDC->SelectObject(pOldBrush);
 c.在视图类的OnLButtonDown()消息函数中添加以下代码
    CExampleDoc* pDoc=GetDocument();
 ASSERT_VALID(pDoc);

 BOOL bResult=m_tracker.HitTest(point)!= CRectTracker::hitNothing;
 if (bResult)
 {
 
  m_tracker.Track (this,point,true);
  pDoc->SetModifiedFlag();
  pDoc->UpdateAllViews(NULL);
 }
 else
  m_tracker.TrackRubberBand(this,point,true);
14。给右键添加属性的步骤
  a.创建一个对话框框架
  b.加入一个Menu资源
  c.创建WM_CONTEXTMENU消息函数并加入以下代码
      CMenu menu;
 menu.LoadMenu(IDR_MENU1);
 menu.GetSubMenu(0)->TrackPopupMenu(
    TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, 
    point.x, point.y, this);
       单击右键就可以出现属性条
 
15.改变对话框图标的方法
  a.创建一个对话框框架
  b.创建两个图标其ID值分别为(IDI_ICON1);(IDI_ICON2);
  c.添加WM_LBUTTONDOWN消息并添加如下代码
      HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);
 ASSERT(hIcon);
 AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
 //修改大图标
 AfxGetMainWnd()->SendMessage(WM_SETICON,FALSE,(LPARAM)hIcon);
 //修改小图标 
 d.添加WM_RBUTTONDOWN消息并添加如下代码
      HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON2);
 ASSERT(hIcon);
 AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
 //修改大图标
 AfxGetMainWnd()->SendMessage(WM_SETICON,FALSE,(LPARAM)hIcon);
 //修改小图标 
16.切换菜单语言的步骤
    a.创建一个单文档框架
    b.创建两个一样菜单,分别用中英文表示
    c.在MainFrm.h中创建两个菜单对象用于保存中英文资源
    d.根据menu_id号创建两个消息函数分别加入以下号码:
        SetMenu(&m_pChinese);// 把菜单设置为汉语
        SetMenu(&m_pEnglish);// 把菜单设置为英语
    e.在OnCreate()函数中加入如下代码
        m_pChinese.LoadMenu(IDR_MAINFRAME_CN);//调入中文菜单资源
 m_pEnglish.LoadMenu(IDR_MAINFRAME_EN);//调入英文菜单资源 
 SetMenu(&m_pEnglish);
17。在状态栏里显示时间的步骤
   a.创建一个单文档框架
   b.在string Table里添加ID_INDICATOR_CLOCK标识号 标题为0000-00-00 00:00:00
   c.创建WM_TIMER 消息函数并如以下代码
       if (nIDEvent==1)
 {
  CTime t;
  t=CTime::GetCurrentTime();
  CString str=t.Format("%Y-%m-%d %H:%M:%S");
  m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(
                          ID_INDICATOR_CLOCK),str); 
 }
   d.创建WM_CLOSE消息函数并加入以下代码
       KillTimer(1);
   e.OnCreate()函数里添加以下代码
        SetTimer(1,500,NULL);
   f在MainFrm.h的开头处加入以下代码替换原来的代码
       static UINT indicators[] =
      {
 ID_SEPARATOR,           // status line indicator
 ID_INDICATOR_CLOCK,
 ID_INDICATOR_CAPS,
 ID_INDICATOR_NUM,
 ID_INDICATOR_SCRL,
      };
18.创建透明背景的步骤
   a.创建一个对话框框架
   b。在OnInitDialog()函数里添加以下代码
       SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
 //加入WS_EX_LAYERED扩展属性
 HINSTANCE hInst = LoadLibrary("User32.DLL");
 if(hInst)
 {
  typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
  MYFUNC fun = NULL;
  fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
  //取得SetLayeredWindowAttributes函数指针
  if(fun)fun(this->GetSafeHwnd(),0,129,2);
   FreeLibrary(hInst);
 }
19.画直线的步骤
   a.创建一个单文档框架
   b.在视图类.h中添加 CPoint m_StartPoint;类对象
   c.添加WM_LBUTTONDOWN消息 添加如下代码
       m_StartPoint=point;
 SetCapture();
   d.添加WM_LBUTTONUP消息,加如下代码
        if(GetCapture()==this)
 {
  CClientDC dc(this);
  ReleaseCapture();
  dc.MoveTo(m_StartPoint);
  dc.LineTo(point);
 }
      
20。另一种画直线的步骤
    a.创建一个单文档框架
    b.在视图类.h中添加 CPoint m_StartPoint,m_LastEndPoint;类对象
    c.添加WM_LBUTTONDOWN消息 添加如下代码
       m_StartPoint=point;
        m_LastEndPoint=point;
 SetCapture();
    d.添加WM_LBUTTONUP消息,加如下代码
        if(GetCapture()==this)
 {
  CClientDC dc(this);
  ReleaseCapture();
  dc.MoveTo(m_StartPoint);
  dc.LineTo(point);
 }
    e.添加WM_MOUSEMOVE消息,加入如下代码
 if(nFlags && MK_LBUTTON)
 {
  CClientDC dc(this);
  int nDrawMode=dc.GetROP2();
  dc.SetROP2(R2_NOTXORPEN);
  dc.MoveTo(m_StartPoint);
  dc.LineTo(m_LastEndPoint);
  dc.MoveTo(m_StartPoint);
  dc.LineTo(point);
  m_LastEndPoint=point;
  dc.SetROP2(nDrawMode);
 }
21.在对话框中显示位图的步骤
   a.创建一个对话框框架
   b.先创建两个位图
   c.在OnPaint()函数下else语句块里添加如下代码
                CPaintDC dc(this);
  CBitmap BackBMP;
  BackBMP.LoadBitmap(IDB_BITMAP1);
  BITMAP bm;
  BackBMP.GetBitmap(&bm);

  CDC ImageDC;
  ImageDC.CreateCompatibleDC(&dc);
  CBitmap *pOldImageBMP = ImageDC.SelectObject(&BackBMP);
  dc.StretchBlt(0,0,bm.bmWidth,bm.bmHeight,
   &ImageDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
  ImageDC.SelectObject(pOldImageBMP);

  CBitmap ForeBMP;
  ForeBMP.LoadBitmap(IDB_BITMAP2);
  ForeBMP.GetBitmap(&bm);

  pOldImageBMP = ImageDC.SelectObject(&ForeBMP);
  TransparentBlt(dc.GetSafeHdc(),0,0,bm.bmWidth,bm.bmHeight,
   ImageDC.GetSafeHdc(),0,0,bm.bmWidth,bm.bmHeight,RGB(0xff,0xff,0xff));
  ImageDC.SelectObject(pOldImageBMP);
22.创建艺术字的步骤:
    a.创建一个对话框框架
    b.在对话框类.cpp下OnPaint()函数里添加代码
        CPaintDC dc(this); // 用于绘制的设备上下文
 LOGFONT m_logfnt;
 m_logfnt.lfCharSet=DEFAULT_CHARSET;
 m_logfnt.lfClipPrecision=CLIP_DEFAULT_PRECIS;
 m_logfnt.lfEscapement=0;
 strcpy(m_logfnt.lfFaceName,"Times New Roman");
 m_logfnt.lfHeight=80;
 m_logfnt.lfItalic=false;
 m_logfnt.lfOrientation=0;
 m_logfnt.lfPitchAndFamily=FF_SWISS;
 m_logfnt.lfQuality=DEFAULT_QUALITY;
 m_logfnt.lfStrikeOut=false;
 m_logfnt.lfUnderline=true;
 m_logfnt.lfWeight=800;
 m_logfnt.lfWidth=20;
 m_logfnt.lfOutPrecision=OUT_DEFAULT_PRECIS;

 CFont m_font;
 m_font.CreateFontIndirect(&m_logfnt);
 CFont *pOldFont = dc.SelectObject(&m_font);
 CString lpszString1="Hello VC";
       // dc.SetBkMode(TRANSPARENT);
 dc.SetBkColor(RGB(255,125,0));
 dc.TextOut(0,0,lpszString1,lstrlen(lpszString1));
 dc.SelectObject(pOldFont);
 CDialog::OnPaint();
23.在单文档框架里显示位图
   a.创建单文档框架
   b.在视图类.cpp里的OnDraw(CDC* pDC)函数下加入代码
        CBitmap bitmap;
 bitmap.LoadBitmap(IDB_BITMAP1);
 CDC MemDC;
 MemDC.CreateCompatibleDC(pDC);
 CBitmap *pOldBitmap=MemDC.SelectObject(&bitmap);
 BITMAP bm;
 bitmap.GetBitmap(&bm);
 pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);
 MemDC.SelectObject(pOldBitmap);
24。在单文档里打开一个位图
   a.创建单文档框架
   b.在视图类.cpp里的OnDraw(CDC* pDC)函数下加入代码
      if (GetDocument()->GetPathName()!="" )
 {
  HBITMAP bitmap;
  bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
   GetDocument()->GetPathName(),IMAGE_BITMAP,0,0,
   LR_LOADFROMFILE|LR_CREATEDIBSECTION);
  HBITMAP OldBitmap;
  CDC MemDC;
  MemDC.CreateCompatibleDC(pDC);
  CRect rect;
  GetClientRect(rect);
  OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
  pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
  MemDC.SelectObject(OldBitmap);
 }
25.控制List Box的步骤
    a.创建一个对话框框架
    b.在对话框模块里添加一个List Box控件
    c.给List Box控件创建一个Member Variables;Control IDs:IDC_LIST1;Type:CListBox,Member:m_list
    d.在对话框类.cpp 里END_MESSAGE_MAP()后面添加以下代码
          int index;
  //The TEXTMETRIC structure contains basic
  //information about a physical font.
  //LPARAM   A 32-bit value passed as a parameter to
  // a window procedure or callback function.
        bool CALLBACK  EnumFontsCallback(CONST LOGFONT *lplf,
         CONST TEXTMETRIC *lptm,
         DWORD dwType, LPARAM aFontName)
        {
   CString far * aiFontName = (CString far *) aFontName;
   index++;
   aiFontName[index]=lplf->lfFaceName;
   return TRUE;
        }

    e.在对话框类.cpp 中OnInitDialog()里添加以下代码
      
       index=-1;
 CString aFontName[MAX_PATH];
 CPaintDC dc(this);
 EnumFonts(dc.m_hDC,(LPCTSTR)NULL,(FONTENUMPROC)EnumFontsCallback,
  (LPARAM) aFontName);
 for (int i=0;i<index;i++)
  m_list.AddString(aFontName[i]);

1.创建滚动小车的步骤
   a.创建一个对话框框架
  b.在对话框类.h里添加以下代码
    int  m_yx;小车的位置
 int  m_yy;
 void DrawCar(int yx,int yy);//画小车
  c.添加WM_TIMER消息响应函数,并加如下代码
    if (nIDEvent == 99)
 {
  m_yx += 10;
  
  if (m_yx > 580)
  {
   m_yx = 30;
  }
  DrawCar(m_yx,m_yy);
 }
  d.在对话框类.cpp里OnInitDialog()函数中添加如下代码
    m_yx = 30;
 m_yy = 120;//初始化位置
 SetTimer(99,100,NULL);//设置时间参数,第一个为nIDEvent
    e.在对话框类.cpp创建DrawCar(int yx,int yy)函数,代码如下
     {
 if(yx<=0 || yy<0) return;

 this->RedrawWindow(CRect(yx-50,yy,yx+50,yy+100));
 CBrush pBrush;
 pBrush.CreateSolidBrush(RGB(10,10,10));
 CDC *pDC = GetDC();
 pDC->FillRect(CRect(yx,yy,yx+20,yy+10),&pBrush);
 pDC->FillRect(CRect(yx-10,yy+10,yx+40,yy+20),&pBrush);
 pDC->Ellipse(yx,yy+20,yx+10,yy+30);
 pDC->Ellipse(yx+20,yy+20,yx+30,yy+30);
     }

2.创建一个运行的时钟步骤
  a.创建一个单文档框架
  b.在视图类.cpp中的OnDraw(CDC* pDC)函数里加入以下代码 绘制时钟
         // 计算椭圆中心位置

 int CenterX = Rect.right/2;
 int CenterY = Rect.bottom/2;

 //取当前时间
 CTime Time = CTime::GetCurrentTime();
 CString str;
 int i,x,y;
 CSize size;
 //创建一只黄色的笔,用来 画椭圆
 CPen pen(PS_SOLID,5,RGB(255,255,0));
 //设置当前画笔,并记下以前的笔
 CPen *OldPen = pDC->SelectObject(&pen);
 // 绘制钟面椭圆
 pDC->Ellipse(5,5,Rect.right-5,Rect.bottom-5);
 double Radians;
 //设置字体颜色为红色
 pDC->SetTextColor(RGB(255,0,0));

 for (i=1; i <= 12; i++)
 {
  //格式化钟点值
  str.Format("%d",i);
//GetTextExtent method computes the width and height of a line of text using the current font to determine the dimensions
  size = pDC->GetTextExtent(str,str.GetLength());
  Radians = (double)i*6.28/12.0;//???
  // 计算钟点放置的位置
  x = CenterX - (size.cx/2) + (int)((double)(CenterX - 20)* sin(Radians));
  y = CenterY - (size.cy/2) - (int)((double)(CenterY - 20)* cos(Radians));
  //绘制钟点
  pDC->TextOut(x,y,str);
 }
 //计算时钟指示的夹角
 Radians = (double)Time.GetHour() + (double)Time.GetMinute()/60.0 +
  (double)Time.GetSecond()/3600.0;
 Radians *= 6.28/12.0;
 //创建时钟指针画笔
 CPen HourPen(PS_SOLID,5,RGB(0,255,0));
 pDC->SelectObject(&HourPen);
 //绘制时钟指针
 pDC->MoveTo(CenterX,CenterY);
 pDC->LineTo(CenterX+(int)((double)(CenterX/3)*sin(Radians)),
  CenterY - (int)((double)(CenterY/3)*cos(Radians)));

 Radians = (double)Time.GetMinute() + (double)Time.GetSecond()/60.0;
 Radians *= 6.28/60.0;
 //创建分钟指针画笔
 CPen MinutePen(PS_SOLID,3,RGB(0,0,255));
 pDC->SelectObject(&MinutePen);
 //绘制分钟指针
 pDC->MoveTo(CenterX,CenterY);
 pDC->LineTo(CenterX+(int)((double)(CenterX*2/3)*sin(Radians)),
  CenterY - (int)((double)(CenterY*2/3)*cos(Radians)));

 Radians = (double)Time.GetSecond();
 Radians *= 6.28/60.0;
 //创建秒表指针画笔
 CPen SecondPen(PS_SOLID,1,RGB(0,255,255));
 pDC->SelectObject(&SecondPen);

 //绘制秒表指针
 pDC->MoveTo(CenterX,CenterY);
 pDC->LineTo(CenterX+(int)((double)(CenterX*4/5)*sin(Radians)),
  CenterY - (int)((double)(CenterY*4/5)*cos(Radians)));
 pDC->SelectObject(OldPen);
   
  c.在视图类里添加WM_TIMER消息函数;并加入以下代码
        InvalidateRect(NULL,true);
 UpdateWindow();
    d.在视图类里添加WM_CREATE消息函数,加入以下代码
      //设置计时器 1秒发送一次时间
 SetTimer(1,1000,NULL);//1000
3.将一个窗口分成两部分;一边可以接受输入;一边显示画的图形
   a.创建一个单文档框架, 继承CEditView类;在xView.h视图类前申明一个文挡类 class xDoc;
   b.创建一个ArtView类, 继承CView类
   c.ArtView类.cpp中的OnDraw(CDC* pDC)函数里添加代码 画一个图形
        CBrush *pOldBrush=pDC->GetCurrentBrush();

 //Create a solid blue brush
 CBrush br;
 br.CreateSolidBrush(RGB(255,120,0));

 //**Select the blue brush in to the device context
 pDC->SelectObject(&br);
 pDC->Ellipse(10,10,300,300);
//Call this function to detach m_hDC (the output device context) from
//the CDC object and set both m_hDC and m_hAttribDC to NULL.
 br.Detach();

 br.CreateHatchBrush(HS_FDIAGONAL,RGB(255,255,0));
 pDC->SelectObject(&br);
 pDC->Ellipse(50,50,200,200);

 //*Restore the current brush
 pDC->SelectObject(pOldBrush);
     d.在CMainFrame类.h添加CSplitterWnd m_wndSplitter;成员类
     e.在CMainFrame类前包含ArtView类和视图类;并重载OnCreateClient()虚拟函数,加入以下代码
        if (!m_wndSplitter.CreateStatic(this,1,2))
 return false;

 //**Create two views and insert in to the splitter panes
 if (!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CSplitViewView),//CSplitViewView为视图类名
  CSize(150,100),pContext) ||
  !m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CArtView),
  CSize(150,100),pContext))
 {
  m_wndSplitter.DestroyWindow();
  return false;
 }

 //**Return successful
 return true;
     
4.安装向导的创建步骤
  a.创建一个对话框框架
  b.在ResourceView里添加三个对话框
    第一对话框里添加静态文本: 欢迎你安装本程序!请安下一步继续,如果你想放弃,请安取消按钮放弃
    第二个对话框添加 1.静态文本:请选择要添加的项  2.添加三个CheckBox控件
    第三个对话框添加 静态文本:欢迎新用户使用本软件,按完成结束安装工作
  c.以三个对话框的ID号创建三个类,都继承自CPropertyPage类
  d.创建一个MySheet类,继承自CPropertySheet类 并在头文件里添加以下代码
        #include "MyPage1.h"
 #include "MyPage2.h"
 #include "MyPage3.h"
 #define FINISH 12325
 #define NEXT 12324
 #define BACK 12323
  e.在MySheet类里添加OnInitDialog()虚拟函数,并加入以下代码:
      //为安装向导的第一页设置了Next 按钮
 SetWizardButtons(PSWIZB_NEXT);
  f.在MySheet类里添加OnCmdMsg()虚拟函数,并加入以下代码:
      //GetActiveIndexHA函数获得选项卡对话框的索引值存到iPage里!
 int iPage = GetActiveIndex();
 if (((iPage == 0)&&(nID == NEXT))||((iPage == 2)&&(nID == BACK)))
 {
  SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);
 }
 else if (iPage == 1)
 {
  if (nID == NEXT)
  {
   SetWizardButtons(PSWIZB_BACK|PSWIZB_FINISH);
  }
  else if (nID == BACK)
  {
   SetWizardButtons(PSWIZB_NEXT);
  }
 }
    g.在MySheet类.h里添加
        CMyPage1 m_Page1;
 CMyPage2 m_Page2;
 CMyPage3 m_Page3;
        MySheet();
    h.在MySheet类.cpp里添加
       MySheet::MySheet():CPropertySheet()
      {
 //添加三个选项卡到MySheet类中
 AddPage(&m_Page1);
 AddPage(&m_Page2);
 AddPage(&m_Page3);
 //为向导对话框设置风格
 m_psh.dwFlags |= PSH_WIZARD97;
      }
5.创建属性对话框的步骤      
   a.创建一个单文档框架
   b.在ResourceView里添加三个对话框
   c.第一个对话框创建一个控制它的 MySheet类,继承自CPropertySheet类
   f.在MySheet类.h中添加 以下代码
      #include "MyPage1.h"
      #include "MyPage2.h"
    public:
 CMyPage1 mypage1;
 CMyPage2 mypage2;
        CMySheet();
   g.在MySheet类.cpp中添加 以下代码
        CMySheet::CMySheet()
 {
    AddPage(&mypage1);//把各页添加到对话框中!
    AddPage(&mypage2);
 }
   d.第二个对话框创建一个控制它的 MyPage1类,继承自CPropertyPage类
      MyPage1类添加两个静态文本1.姓名选项卡,2.姓名 和一个Edit Box其ID号为IDC_NAME
      为IDC_NAME创建成员变量m_strName,类型为CString
      为IDC_NAME添加消息EN_CHANGE函数,并在函数里添加以下代码
        SetModified(true);//是 Apply按钮允许
 UpdateData(true);
   e.第三个对话框创建一个控制它的 MyPage2类,继承自CPropertyPage类
      MyPage1类添加三个静态文本1.ID选项卡,2.学号,3身份证号 和
 两个Edit Box其ID号为IDC_SNUM和IDC_PNUM
      为IDC_SNUM创建成员变量m_strSnum,类型为CString
      为IDC_PNUM创建成员变量m_strPnum,类型为CString
      为IDC_PNUM和IDC_SNUM分别添加消息添加消息EN_CHANGE函数,并在函数里添加以下代码
         SetModified(true);//是 Apply按钮允许
  UpdateData(true);
  f.在视图类里添加WM_RBUTTONDOWN消息,在其.cpp中包含#include"MySheet.h";并给消息函数加入代码
      CMySheet mysheet;
 mysheet.DoModal();
6.列表控件的使用方法
  a.创建一个单文档框架
  b.在ResourceView里添加一个对话框
  c.在一个对话框里添加List Control控件;其控件View:里选择List;Align:里选择Top;
 在添加一个静态文本其ID:为IDC_STATIC_LIST1
  d.创建八个Icon;其ID为
  e.创建一个控制对话框类xDlg;;添加一个CImageList m_imageList;类成员;
  f.创建一个控制对话框类xDlg;添加一个WM_INITDIALOG消息函数;加入代码
      HICON hIcon[8];//用于显示在List Control控件里
 int n;
//BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
 m_imageList.Create(16,16,0,8,8);
 hIcon[0] = AfxGetApp()->LoadIcon(IDI_WHITE);//IDI_WHITE为Icon的ID值
 hIcon[1] = AfxGetApp()->LoadIcon(IDI_BLACK);
 hIcon[2] = AfxGetApp()->LoadIcon(IDI_RED);
 hIcon[3] = AfxGetApp()->LoadIcon(IDI_BLUE);
 hIcon[4] = AfxGetApp()->LoadIcon(IDI_YELLOW);
 hIcon[5] = AfxGetApp()->LoadIcon(IDI_CYAN);
 hIcon[6] = AfxGetApp()->LoadIcon(IDI_PURPLE);
 hIcon[7] = AfxGetApp()->LoadIcon(IDI_GREEN);

 for (n = 0; n < 8; ++n )
 {
  m_imageList.Add(hIcon[n]);
 }

 static char *color[] = {"white","black","red","blue",
        "yellow","cyan","purple","green"};
 CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_LIST1);
 pList->SetImageList(&m_imageList,LVSIL_SMALL);//
 for (n = 0; n < 8;++n)
 {
// int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );
  pList->InsertItem(n,color[n],n);
 }
 pList->SetBkColor(RGB(0,255,255));
 pList->SetTextBkColor(RGB(0,255,255));
   g.创建一个控制对话框类xDlg;添加一个LVN_ITEMCHANGED消息函数
      CListCtrl *pList = (CListCtrl*)GetDlgItem(IDC_LIST1);
 int nSelected = pNMListView->iItem;
 if (nSelected >= 0)
 {
//GetItemText(int nItem, int nSubItem ) const函数Retrieves the text of a list view item or subitem
//If nSubItem is zero, this function retrieves the item label
// if nSubItem is nonzero, it retrieves the text of the subitem
  CString strItem = pList->GetItemText(nSelected,0);
  SetDlgItemText(IDC_STATIC_LIST1,strItem);
 }
  h.在视图类里添加WM_LBUTTONDOWN消息处理函数;在其.cpp中加#include "TestDlg.h"
       CxDlg dlg;
 dlg.DoModal();
7.更改图片显示的步骤
  a.创建一个对话框框架
  b.在Dialog显示界面里添加三个Picture控件;其ID值分别为IDC_ST_PICTURE,IDC_ST_BACK,IDC_ST_OK
     Type:都为Bitmap;并将IDC_ST_PICTURE控件的Extend styles的Transparent属性选中;
      添加Combo Box控件 ID值为IDC_COMBO_FA;Type:Drop List;Owner draw:NO;并选中
      Vertical scroll属性;添加Button控件,在styles里将Flag选中
  c.在Dialog类里添加Member Variables;IDC_COMBO_FA;Type:CComboBox Member:m_falist
    IDC_ST_BACK;Type:CStatic, Member:m_back;IDC_ST_OK;Type:CStatic,Member:m_ok;
     IDC_ST_PICTURE;Type:CStatic,Member:m_pic;
  d.在Dialog类里添加IDC_BTN_CHANGE的处理函数;代码如下
       int nSel = m_falist.GetCurSel();

 char AppPathName[100];
 GetModuleFileName(NULL,AppPathName,100);
 CString FileName=(CString)AppPathName;
 if(FileName.ReverseFind('\\')>0)
  FileName=FileName.Left(FileName.ReverseFind('\\')+1);

 switch(nSel){
 case 0:
  m_pbbrush=CreateSolidBrush(RGB(191,223,255));
  FileName = FileName + "\\Pic\\01.bmp";
  break;
 case 1:
  m_pbbrush=CreateSolidBrush(RGB(255,208,232));
  FileName = FileName + "\\Pic\\02.bmp";
  break;
 case 2:
  m_pbbrush=CreateSolidBrush(RGB(255,255,210));
  FileName = FileName + "\\Pic\\03.bmp";
  break;
 case 3:
  m_pbbrush=CreateSolidBrush(RGB(190,125,255));
  FileName = FileName + "\\Pic\\04.bmp";
  break;
 case 4:
  m_pbbrush=CreateSolidBrush(RGB(210,255,222));
  FileName = FileName + "\\Pic\\05.bmp";
  break;
 }

 HBITMAP bitmap;
 bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(), FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
 BITMAP bm;
 GetObject(bitmap, sizeof(bm), &bm);
 GetDlgItem(IDC_ST_PICTURE)->MoveWindow(CRect(10,15,bm.bmWidth,bm.bmHeight));
 m_pic.SetBitmap(bitmap);

 this->RedrawWindow();
    e.在Dialog类里添加WM_CTLCOLOR消息函数;加入代码如下
        switch(nCtlColor)
 {
  case CTLCOLOR_LISTBOX:
  case CTLCOLOR_STATIC:
  case CTLCOLOR_DLG:
  case CTLCOLOR_MSGBOX :
   pDC->SetBkMode(TRANSPARENT);
   pDC->SetTextColor(RGB(0,0,0));
   return m_pbbrush;
   break;
  default:
   return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   break;
 }   
    f.在Dialog类里OnInitDialog()函数;加入代码如下
        m_falist.AddString("方案1(蓝色)");
 m_falist.AddString("方案2(粉红色)");
 m_falist.AddString("方案3(黄色)");
 m_falist.AddString("方案4(紫色)");
 m_falist.AddString("方案5(绿色)");

 char AppPathName[100];
 GetModuleFileName(NULL,AppPathName,100);
 CString PathName=(CString)AppPathName;
 CString FileName = "";

 if(PathName.ReverseFind('\\')>0)
  PathName=PathName.Left(PathName.ReverseFind('\\')+1);
 FileName = PathName + "\\Pic\\back.bmp";
 backmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(), FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

 m_back.SetBitmap(backmap);
 GetDlgItem(IDC_ST_BACK)->MoveWindow(CRect(9,11,572,289));

 FileName = PathName + "\\Pic\\ok.bmp";
 okmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(), FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

 GetDlgItem(IDC_BTN_CHANGE)->GetWindowRect(&ret);
 ScreenToClient(&ret);
 m_ok.SetBitmap(okmap);
 GetDlgItem(IDC_ST_OK)->MoveWindow(ret);
  
   g.在Dialog类里添加WM_LBUTTONUP消息函数;加入代码如下
        if(ret.PtInRect(point))
 {
  OnBtnChange();
 }
   h.在Dialog类.h里添加以下代码
 public:
   HBRUSH  m_pbbrush;
   HBITMAP  backmap;
   HBITMAP  okmap;
   CRect  ret;
8.

posted @ 2006-12-15 20:44 九重天 阅读(2173) | 评论 (0)编辑 收藏

2006年9月22日 #

战胜visual c++必做练习50题

找了好久终于找到一个对初学VC++很有用的书籍,跟大家分享。有很好的例子,还一步一步指导你如何做!对初学者非常的好!http://download.chinaitlab.com/special/visualcebook.htm
如果进不去 那输入http://www.chinaitlab.com/ 在这个里面找找!有很多的好书!

posted @ 2006-09-22 21:04 九重天 阅读(609) | 评论 (1)编辑 收藏

2006年9月4日 #

C++ 将键盘输入的字符保存在文件

 用C++ 将键盘输入的字符保存在文件,以及如何结束输入。用了三种方法判断如何结束输入!
#include<stdio.h>
#include<stdlib.h>
//#include<conio.h>
#include<string.h>
// 显示键盘输入的值,然后保存在文件中,当按空回车则结束输入。
void main()
{
  FILE  *Ptr;
  char  Line[256];
  Ptr = fopen("d:\\1.txt", "w");
  if(Ptr)
  {
       //gets(Line)实际上返回值是Line,不存在返回NULL的情况,所以判断起不到实际作用.
   //加一个*之后,实际获得了Line首地址的内容,对于按空回车的情况,返回的是一个空串,所以Line首地址的    //内容就成了'\0',也就是ascii值0,在C语言中,0就是false,所以可以作为循环条件.
   while(*gets(Line))
    {
  fprintf(Ptr, "%s\n", Line);
    }
  }
  else
  {
   printf("can not open the file");
  }
  fclose(Ptr);

}
另一种做法
void main()
{
 FILE  *Ptr;
  char  Line[256];
  Ptr = fopen("d:\\1.txt", "w");
  if(Ptr)
  {
      //中止输入用 Ctrl+Z 或F6快捷键作为循环条件
   while(gets(Line))
    {
  fprintf(Ptr, "%s\n", Line);
   }
  }
  else
  {
   printf("can not open the file");
  }
 fclose(Ptr);

}
另一种方法
void main(void)
{
 char input[20] = {0};
//中止输入用 Ctrl+Z 或F6快捷键或按空回车作为循环条件
 while( gets(input))
 {
  if (input[0] == '\0')
  break;
  printf("input is:%s\n",input);
 }
}

posted @ 2006-09-04 20:36 九重天 阅读(1496) | 评论 (0)编辑 收藏

2006年9月2日 #

C++基础问题

1。如果C函数的参数为空,其原形必须含关键字void,而c++可有可无!
2。函数之所以可以能递归,是因为每个函数被调用时,都会把参数和其他的局部对象复制到一块专用的内存区域,而且同一个函数的每一个执行进程都有一个单独的复制
3。exter "c"
{                              // 这是个连接说明
 #include "mychdr.h"  // 告诉c++ 库 这是个用C编译的函数
}
4。C++采用名字重组技术,给编译器内部的函数标识符重命名,重组的函数名包含了指定函数的返回植类型和参数类型的符号!
5。自动储存的类型修饰符指定一个局部变量是自动的,即每次执行到定义该变量的语句块时,都将为该变量在内存中产生一个新的副本,并对其进行初始化。
6。静态储存类型初始化值只在语句块第一次执行时其作用,在随后的运行过程中,变量将保持语句块上一次执行的值!
7。static 储存类型修饰符使得函数和变量的标识符对于连接到同一个程序的其他源代码文件而言是不可见的。
8。寄存器变量的地址是无法取得的,因为大多数计算机的硬件寄存器都不占内存地址。
9。C++程序中,默认情况下,函数的所有参数都是以传值方式,即把实参的一个副本复制到被调用函数的形参中。
10。在编译器内部,用一个字符数组来表示字符串常量,对字符串的使用实际上就是在引用它的内部地址,所以把字符串给字符型指针实际上就是把常量的地址赋给指针!
11。当函数的形参是指向非const 型变量的指针时,不能用const型变量的地址做形参!
12。任何地址都可以赋值给void 型指针,C++允许任何类型的指针自动转换成 void型!
13。typedef 的作用是给一个已存在的类型起个别名!
14。指针是储存地址的变量,地址是相对较小的数据单元(在32机系统中占四个字节)它储存另一个数据的地址!
15。# undef 预处理指令使得以定义的宏在以后的代码中无效!
16。不带参数或所有参数都有默认值的构造函数叫做默认构造函数,实例化对象数组必须有默认的构造函数;如果类中之少有一个构造函数,编辑器将不在提供默认的构造函数!
17。静态成员只能在类中申明,必须在类外定义,并且静态成员只能存在唯一一个实例,即使没有任何类的实例,静态成员也是已经存在的,类的所有实例都可以使用他,他属于整个类!
18。静态成员函数与一般成员函数的区别:静态成员函数没有this指针,因此他无法访问非静态成员!一般的成员函数隐含this指针
19。初始化和赋值的区别是:初始化是创建一个新的对象,然后用已有的的对象去初始化,赋值是两个都存在的对象!
20。常量数据成员和引用数据成员必须使用构造函数的参数初始化表来初始化,而不能赋值!
21。对象被申明为常量,那么该对象就不可以调用类中任何非常量型的成员函数。
22。mutable 修饰符申明的数据成员,这样一个常量型的成员函数就可以修改它的值!
23。class member以他们在class 内的申明次序来初始化和他们在member initialization list 中出现的次序无关!
24。string &operation =(const string & rhs);// 意思是将一个常 string  指定给另一个string 
25。string &operator =(const char *rhs);//意思是将一个常 char * 指定给一个string 
26。避免传回内部数据的handls;
27。public继承是一种( isa),所以任何事情只要对base class  而言是真,就一定对其 derived class  为真。
28。纯虚函数的两个接口,他们必须被任何“继承了他们”的子类重新申明,他们在抽象类中通常没有定义!
29。纯虚函数的申明主要是为了让derived class 继承函数的接口;
         虚函数的申明主要是为了让derived class 继承函数的接口及其缺省行为
        成员函数(非虚)的申明主要是为了让derived class 继承函数的实现,表示在 derived  class 中希望不要有不同的行为,即不要重新定义继承而来的非虚成员函数!
30。绝对不要重新定义继承而来的参数值,因为虚拟函数系动态绑定,而缺省参数却是静态绑定的!
31。对象的静态型别是程序申明它时所采用的型别。对象的动态型别是指对象目前所代表的型别,表现出一个对象的行为模式!
40:getlin(s,bufsize)表示读取bufsize-1个字符给s如果遇到换行符就停下来,添加一个空字节,丢弃换行符!
41。编辑器将空白字符默认为分隔符。
42。不允许重载系统中预定义的操作,因此重载操作中至少有个操作数是用户自定义类型!
43。全局const申明默认情况下是内部连接,而在c 中他们是外部连接,如果希望一个const 对象具有外部连接特性,就必须使用关键字“extern”
44.除了寄存器变量以外,程序中的所有对象都存在内存中的。
45。在c++中给void型指针赋值时,不用强制类型转换是一种错误!
46数组名对应着一块内存 其地址与容量在生存周期内不变
C++没有办法知道指针所指的内存容量,除非在申请时记住他。
注意当树组作为函数的参数进行传递时,该树组退化为同类型的指针
void Func(char a[100]) 

   // 4字节而不是100字节 
   cout<< sizeof(a) << endl;
 
}
编译器总要为函数的每个参数制作临时的副本,
引用被创建的同时必须被初始化,
引用必须与合法的储存单元关联
一旦引用被初始法,就不能改变引用的关系
int *p=(int *)malloc(10);表示p指向堆内存,但是p 本身是在栈中的
不要用return 语句返回指向“栈内存”的指针,因为该内存在函数结束时就自动消亡了。
使用free 或delete 释放内存后,并没有将指针设置成NULL,导致产生“野指针”。所以用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
char *p = "hello world";表示将字符串赋给指针。常量字符串赋,位于静态储存区。
char *p = (char *) malloc(100); 
strcpy(p, “hello”); 
free(p);   
 // p 所指的内存被释放,但是p所指的地址仍然不变 … if(p != NULL) // 没有起到防错作用

// 出错  
strcpy(p, “world”); 
如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告申请失败。
exit(1)终止整个程序的运行
如果用new创建对象树组,那么只能使用对象的无参构造函数
对比于C语言的函数,C++增加了重载(overload) 内联 (inline) const virtual四种新机制
注意并不是两个函数的名字相同就能构成重载,全局函数和类的成员函数同名不算重载,因为他们的作用域不同
成员函数的重载和覆盖
成员函数被重载的特征
在同一个类中
函数名字相同
参数不同
virtual  关键字可有可无,
覆盖的特征
不同的范围(分别位于派生类与基类中)
函数名字相同
参数相同
基类函数必须有virtual 关键字
如果派生类的函数与基类的函数同名,但参数不相同,此时,无论有无virtual 关键字,基类的函数将被隐藏(注意与重载混淆)
如果派生类的函数与基类的函数名相同,并且参数也相同,但是基函数没有virtual  关键字,此时,基类的函数被隐
藏(注意与覆盖混淆)
参数缺省值只能出现在函数的申明中,而不能出现在定义体中
如果函数有多个参数,参数只能从后向前缺省,
如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。
 如果运算符被重载为类的成员函数,那么一元运算符没有参数,二元运算符只有一个右侧参数,因为对象自己成了左侧参数。
一个类只有一个析构函数和一个赋值函数,但是可以有多个构造函数
构造函数与析够函数与类名同名,没有返回值类型。
构造函数的初始化表的使用规则
如果类中存在继承关系,派生类必须在其初始化






 

posted @ 2006-09-02 15:07 九重天 阅读(488) | 评论 (0)编辑 收藏

2006年9月1日 #

very thing I do I do it for you

记住:人生的每个快乐瞬间!
c++常见的面试问题,
1。public,private,protected的主要区别:
public:外部都可见;
private:只有成员函数才可见,其他的都不可见。
protected:成员函数可见,继承的类对象也可见;其他的不可见!
2。static成员函数与一般成员函数的区别:
static成员函数没有(this指针),静态成员函数是类的一部分,而非对象的一部分。可以通过class::function方式调用,不用生成实例
一般的成员函数隐含有(this指针),一般的成员函数是对象的一部分。    必须要有类生成实例才能调用。
3。strlen(const char *)  与sizeof()的区别
   * sizeof是算符,strlen是函数
  **.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned       int   类型该类型保证能容纳实现所建立的最大对象的字节大小。
  ***sizeof可以用类型做参数,strlen只能用char*做参数,且必须 是 以''\0''结尾的。sizeof还可以用函数做参数 
   ****数组做sizeof的参数不退化,传递给strlen就退化为指针了
   *****sizeof在编译的时候就把计算过了,strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小
******sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数
##当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
例如:
    short f();   printf("%d\n", sizeof(f()));结果为2
.     chr str[10];.     
   //strlen只能用char*做参数,且必须 是 以''\0''结尾的
    
cout<<strlen(str)<<endl; 结果是13.错误
     cout<<sizeof(str)<<endl;结果是10;对
   char str[20]="0123456789";]
//
strlen 计算字符串的长度,以''\0''结尾
   int a=strlen(str); //a=10;
//
sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。  
   int b=sizeof(str); //而b=20;
char* ss = "0123456789";
//ss是指向字符串常量的字符指针,sizeof 获得的是一个指针所占的空间,应该是长整型的所以是4
 int b=sizeof(ss); //b=4
//
》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的所以是1
int b=sizeof(*ss) //b=1
int a=strlen(ss)//a=10



 

posted @ 2006-09-01 17:12 九重天 阅读(317) | 评论 (0)编辑 收藏

仅列出标题  

My Links

Blog Stats

News

常用链接

留言簿(1)

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜