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);
说明:这种方法打开的软键盘,必须先打开某个输入法,即软键盘是基于输入法的。
而且无法更多的控制软键盘,比如移动软键盘的位置。
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
}