精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>C、C++语言基础>>学习方法--------仙人指路>>VC++初学者常见问题解惑

主题:VC++初学者常见问题解惑
发信人: chenjz()
整理人: kevintz(2000-10-25 16:16:33), 站内信件
                  VC++初学者常见问题解惑
(作者:李海 2000年07月25日 12:24)

  Visual C++是功能非常强大的工具,但也是公认比较难于入门的。这里,我
们整理了一些初学者常见的问题,希望帮助那些刚刚接触Visual C++的朋友享受
编程的乐趣。 

  问:我是一新手,请问我以前在TC++中写的C++程序,在VC中要建立一个什么
样的工程来运行它(程序在TC++是正确的)? 

   

  答:在VC++中新建工程时,你可以选择Win 32 Console Application。这种
控制台程序像DOS程序一样工作并输出文本信息,虽然不能使用图形函数,但可以
使用其它Windows API函数。要注意的是,如果你的TC++程序使用了非ANSI标准的
语句,如Conio.h中的函数,可能需要进行一些修改才能在VC++下编译。 

   

  问:VC中有没有类拟DoEvents的函数? 

   

  答:你可以使用这样的函数: 

  BOOL CheckMessageQueue() 

  {    MSG msg; 

       while(PeekMessage(&&msg, NULL, 0, 0, PM_REMOVE)){ 

     if(msg.message==WM_QUIT) 

         return FALSE; 

       TranslateMessage(&&msg); 

       DispatchMessage(&&msg); 

      } 

      return TRUE; 

  } 

  调用PeekMessage取消息时,其它程序将有机会获得控制权,可以实现DoEve
nts的效果。但要注意这个函数返回值的含义,如果该函数返回FALSE,说明用户
按下了关闭按钮。 

   

  问:在不拷贝文件的情况下,如何在C/C++中去掉文件尾部,也就是快速剪短
文件? 

   

  答:在C/C++中,一般都有一个函数chsize或_chsize可以改变文件的大小。
下面是一段例子: 

   int fh, result; 

   unsigned int nbytes = BUFSIZ; 

   /* 打开文件 */ 

   if( (fh = _open( "c:\\testdata", _O_RDWR | _O_CREAT, _S_IREAD 

         | _S_IWRITE )) != -1 ) 

   { printf( "修改前文件长度: %ld\n", _filelength( fh ) ); 

     if( ( result = _chsize( fh, 329678 ) ) == 0 ) 

  printf( "成功地修改了文件长度\n" ); 

     else 

    printf( "改变文件长度出错\n" ); 

     printf( "修改后文件长度: %ld\n", _filelength( fh ) ); 

     _close( fh );}} 

   

  问:使用VC5.0将OBJ文件编译成DLL后,用VB调用时总说找不到入口点。请问
在什么地方加入关于入口点的参数? 

   

  答:找不到入口点有以下几种情况: 

  1.没有注意函数名的大小写 

    在Win32中,DLL中的函数和VB中的函数必须大小写完全相同,否则系统
认为DLL中没有要调用的函数。 

  2.没有声明入口函数 

    你需要在DLL的.def文件中加上入口函数,如: 

   EXPORTS 

   SetData @1 

   GetData @2 

  这样VB程序就可以访问SetData和GetData函数了。其中@1、@2是这两个函数
的引用序号,通常在VB中不使用。如果你的DLL工程原本没有使用.def文件,你可
以建立一个文本文件,并命名为.def扩展名存盘后加入到工程中。 

  3.采用了C++编译方式 

    在C++中编译函数时会将函数名进行转换,如将DLL中的kk(double k)转
换为_kk@8。解决的办法有两种: 

  (1)如果没有使用C++的类,可以将.cpp文件改名为.c,就不进行这种转换
了。 

  (2)在函数定义前加上extern "c",如: 

  extern "c" void _stdcall kk(double k); 

    需要指出的是,VC++允许不编写.def文件,而是在函数定义前加__decl
