FAQ1: VC7中,如何在非MFC中如何使用CString
-- 包含標頭檔 atlstr.h 即可,需要用到ATL
FAQ2: 檢查某鍵是否被按下
-- if( GetKeyState(VK_LSHIFT) < 0 ) 表示被按下
FAQ3: 隱藏對話方塊
-- 當你使用有強制回應對話方塊時最開始是無法隱藏視窗的,而只能在對話方塊顯示後再隱藏視窗,所以這會造成螢幕的閃爍。一個解決辦法就是採用無模式的對話方塊,
無模式的對話方塊在建立後是隱藏的,直到你調用ShowWindow(SW_SHOW)才會顯示
其實可以用一種方法隱形模式對話方塊:
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, WS_EX_TOOLWINDOW);
::MoveWindow(AfxGetMainWnd()->m_hWnd,0,0,0,0,FALSE);
要建立對話方塊時不在工作列顯示按鈕:
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW, SWP_DRAWFRAME);
FAQ4: 在源檔案中定位游標到對稱的#if, #endif,使用Ctrl+K.
FAQ5: 手工編譯純資源成dll
-- Rc.exe /v data.rc
Cvtres.exe /machine:ix86 data.res
Link /SUBSYSTEM:WINDOWS /DLL /NOENTRY data.res ;編譯成DLL檔案
這種方式建立的DLL是最小的,比起你用Win 32 Dynamic Libray等產生的更小。
FAQ6: 如何在OLE_COLOR與COLOR之間轉換
-- OLE_COLOR ocBack = GetBackColor();
// Convert OLE_COLOR to COLORREF
COLORREF clrBack = OleTranslateColor(ocBack);
// Convert COLORREF to OLE_COLOR
OLE_COLOR ocConverted = (OLE_COLOR)clrBack;
FAQ7: Win98不能使用的UNICODE字元處理函數
-- lstrcpyW - 取代函數:ATL提供的ocscpy
CharNextW - 取代函數: ATL提供的CharNextO
Win98和2000都可以使用的:
lstrlenW
C運行庫內處理UNICODE的函數(即以wcs開頭的)
FAQ8: WM_NCCALCSIZE訊息
-- 當視窗的位置和大小發生改變時,視窗會收到此訊息。通過處理此訊息,程式可以控制視窗客戶區的大小。
fCalcValidRects = (BOOL) wParam; 有效地區標誌
lpncsp = (LPNCCALCSIZE_PARAMS) lParam; // size calculation data 或
lpncsp = (LPRECT) lParam; // new window coordinates
wParam為真表示程式應該指定視窗客戶區有效部分。
當wParam為真時,lParam是指向一個NCCALCSIZE_PARAMS結構的指標。這個結構包含程式可以計算視窗客戶區大小和位置的
資訊。當wParam為假時,lParam指向一個RECT結構指標,該結構在處理前包含原本視窗客戶區的地區,在返回前,可以
修改這個結構的值以表示視窗客戶區的螢幕地區。
詳細可以參考VCKBASE的:http://www.vckbase.com/document/viewdoc/?id=1302#建立客戶視窗
註:當視窗大小改變時,在處理該訊息時,調用GetWindowRect不能得到改變後的視窗大小!!
處理訊息時的RECT是基於螢幕座標
FAQ9: 重載下標操作符 [] 的正確方法
-- 重載下標操作符 [] 是很常見的事情,它儲存類中元素的順序。vector 和 string 就是這樣的類。在重載操作符[]時,一定要記住定義它的兩個版本:非常量版本和常量版本:
class MyString
{
private:
char * buff;
int size;
public:
//...
char& operator [] (int index) { return buff[index]; } // 非常量版本
const char& operator [] (int index) const { return buff[index]; } // 常量版本
};
當對象本身是常量時,下標操作符的常量版本被調用。
void f(const MyString& str)
{
char c = str[0]; // 調用const char& operator [] (int index) const
}
FAQ10: 如何開啟軟鍵盤
-- // m_hWnd 是接受軟鍵盤輸入的視窗控制代碼
ImmSimulateHotKey(m_hWnd, IME_CHOTKEY_IME_NONIME_TOGGLE);
HIMC hIMC = ImmGetContext(m_hWnd);
DWORD dwConv, dwSent;
DWORD dwTemp;
ImmGetConversionStatus(hIMC,&dwConv,&dwSent);
//dwConv |= IME_CMODE_SOFTKBD;
if (dwConv & IME_CMODE_SOFTKBD)
dwConv &= ~IME_CMODE_SOFTKBD;
else
dwConv |= IME_CMODE_SOFTKBD;
ImmSetConversionStatus(hIMC,dwConv,dwSent);
ImmReleaseContext(m_hWnd,hIMC);
說明:這種方法開啟的軟鍵盤,必須先開啟某個IME,即軟鍵盤是基於IME的。
而且無法更多的控制軟鍵盤,比如移動軟鍵盤的位置。
FAQ11: 如何檢查是否串連到網路
-- DWORD dwFlag = 0 ;
if( !InternetGetConnectedState( &dwFlag , 0 ) )
{
// 無法串連到網路
}
如果函數成功返回,dwFlag可以獲得當前網路的類型,如LAN或撥號
FAQ12: Tree Ctrl 的check box為什麼不能工作?
-- 即使設定了TVS_CHECKBOXES風格,在WM_INITDIALOG裡調用 SetCheck(true) 仍然沒有出現預期的效果,(WTL下用SetCheckState)。原因可能是 WM_INITDIALOG 時,狀態表徵圖沒有被載入,雖然設定了狀態,但沒有顯示出來。解決方案,在調用 SetCheck 前先調用下面兩行代碼:
Tree.ModifyStyle( TVS_CHECKBOXES, 0 ) ;
Tree.ModifyStyle( 0 , TVS_CHECKBOXES ) ;
FAQ13: check box風格的Tree Ctrl 如何響應使用者點擊check box的訊息?
-- NM_CLICK , 代碼如下:
CPoint pt;
GetCursorPos(&pt);
pTree->ScreenToClient(&pt);
UINT flag;
HTREEITEM hItem = pTree->HitTest(pt,&flag);
if( hItem && flag == TVHT_ONITEMSTATEICON )
{
// 滑鼠點擊了 check box
}