VC++初學者常見問題解惑 (轉)
VC++初學者常見問題解惑
李海
Visual C++是功能非常強大的工具,但也是公認比較難於的。這裡,我們整理了一些初學者常見的問題,希望幫助那些剛剛接觸Visual C++的朋友享受的樂趣。
問:我是一新手,請問我以前在TC++中寫的C++,在VC中要建立一個什麼樣的工程來執行它(程式在TC++是正確的)?
答:在VC++中新建工程時,你可以選擇Win 32 Console Application。這種控制檯程式像DOS程式一樣工作並輸出文字資訊,雖然不能使用圖形,但可以使用其它 函式。要注意的是,如果你的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( "修改前檔案長度: %ldn", _filelength( fh ) );
if( ( result = _chsize( fh, 329678 ) ) == 0 )
printf( "成功地修改了檔案長度n" );
else
printf( "改變檔案長度出錯n" );
printf( "修改後檔案長度: %ldn", _filelength( fh ) );
_close( fh );}}
問:使用VC5.0將OBJ檔案編譯成DLL後,用VB呼叫時總說找不到入口點。請問在什麼地方加入關於入口點的引數?
答:找不到入口點有以下幾種情況:
1.沒有注意函式名的大小寫
在中,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函式可以實現這個功能,是在32.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 );
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-998616/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP初學者常見問題集PHP
- C語言初學者常見問題與錯誤C語言
- Linux系統初學者的常見問題解決集結(轉)Linux
- React + Typescript領域初學者的常見問題和技巧ReactTypeScript
- 常見Kotlin高頻問題解惑Kotlin
- 【azure】122個常見問題收集整理(FLASH初學者參見)
- Oracle初學者問題9(轉)Oracle
- Oracle初學者問題8(轉)Oracle
- Oracle初學者問題7(轉)Oracle
- Oracle初學者問題6(轉)Oracle
- Oracle初學者問題5(轉)Oracle
- Oracle初學者問題4(轉)Oracle
- Oracle初學者問題3(轉)Oracle
- Oracle初學者問題1(轉)Oracle
- Oracle初學者問題2(轉)Oracle
- 為Linux初學者答疑解惑Linux
- 初學者問題一
- 初學者Jpetstore問題?
- go語言初學者常見錯誤Go
- 初學python的常見問題Python
- [Shell] awk初學之常見問題
- c++ 中vector 常見用法(給初學者)C++
- 【轉】oracle初學者100問Oracle
- Java初學者有問題求教Java
- 程式語言初學者“介面作用”例項解惑
- vi 命令常見問題解答(轉)
- Java常見問題集錦(轉)Java
- Windows 98 常見問題解答(轉)Windows
- C 語言常見問題(轉)
- 初學者想問一個RMI問題
- 初學者 (轉)
- 模仿例子出現問題--初學者
- 初學者學Java常遇到的問題,我都給你回答了!Java
- DirectX 8 開發者常見問題集 (轉)
- 專案管理常見問題解答(轉)專案管理
- XML入門常見問題(3)(轉)XML
- XML入門常見問題(2)(轉)XML
- XML入門常見問題(1)(轉)XML