spec(dllexport)修饰符,这样的函数也可以被外部程序调用。但是这样的函数都
将会按C++方式进行函数名转换。虽然这样的函数可以被VB程序调用,但显得不方
便,所以仍然建议使用.def文件的办法。 

   

  问:使用VC++ 5.0,如何在程序中设置按下Caps Lock 键,使得使用者在某
Edit框里输入的字母自动为大写,输入后设置该键再按下,即恢复输入小写字母
状态。 

   

  答:利用Windows API函数keybd_event可以模拟按下Caps Lock 键。下面的
代码能够切换Caps Lock 键。 

  void SetCapsLock( BOOL bState ) 

   { 

     BYTE keyState[256]; 

     GetKeyboardState((LPBYTE)&&keyState); 

     if( (bState &&&& !(keyState[VK_CAPITAL] && 1)) || 

       (!bState &&&& (keyState[VK_CAPITAL] && 1)) ) 

     { 

     // 模拟按下一个键 

       keybd_event( VK_CAPITAL, 

             0x45, 

   KEYEVENTF_EXTENDEDKEY | 0, 

             0 ); 

     // 模拟放开一个键 

       keybd_event( VK_CAPITAL, 

             0x45, 

  KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 

             0); 

     } 

   } 

  // 当用户切换到Edit1控件,设置为大写状态 

  void CDlgDlg::OnSetfocusEdit1() 

  {SetCapsLock(TRUE);} 

  // 当用户离开Edit1控件,设置为小写状态 

  void CDlgDlg::OnKillfocusEdit1() 

  { SetCapsLock(FALSE);} 

  不过对于你的问题,我建议采用另一种方法,即重载PreTranslateMessage函
数,用户每输入一个字母就将其自动转换为大写,而不是修改Caps Lock 键,如
: 

  BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg) 

  { if(pMsg-〉message == WM_CHAR 

   &&&& pMsg-〉hwnd == ::GetDlgItem(m_hWnd, IDC_EDIT1)) 

   { pMsg-〉wParam = toupper(pMsg-〉wParam);} 

   return CDialog::PreTranslateMessage(pMsg); 

  } 

   

  问: 如何编程实现Windows关机的那个对话窗口?就是说,如果我按一个按钮
,就可以出现关机对话窗口,让我选择是否关机、重启等等?而且背景也是那样
的灰暗。是否有一个现成的API可以调用? 

   

  答:有一个未公开的API函数可以实现这个功能,是在Shell32.dll中,但没
有名字,索引号为60。这种函数可以使用LoadLibrary和GetProcAddress函数进行
调用。 

  下面就是一个例子: 

  typedef int (CALLBACK *SHUTDOWNDLG) (int); 

  void CDlgDlg::OnOK() { 

   CString s; 

   HINSTANCE hInst = LoadLibrary("shell32"); 

   SHUTDOWNDLG SHShutDownDialog; 

   if(hInst != 0) 

   { 

   // 获得显示关机对话框函数的地址并调用 

   SHShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst, (LPSTR)60);
 

   (*SHShutDownDialog)(0); 

   FreeLibrary(hInst); 

   } } 

   

  问:在VC中有无方法可以像VFP一样加减日期,从而得出它们之间的时间差值
? 

   

  答:可以使用CTime类来表示日期,如: 

  CTime t1( 1999, 3, 19, 22, 15, 0 ); // 1999年3月19日22:15 

  CTime t2( 1999, 3, 20, 22, 15, 0 ); // 1999年3月20日22:15 

  CTimeSpan ts = t2 - t1; 

  // 对两个日期变量相减,差值保存在CTimeSpan变量中 

  ASSERT( ts.GetTotalSeconds() == 86400L ); 

--
我能翻译善写作熟电脑会说话可是为什么没工作?

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.143.97.141]

[关闭][返回]