
2008年3月8日
Visual Assist X 1626 crack 下载地址是
http://www.cppblog.com/Files/free2000fly/VA_X_1626.zip
posted @
2008-03-08 16:07 free2000fly 阅读(407) |
评论 (3) |
编辑 收藏
原文网址: http://blog.csdn.net/classfactory/archive/2004/08/29/87749.aspx
C++ 中的枚举类型继承于 C 语言。就像其他从 C 语言继承过来的很多特性一样,C++ 枚举也有缺点,这其中最显著的莫过于作用域问题——在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举类型。例如下面的示例:
enum FileAccess {
Read = 0x1,
Write = 0x2,
};
FileAccess access = ::Read; // 正确
FileAccess access = FileAccess::Read; // 错误
C++枚举的这个特点对于习惯面向对象和作用域概念的人来说是不可接受的。首先,FileAccess::Read 显然更加符合程序员的直觉,因为上面的枚举定义理应等价于如下的定义(实际上,.NET 中的枚举类型便是如此实现的):
class FileAccess {
static const int Read = 0x1;
static const int Write = 0x2;
};
其次,这导致我们无法在同一个作用域中定义两个同样名称的枚举值。也就是说,以下的代码是编译错误:
enum FileAccess {
Read = 0x1,
Write = 0x2,
};
enum FileShare {
Read = 0x1, // 重定义
Write = 0x2, // 重定义
};
如果这一点没有让你恼怒过的话,你可能还没写过多少 C++ 代码 :-)。实际上,在最新的 C++0x 标准草案中有关于枚举作用域问题的提案,但最终的解决方案会是怎样的就无法未卜先知了,毕竟对于象 C++ 这样使用广泛的语言来说,任何特性的增删和修改都必须十分小心谨慎。
当然,我们可以使用一些迂回的方法来解决这个问题(C++ 总是能给我们很多惊喜和意外)。例如,我们可以把枚举值放在一个结构里,并使用运算符重载来逼近枚举的特性:
struct FileAccess {
enum __Enum {
Read = 0x1,
Write = 0x2
};
__Enum _value; // 枚举值
FileAccess(int value = 0) : _value((__Enum)value) {}
FileAccess& operator=(int value) {
this->_value = (__Enum)value;
return *this;
}
operator int() const {
return this->_value;
}
};
我们现在可以按照希望的方式使用这个枚举类型:
FileAccess access = FileAccess::Read;
并且,因为我们提供了到 int 类型的转换运算符,因此在需要 int 的地方都可以使用它,例如 switch 语句:
switch (access) {
case FileAccess::Read:
break;
case FileAccess::Write:
break;
}
当然我们不愿意每次都手工编写这样的结构。通过使用宏,我们可以很容易做到这一点:
#define DECLARE_ENUM(E) \
struct E \
{ \
public: \
E(int value = 0) : _value((__Enum)value) { \
} \
E& operator=(int value) { \
this->_value = (__Enum)value; \
return *this; \
} \
operator int() const { \
return this->_value; \
} \
\
enum __Enum {
#define END_ENUM() \
}; \
\
private: \
__Enum _value; \
};
我们现在可以按如下的方式定义前面的枚举,并且不比直接写 enum 复杂多少。
DECLARE_ENUM(FileAccess)
Read = 0x1,
Write = 0x2,
END_ENUM()
DECLARE_ENUM(FileShare)
Read = 0x1,
Write = 0x2,
END_ENUM()
posted @
2008-03-08 15:04 free2000fly 阅读(92) |
评论 (0) |
编辑 收藏
使用 ADO 编制数据库程序
最近正在使用 ADO 编制数据库程序, 找好的资料比较困难, 找到比较好的
[1] snoopy每日一译-完美的ADO http://www.vcer.net/1076417661402.html
[2] snoopy每日一译-完美的ADO[2](上) http://www.vcer.net/2005.html
[3] snoopy每日一译-完美的ADO[2](中) http://www.vcer.net/2014.html
[4] snoopy每日一译-完美的ADO[2](下) http://www.vcer.net/2027.html
原文链接在这里:
ADO is AOK (a simple ADO tutorial) http://www.codeguru.com/cpp/data/mfc_database/ado/article.php/c1141/
ADO is AOK - Part II http://www.codeguru.com/cpp/data/mfc_database/ado/article.php/c1157/
相关的, 在 VB 和 C 之间传递数组的文章, 在这里 http://support.microsoft.com/kb/207931/en-us
传递字节数组的方法, 在这里 http://support.microsoft.com/kb/154172/en-us
方便查阅
posted @
2008-03-08 15:01 free2000fly 阅读(63) |
评论 (0) |
编辑 收藏
要实现一个将 IP 地址控件的 disabled 状态, 但是 Windows 的实现就没有将控件的颜色灰掉,
M$ 真是的, 最后一步懒得弄了, 我只好自己弄咯. 下面是我的WTL,实现代码. BTW, 这个控件在
动态改变大小时, 里面的四个 EDIT 的大小没跟着改变, 我也懒得弄了 ;-)
#ifndef __ATL_GRAY_IP_ADDR_CTRL_H__
#define __ATL_GRAY_IP_ADDR_CTRL_H__
#pragma once
#include <vector>
#ifndef ARRAYSIZE
#define ARRAYSIZE( x ) (sizeof(x)/sizeof((x)[0]))
#endif // !defined(ARRAYSIZE)
namespace WTL {
class CGrayIPAddrCtrlImpl : public CWindowImpl<CGrayIPAddrCtrlImpl, CIPAddressCtrl>
{
typedef CWindowImpl<CGrayIPAddrCtrlImpl, CIPAddressCtrl> baseClass;
public:
BEGIN_MSG_MAP_EX(CGrayIPAddrCtrlImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_SIZE, OnSize)
END_MSG_MAP();
CGrayIPAddrCtrlImpl() : m_uFourTimes(0)
{ }
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
uMsg, wParam, lParam, bHandled;
m_vecEdit.clear();
::EnumChildWindows(m_hWnd, EnumChildProc, (LPARAM)this);
bHandled = FALSE;
return S_OK;
}
static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
CGrayIPAddrCtrlImpl *pThis = reinterpret_cast<CGrayIPAddrCtrlImpl *>(lParam);
CEdit wndEdit(hwnd);
if (pThis->m_uFourTimes < 4)
{
wndEdit.SetReadOnly();
pThis->m_uFourTimes ++;
}
RECT rc = { 0 };
wndEdit.GetClientRect(&rc);
wndEdit.ClientToScreen(&rc);
pThis->m_vecEdit.push_back(rc);
ATLTRACE("======================EnumChildProc==%d==%d==%d===================\n",
pThis->m_vecEdit.size(), rc.left, rc.right);
return TRUE;
}
BOOL SubclassWindow(HWND hWnd)
{
BOOL bReturn = baseClass::SubclassWindow(hWnd);
if (bReturn) {
m_vecEdit.clear();
::EnumChildWindows(m_hWnd, EnumChildProc, (LPARAM)this);
}
return bReturn;
}
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
uMsg, wParam, lParam, bHandled;
TCHAR szText[MAX_PATH];
GetWindowText(szText, ARRAYSIZE(szText));
CRect rc;
CPaintDC dcMem(m_hWnd);
GetClientRect(rc);
COLORREF crBack = GetSysColor(COLOR_BTNFACE);
::SetBkColor(dcMem, crBack);
::ExtTextOut(dcMem, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
{
DWORD dwFlags = DT_CENTER;
DWORD dwStyle = GetExStyle();
COLORREF crOldBk = 0xFFFFFFFF;
UINT nOldMode = (UINT)-1;
if (dwStyle & WS_EX_TRANSPARENT) {
nOldMode = dcMem.SetBkMode(TRANSPARENT);
} else {
crOldBk = dcMem.SetBkColor(crBack);
}
TCHAR szDot[] = _T(".");
RECT rcTemp;
std::vector<RECT>::reverse_iterator it;
for(it=m_vecEdit.rbegin(); it!=m_vecEdit.rend(); it++)
{
std::vector<RECT>::reverse_iterator itNext = it+1;
if (itNext != m_vecEdit.rend())
{
rcTemp.top = it->top;
rcTemp.bottom = it->bottom;
rcTemp.left = it->right;
rcTemp.right = itNext->left;
ScreenToClient(&rcTemp);
dcMem.DrawText(szDot, _tcslen(szDot), &rcTemp, dwFlags);
}
}
if (dwStyle & WS_EX_TRANSPARENT) {
dcMem.SetBkMode(nOldMode);
} else {
dcMem.SetBkColor(crOldBk);
}
}
return S_OK;
}
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
uMsg, wParam, lParam, bHandled;
m_vecEdit.clear();
::EnumChildWindows(m_hWnd, EnumChildProc, (LPARAM)this);
bHandled = FALSE;
return S_OK;
}
UINT m_uFourTimes;
std::vector< RECT > m_vecEdit;
};
}; // namespace WTL
#endif // __ATL_GRAY_IP_ADDR_CTRL_H__
posted @
2008-03-08 14:51 free2000fly 阅读(72) |
评论 (0) |
编辑 收藏
虚拟机与本机通讯的设置
(一) 在没有网卡或者网卡没有联网的情况下
1. 虚拟机的网卡选项: NAT:Used to share the host's IP address
2. 打开 Host 主机的 "网络连接", 查看 "VMware Network Adapter VMnet8" 的属性, 记下其 IP 地址, 如 "192.168.73.1"
3. 启动运行虚拟机后, 打开虚拟机的 "网络连接", 填写 "TCP/IP 协议" 的地址, 子网掩码, 默认网关, DNS 服务器等四项与 "192.168.73.1" 能正常通讯, 如 IP 为 "192.168.73.232", 掩码为 "255.255.255.0", 网关和 DNS 服务器都必须为 "192.168.73.1"
(二) 在网卡联网的情况下
1. 虚拟机的网卡选项: Bridged:Connected directly to the physical network
2. 启动运行虚拟机后, 打开虚拟机的 "网络连接", 填写 "TCP/IP 协议" 的地址, 子网掩码, 默认网关, DNS 服务器等四项与本地局域网能正常通讯.
posted @
2008-03-08 14:48 free2000fly 阅读(72) |
评论 (0) |
编辑 收藏