Sunday, August 27, 2006

设置鼠标形状,LoadCursor失败,用LoadStandardCursor

BOOL CSplitterBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return ::SetCursor( AfxGetApp()->LoadStandardCursor(m_bHorizontal?
IDC_SIZENS:IDC_SIZEWE));
}

Wednesday, August 23, 2006

MSSQL 列出所有数据库

SELECT [name] FROM sys.databases;

/*
一句话,费了我半天的劲,太丢人了
*/

Saturday, August 12, 2006

Programming tips

1. 向文档视图结构中的DialogBar中的Button添加ICON
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
static_cast<CButton *>( m_wndDlgBar.
GetDlgItem( IDC_BUTTON_LEND ) )->
SetIcon( AfxGetApp()->LoadIcon( IDR_MAINFRAME ) );
}
似乎要添加了时间处理函数后才看得到?
另:不要为DialogBar创建Dialog类,处理Button的消息可在其他类中处理

2. DECLARE_MESSAGE_MAP后面是protected!

3. javascript刷新父窗口
<body onUnload="javascript: window.opener.location.reload();"
>

4. STL: 用sstream的ostringstream实现format

5. Font:
m_font.CreateFont(
nHeight, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH FF_SWISS, // nPitchAndFamily
"Arial");

6. 获得CListCtrl列的个数
GetHeaderCtrl()->GetItemCount();

7. 运行时类型判断
if ( pMapStr->IsKindOf( RUNTIME_CLASS(CStringArray)) )
{
AfxMessageBox( _T("!") );
}

8. 向资源里添加GIF,
IDR_MYPIC GIF DISCARDABLE "res\\face.gif"
9. ScreenToClient & ClientToScreen
RECT rectLeft;
m_pWndLeft->GetWindowRect( &rectLeft );
ScreenToClient( &rectLeft );
rectLeft.top++;
ClientToScreen( &rectLeft );
m_pWndLeft->MoveWindow( &rectLeft );
10.CFileFind, 不理解
CFileFind finder;

// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();

// skip . and .. files; otherwise, we'd
// recur infinitely!

if (finder.IsDots())
continue;

// if it's a directory, recursively search it

if (finder.IsDirectory())
{
CString str = finder.GetFilePath();
cout << (LPCTSTR) str << endl;
Recurse(str);
}
}

finder.Close();
11. <input name="submit" type="submit" value="OK"
onClick="javascript: return confirm('hello');">

12. CListBox 选中列
SetCurSel();// 单选择
SetSel();// 多选择时有效

13. CRichEditView 只粘贴文本
HRESULT CMySQLEditorView::QueryAcceptData(
LPDATAOBJECT lpdataobj,
CLIPFORMAT* lpcfFormat,
DWORD dwReco,
BOOL bReally,
HGLOBAL hMetaFile)
{// paste text only
if (bReally && *lpcfFormat == 0 && (m_nPasteType == 0))
{
COleDataObject dataobj;
dataobj.Attach(lpdataobj, FALSE);
if (dataobj.IsDataAvailable(CF_TEXT))

{// richedit do as it wants
return S_OK;
}
}
return S_FALSE;
}

14. 调整Combo Box高度
把鼠标放在下拉按钮上,当鼠标变成上下箭头的时候点一下

15. CTreeCtrl : 设置粗体
tree.SetItemState( hRoot, TVIS_BOLD, TVIS_BOLD );// set bold
tree.SetItemState( hRoot, ~TVIS_BOLD, TVIS_BOLD );// reset bold

16. CTreeCtrl : 右键菜单,设置选择项
void CLeftView::OnNMRclick(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
UINT uFlags;
CPoint pt;
CTreeCtrl & tree = GetTreeCtrl();
GetCursorPos( &pt );// get mouse position
tree.ScreenToClient( &pt );// convert to client position
HTREEITEM hItem = tree.HitTest( pt, &uFlags );
// hit test, if an item is selected
if( (hItem != NULL) && (TVHT_ONITEM & uFlags) )
tree.SelectItem( hItem );// if true, select item
tree.ClientToScreen( &pt );// convert to windows position
m_menu.GetSubMenu( 1 )->TrackPopupMenu( TPM_LEFTALIGN
 TPM_LEFTBUTTON, pt.x, pt.y,
 this );// display menu
}

17. TPM_NONOFIFY TPM_RETURNCMD
UINT nSelected = menu.TrackPopupMenu( TPM_LEFTALIGN
 TPM_LEFTBUTTON  TPM_NONOTIFY  
TPM_RETURNCMD, pt.x, pt.y, this );
返回选择项

18. CView::OnDraw是纯虚函数!

19. CTreeCtrl 删除所有子节点
tree.Expand( hRoot, TVE_COLLAPSE TVE_COLLAPSERESET );

Programming tips

