分享
 
 
 

VC++初学者常见问题解惑

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

VC++初学者常见问题解惑

李海

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取消息时,其它程序将有机会获得控制权,可以实现DoEvents的效果。但要注意这个函数返回值的含义,如果该函数返回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文件,而是在函数定义前加__declspec(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 );

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有