2011年2月21日 星期一

將 data(struct) 寫到Registry。

1. Set

    HKEY hkFolder;
    DWORD dwDisposition = REG_CREATED_NEW_KEY;

    if(!m_vctNode.empty()) m_vctNode.clear();

    if (ERROR_SUCCESS == ::RegCreateKeyEx(HKEY_CURRENT_USER, REGISTSUBFOLDER, NULL,  _T("NODEITEM"),
                           REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkFolder, &dwDisposition))
    {
        DWORD nSize = vctpNode.size();
        NODEITEM * pNode = new NODEITEM[nSize];
        for(int i=0;i<vctpNode.size();i++)
        {
            m_vctNode.push_back(*(vctpNode[i]));
            pNode[i] = (*(vctpNode[i]));

        }
       
        RegSetValueEx(hkFolder, _T("NODEITEM"), NULL, REG_BINARY, (BYTE*) pNode, nSize * sizeof(NODEITEM));
        delete [] pNode;
    }
    RegCloseKey(hkFolder);

2. Get

    vGetAppCacheFolder();
    HKEY hkFolder;
    DWORD cbData = 0;
    DWORD nType = REG_BINARY;
    bool bResult = false;
   
    NODEITEM *pNode = NULL;
    LONG nRet1 = RegOpenKey(HKEY_CURRENT_USER, REGISTSUBFOLDER, &hkFolder);
    cbData = 0;
    LONG nRet2 = RegQueryValueEx(hkFolder, _T("NODEITEM"), NULL, &nType, (BYTE*)pNode, &cbData);
    DWORD nApplySize = cbData/sizeof(NODEITEM);
    pNode = new NODEITEM[nApplySize];
    memset(pNode, 0, nApplySize);
    nRet2 = RegQueryValueEx(hkFolder, _T("NODEITEM"), NULL, &nType, (BYTE*)pNode, &cbData);

    if ( nRet1 == ERROR_SUCCESS && nRet2  == ERROR_SUCCESS )
    {
        m_vctNode.clear();
        int nSize =  cbData/sizeof(NODEITEM);
        for (int ci=0; ci < nSize; ci++)
        {           
            try{

                m_vctNode.push_back((pNode[ci]));
            }
            catch(exception* e){
                delete e;
                m_vctNode.clear();
                delete [] pNode;
                return false;
            }       
        }

        bResult = true;
    }else
    {
        FORMATMESSAGE(nRet2);
    }
    try
    {
        delete [] pNode;
    }catch(exception* e)
    {
        m_vctNode.clear();
        delete e;
    }
    RegCloseKey(hkFolder);
    return bResult;

2011年2月17日 星期四

vector::erase和iterator的問題

vector 在erase後,原本的iterator會失效 (被移除了)
所以在使用for-loop + erase要注意

std::vector::erase()會回傳一個有效的iterator


example::

std::vector<int> myVector;
std::vector<int>::iterator it;

for(it = myVector.begin(); it !=myVector.end();)
{
   if(*it != 1)
         it = myVector.erase(it);
   else
      ++it;

}

2011年2月16日 星期三

How To Check If Computer Is Running A 32 Bit or 64 Bit Operating System in Registry

1.HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0


Identifier         REG_SZ                     x86 Family 6 Model 14 Stepping 12
Platform ID    REG_DWORD          0x00000020(32)

2. HKLM\SYSTEM\CurrentCongtrolSet\Control\Session Manager\Envirornment

PROCESSOR_ARCHITECTURE   REG_SZ         x86

3.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 

 BuildLabEx  REG_SZ 7600.16695.x86fre.win7_gdr.101026-1503

2011年2月14日 星期一

CPen

CPen pen(PS_SOLID,2,RGB(192,192,192));
CPen *oldPen;  
oldPen = pDC->SelectObject(&pen1);
pDC->MoveTo(10,10);\\ 起點   
pDC->LineTo(200,20);\\ 線的終點   
pDC->SelectObject(oldPen);

example:

for(int i=0;i<5;i++)
    {
            CPen* pPen = &Pen;
            CPen *pOldPen =    pDC->SelectObject( pPen );
            pDC->MoveTo(0,row);
            pDC->LineTo(nWidth,row);
            pDC->SelectObject( &pOldPen );
            row+=20;
    }

2011年2月9日 星期三

取消CDockablePane的Close button (修改CDockablePane的風格)

1. OnCreate


the AFX_DEFAULT_DOCKING_PANE_STYLE defined is
static const DWORD AFX_DEFAULT_DOCKING_PANE_STYLE = AFX_CBRS_FLOAT | AFX_CBRS_CLOSE | AFX_CBRS_RESIZE | AFX_CBRS_AUTOHIDE;

把AFX_CBRS_CLOSE移除即可

m_wndClassView.Create( strFileViewWnd, this, CRect( 0, 0, 200, 200 ), TRUE, ID_PANE_FILEVIEW_WND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI, AFX_CBRS_REGULAR_TABS, AFX_CBRS_FLOAT | AFX_CBRS_RESIZE | AFX_CBRS_AUTOHIDE )  ;


2. GetControlBarStyle() and SetControlBarStyle( dwStyle )

DWORD dwStyle = m_wndClassView.GetControlBarStyle();
    dwStyle &= ~( AFX_CBRS_CLOSE | AFX_CBRS_RESIZE | AFX_CBRS_FLOAT| AFX_CBRS_AUTOHIDE);
    m_wndClassView.SetControlBarStyle( dwStyle );

2011年2月8日 星期二

CTime CString 互轉

CString -> CTime

TCHAR *tcValidTimeFrom, *tcValidTimeTo;
int iHour, iMinute,iSecond;

 tcValidTimeFrom = (TCHAR*)(LPCTSTR) csValidTimeFrom;                                                        _stscanf(tcValidTimeFrom, _T("%d:%d:%d"), &iHour, &iMinute, &iSecond);
CTime ctimeValidFrom(1970,1,1,iHour,iMinute,iSecond);

CTime -> CString


CTime time;
CString csDate;
CString csDate = time.Format(_T("%Y\%m\%d"));