1。MFC中的__argc, char *__argv[]

2。关于函数参数:
ULONGULONG a;
int b;
...
printf( "%d%d", a, b );
结果会出错。
入栈的时候a的大小是sizeof(ULONGULONG) = 64bytes,
printf处理时遇到%d时读sizeof(int) = 32bytes,
So...

3。CFileFind遍历文件:
CFileFind f;
CString strMsg;
// 指定扩展名为.style
strMsg.Format( _T("%s\\*.style"), m_strPath );
if ( f.FindFile( strMsg ) )
{
// CFileFind是这么用的吗?
while ( f.FindNextFile() )
{
// f.GetFileTitle()获得文件名,没有扩展名
m_comboStyle.AddString( f.GetFileTitle() );
}
m_comboStyle.AddString( f.GetFileTitle() );
}
看起来很奇怪,不知道是不是这么用。

4。显示右键菜单:
POINT pos;
CMenu menu;
menu.LoadMenu( IDR_MENU1 );
GetCursorPos( &pos );
menu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON,
pos.x, pos.y, this );

5。让程序不让在任务栏出现:
VS2003中对话框的Application window属性指定是否在任务栏出现,和tool window一起使用

6。改变菜单属性:
注意CMenu的作用域。

7。处理OnSize时的问题:
RECT rect;
GetClientRect( &rect );
if ( IsWindow( m_listMain.GetSafeHwnd() ) )
{
m_listMain.MoveWindow( &rect );
}

8。多线程和定时器可以互换?

9。CAFEdit 控件的问题
AFEdit.cpp,167行,122
if( isspace( sBuffer.GetAt(x-1)) )
==>
if( (unsigned)sBuffer.GetAt(x-1) <= 255 && isspace( sBuffer.GetAt(x-1)) )
否则输入汉字的时候有问题

10。MFC注册热键问题
似乎没有相应的宏,用:
ON_MESSAGE(WM_HOTKEY, OnHotkeyNotification)
...
afx_msg LRESULT CGUICmdDlg::OnHotkeyNotification(WPARAM wp, LPARAM lp)
{
AfxMessageBox( _T("!!!") );
return LRESULT(0);
}

11。SDI中用ListView的问题
BOOL CHelloListViewView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
cs.style |= LVS_REPORT;

return CListView::PreCreateWindow(cs);
}

void CHelloListViewView::OnInitialUpdate()
{
CListView::OnInitialUpdate();

// TODO: 调用 GetListCtrl() 直接访问 ListView 的列表控件,
// 从而可以用项填充 ListView。
CListCtrl &list = GetListCtrl();
list.InsertColumn( 0, _T("Hello") );
}

12。初始化对话框时指定焦点
可以在设计对话框时用Ctrl+D,指定,而不用在OnInitDialog中用SetFocus

13。CreateProcess时输入输出管道可以使文件句柄,管道句柄,SOCKET句柄!

14。画对话框时有多个GROUP,每个GROUP中都有Radio button。
将GROUP的group选项设成TRUE!?
然后Ctrl+D,将GROUP和Radio-button的值设成连续。

15。CListCtrl删除所有列和项。
似乎没有删除所有列的函数
list.DeleteAllItems();
LVCOLUMN col;
col.mask = LVCF_WIDTH;
while( list.GetColumn( 0, &col ) )
{
list.DeleteColumn( 0 );
}

16。有了phpMyAdmin,生活好轻松

17。php函数的参数,不要传递不同类型的变量给同一个参数,否则会出现很恶心的问题。

18。释放内存
HBITMAP hBitmap = CaptureDesktop();
m_ctrlPic.SetBitmap( hBitmap );
::DeleteObject( hBitmap );// 重要啊

20。WM_COPYDATA
用IDE实现映射会导致无法编译?
重载virtual int OnCopyData(CWnd *pWnd, COPYDATASTRUCT *pCopyDataStruct);
再添加ON_WM_COPYDATA
用SendMessage
测试的时候不要用SendMessage(hwnd, WM_COPYDATA, 0L, 0L);不会成功的

21. CListCtrl
选择整行: CListCtrl::SetExtendedStyle( LVS_EX_FULLROWSELECT );
显示网格: LVS_EX_GRIDLINES
CheckBox: LVS_EX_CHECKBOXES

Programming tips

ODBC:
Select:

UpdateData(TRUE);

if (m_strODBCName.IsEmpty())
{
return;
}

CFileDialog dlg(FALSE, _T("SQL"),
CTime::GetCurrentTime().Format(_T("BACKUP_%m_%d_%Y")),
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("SQL|*.SQL|ALL|*.*||"));
if (dlg.DoModal() != IDOK)
{
return;
}

DWORD dwBegin;
DWORD dwCount;
CString strMsg;
CString strConn;
CString strValue[8];// max field count is 7
CString strSQLDevice = _T("Select
DeviceID,DeviceName,X,Y,SymbolAngle,SymbolType From T_Device");
CString strSQLLock = _T("Select
DeviceID,LockNo,LockName,LockX,LockY,SymbolAngle,SymbolType From
T_Lock");
CString strSQLSymbolLabel = _T("Select
DeviceID,LabelX,LabelY,SymbolAngle,SymbolType From T_SymbolLabel");

strConn.Format(_T("DSN=%s;UID=%s;PWD=%s;"), m_strODBCName, m_strUser,
m_strPass);

try
{
CFile fSave(dlg.GetPathName(), CFile::modeCreate|CFile::modeWrite);
CDatabase db;
m_txtOutput.ReplaceSel(_T("Backup begin at ") +
CTime::GetCurrentTime().Format(_T("%H:%M:%S %b,%d,%Y")) + _T("\r\n"));
m_txtOutput.ReplaceSel(_T("File name: ") + dlg.GetPathName() + _T("\r\n"));
dwBegin = ::GetTickCount();
db.OpenEx(strConn, CDatabase::noOdbcDialog);
CRecordset rset(&db);
// T_Device table
m_txtOutput.ReplaceSel(_T("Select T_Device: ") + strSQLDevice + _T("\r\n"));
rset.Open(CRecordset::dynaset,strSQLDevice);
dwCount = 0;
while ( ! rset.IsEOF() )
{
for (short int nIndex = 0; nIndex < 6; ++nIndex)
{
rset.GetFieldValue(nIndex, strValue[nIndex]);
}
strMsg.Format(_T("UPDATE T_Device SET
DeviceName='%s',X='%s',Y='%s',SymbolAngle='%s',SymbolType='%s' WHERE
DeviceID='%s'\r\n"),
strValue[1],
strValue[2],
strValue[3],
strValue[4],
strValue[5],
strValue[0] );
fSave.Write(strMsg, strMsg.GetLength()*sizeof(TCHAR));
m_txtOutput.ReplaceSel(_T("^"));
rset.MoveNext();
if (++dwCount%100 == 0)
{
m_txtOutput.ReplaceSel(_T("\r\n"));
}
}
rset.Close();
// T_Lock table
m_txtOutput.ReplaceSel(_T("\r\nSelect T_Lock: ") + strSQLLock + _T("\r\n"));
rset.Open(CRecordset::dynaset, strSQLLock);
while ( ! rset.IsEOF() )
{
for (short int nIndex = 0; nIndex < 7; ++nIndex)
{
rset.GetFieldValue(nIndex, strValue[nIndex]);
}
strMsg.Format(_T("UPDATE T_Lock SET
LockName='%s',LockX='%s',LockY='%s',SymbolAngle='%s',SymbolType='%s'
WHERE DeviceID='%s' AND LockNo='%s'\r\n"),
strValue[2],
strValue[3],
strValue[4],
strValue[5],
strValue[6],
strValue[0],
strValue[1] );
fSave.Write(strMsg, strMsg.GetLength()*sizeof(TCHAR));
m_txtOutput.ReplaceSel(_T("^"));
rset.MoveNext();
if (++dwCount%100 == 0)
{
m_txtOutput.ReplaceSel(_T("\r\n"));
}
}
rset.Close();
// T_SymbolLabel table
m_txtOutput.ReplaceSel(_T("\r\nSelect T_SymbolLabel: ") +
strSQLSymbolLabel + _T("\r\n"));
rset.Open(CRecordset::dynaset, strSQLSymbolLabel);
while ( ! rset.IsEOF() )
{
for (short int nIndex = 0; nIndex < 5; ++nIndex)
{
rset.GetFieldValue(nIndex, strValue[nIndex]);
}
strMsg.Format(_T("UPDATE T_SymbolLabel SET
LabelX='%s',LabelY='%s',SymbolAngle='%s',SymbolType='%s' WHERE
DeviceID='%s'\r\n"),
strValue[1],
strValue[2],
strValue[3],
strValue[4],
strValue[0] );
fSave.Write(strMsg, strMsg.GetLength()*sizeof(TCHAR));
m_txtOutput.ReplaceSel(_T("^"));
rset.MoveNext();
if (++dwCount%100 == 0)
{
m_txtOutput.ReplaceSel(_T("\r\n"));
}
}
rset.Close();

db.Close();
fSave.Close();
m_txtOutput.ReplaceSel(_T("\r\nBackup end at ") +
CTime::GetCurrentTime().Format(_T("%H:%M:%S %b,%d,%Y")) + _T("\r\n"));
strMsg.Format(_T("%fs spent.\r\n%d records saved."),
(::GetTickCount()-dwBegin)/1000.0, dwCount);
m_txtOutput.ReplaceSel(strMsg);
}
catch (CDBException *pDE)
{
CString strErr;
pDE->GetErrorMessage(strErr.GetBufferSetLength(MAX_PATH), MAX_PATH);
strErr.ReleaseBuffer();
strErr += _T("\r\n");
m_txtOutput.ReplaceSel(_T("\r\n") + strErr);
pDE->Delete();
return;
}
catch (CFileException *pFE)
{
CString strErr;
pFE->GetErrorMessage(strErr.GetBufferSetLength(MAX_PATH), MAX_PATH);
strErr.ReleaseBuffer();
strErr += _T("\r\n");
m_txtOutput.ReplaceSel(_T("\r\n") + strErr);
pFE->Delete();
return;
}
catch (...)
{
m_txtOutput.ReplaceSel("\r\nUnknown error.\r\n");
return;
}
m_txtOutput.ReplaceSel("Success !\r\n");


Update:

UpdateData(TRUE);

if (m_strODBCName2.IsEmpty())
{
return;
}

DWORD dwBegin;
DWORD dwCount;
CString strMsg;
CString strConn;

CFileDialog dlg(TRUE);
if (dlg.DoModal() != IDOK)
{
return;
}

strConn.Format(_T("DSN=%s;UID=%s;PWD=%s;"), m_strODBCName2,
m_strUser2, m_strPass2);

try
{
CStdioFile fLoad(dlg.GetPathName(), CFile::modeRead);
CDatabase db;
m_txtOutput.ReplaceSel(_T("Restore begin at ") +
CTime::GetCurrentTime().Format(_T("%H:%M:%S %b,%d,%Y")) + _T("\r\n"));
m_txtOutput.ReplaceSel(_T("File name: ") + dlg.GetPathName() + _T("\r\n"));
dwBegin = ::GetTickCount();
db.OpenEx(strConn, CDatabase::noOdbcDialog);
dwCount = 0;
while ( fLoad.ReadString(strMsg) && ! strMsg.IsEmpty() )
{
try
{
db.ExecuteSQL(strMsg);
m_txtOutput.ReplaceSel(_T("*"));
if (++dwCount%100 == 0)
{
m_txtOutput.ReplaceSel(_T("\r\n"));
}
}
catch (...)
{
m_txtOutput.ReplaceSel(_T("\r\nError: ") + strMsg + _T("\r\n"));
}
}
db.Close();
fLoad.Close();
m_txtOutput.ReplaceSel(_T("\r\nRestore end at ") +
CTime::GetCurrentTime().Format(_T("%H:%M:%S %b,%d,%Y")) + _T("\r\n"));
strMsg.Format(_T("%fs spent.\r\n%d records loaded\r\n."),
(::GetTickCount()-dwBegin)/1000.0, dwCount);
m_txtOutput.ReplaceSel(strMsg);
}
catch (CDBException *pDE)
{
CString strErr;
pDE->GetErrorMessage(strErr.GetBufferSetLength(MAX_PATH), MAX_PATH);
strErr.ReleaseBuffer();
strErr += _T("\r\n");
m_txtOutput.ReplaceSel(_T("\r\n") + strErr);
pDE->Delete();
return;
}
catch (CFileException *pFE)
{
CString strErr;
pFE->GetErrorMessage(strErr.GetBufferSetLength(MAX_PATH), MAX_PATH);
strErr.ReleaseBuffer();
strErr += _T("\r\n");
m_txtOutput.ReplaceSel(_T("\r\n") + strErr);
pFE->Delete();
return;
}
catch (...)
{
m_txtOutput.ReplaceSel("\r\nUnknown error.\r\n");
return;
}
m_txtOutput.ReplaceSel("Success !\r\n");

Programming tips

Print:

CPrintDialog dlg(FALSE);
if (dlg.DoModal() != IDOK)
{
return;
}
CRect rect;
CDC dc;
GetWindowRect(rect);
dc.Attach(dlg.GetPrinterDC());
dc.m_bPrinting = TRUE;
dc.StartDoc(_T("Title"));
dc.StartPage();

dc.SetMapMode(MM_ANISOTROPIC);
CSize size = CSize(800, 560);
dc.SetWindowExt(size);

int xLogPixPerInch = dc.GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = dc.GetDeviceCaps(LOGPIXELSY);

long xExt = (long)size.cx * xLogPixPerInch/80;
long yExt = (long)size.cy * yLogPixPerInch/80;
dc.SetViewportExt((int)xExt, (int)yExt);

dc.BitBlt(0,0,rect.Width(),rect.Height(),GetWindowDC(),0,0,SRCCOPY);
dc.EndPage();
dc.EndDoc();


Simulate keyboard:

// Simulate key down: ALT+PRINTSCREEN
keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
// Simulate key release
keybd_event( VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event(VK_MENU, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);