📄 05o007.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>
<body>
<div align="justify">
<table border="0" width="100%" class="font" height="57">
<tr>
<td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">VC知识库(五)</font>
</td>
<td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">www.vckbase.com</font>
</td>
</tr>
<tr>
<td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="17" class="header" valign="top" align="center" colspan="2">
<small><big>几个编程技巧</big></small>
</td>
</tr>
<tr>
<td width="100%" height="17" class="info" align="center" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="22" class="font" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="5" class="font" colspan="2">
<small>
<p>1:要生成平面工具栏是十分简单的。你只需要在CMainFrame的OnCreate()函数中添<br>
加一句话就可以(必须加在工具栏生成函数之后,因为MFC在生成工具栏时,要清除<br>
其式样)<br>
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) <br>
{ if(!m_wndToolBar.Create(this) <br>
//!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) <br>
{ <br>
TRACE0("Failed to create toolbar\n"); <br>
return -1; // fail to create <br>
} <br>
m_wndToolBar.ModifyStyle(0,TBSTYLE_FLAT);}//设置工具栏为平面格式 <br>
<br>
2:从窗口中删除了极大按钮并设置了初始位置和大小:<br>
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)<br>
{cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;<br>
// Set the position of the window to the upper -left corner.<br>
cs.x =cs. y =0;<br>
//Set the width and height of the window .<br>
cs. cx=GetSystemMetrics (SM_CXSCREEN);<br>
cs. cy=GetSystemMetrics (SM_CYSCREEN) /2;<br>
return CFrameWnd::PreCreateWindow(cs);} <br>
3:用户可以在代码的任何地方调用Cwnd::ShowWindow将窗口设置为极大或极小。<br>
BOOL CSampleApp : : InitInstance ( )<br>
{ <br>
pMainWnd ->Show Window (SW_SHOWMINMIZED或者SW_SHOWMAXIMIZED);}<br>
4:如何移动窗口 <br>
调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口有关<br>
(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口的大小。<br>
//Move window to positoin 100 , 100 of its parent window .<br>
SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE |SWP_NOACTIVATE);<br>
5:如何改变视窗的背景颜色<br>
Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用<br>
ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以<br>
防止Windows擦除窗口。 <br>
BOOL CBoxView::OnEraseBkgnd(CDC* pDC) <br>
{CBrush brush(RGB (128 , 0 , 128) );<br>
// Select the brush into the device context .<br>
CBrush* pOldBrush = pDC->SelectObject (&brush);.<br>
CRect rcClip ;<br>
pDC->GetClipBox (&rcClip);//Paint the area.<br>
pDC-> PatBlt (rcClip.left , rcClip.top ,rcClip.Width() , rcClip.Height() ,PATCOPY );<br>
pDC->SelectObject (pOldBrush );<br>
return TRUE;}<br>
<br>
</p>
<p>1、取得系统时间<br>
方法:<br>
SYSTEMTIME systime;<br>
::GetSystemTime(&systime);<br>
CTime time(systime);<br>
<br>
2、在程序中添加ODBC数据源<br>
方法:使用SQLConfigDataSource函数。例如:<br>
SQLConfigDataSource(NULL,ODBC_ADD_DSN,<br>
(LPSTR)"SQL Server",<br>
(LPSTR)"DSN=medicine1998\0"<br>
"SERVER=DEC\0"<br>
"DATABASE=medicine1998\0"))//添加一个ODBC数据源,其类型为<br>
//SQL Server,服务器为DEC,名字为medicine1998,数据库为medicine1998<br>
<br>
3、在Visual C++中使用DBGrid控件的方法<br>
(1)、插入一个MicrosoftRemoteData控件;<br>
(2)、设定其DataSource为所需要的ODBC数据源;<br>
(3)、设定用户名和密码;<br>
(4)、写入SQL查询语句;<br>
(5)、插入一个DBGrid控件;<br>
(6)、设定为绑定方式;<br>
(7)、设定其绑定的数据源为前面插入的MicrosoftRemoteData控件的ID;<br>
(8)、由于只能修改前两列的列头显示(至少我不知道如何去修改第3列),所以为了重新设定每一列的列头显示,同时也是为了指定显示的列,应该修改前面MicrosoftRemoteData控件中的查询语句,指定获取列和更改列名,例如:select
name as 姓名,phone as 电话 from address。此语句就是从表address中选取name和phone两列,并指定了显示的列名为“姓名”和“电话”。<br>
<br>
4、去掉在主窗口标题上显示"Untitled - MyApp."<br>
方法一:重载CDocument的虚函数"SetTitle":<br>
void CMyDoc::SetTitle(LPCTSTR lpszTitle) <br>
{<br>
CDocument::SetTitle("MyTitle");<br>
}<br>
*这个方法是将标题改为"MyTitle - MyApp"<br>
方法二:在程序中的任何位置调用下面的函数:<br>
(AfxGetMainWnd( ))->SetWindowText("MyApp");<br>
*这个方法是将标题改为"MyApp",但是每当一个文档对象被创建时,MFC就会加上文档名<br>
方法三:重载CFrameWnd的虚函数"OnUpdateFrameTitle"<br>
void CMainFrame::OnUpdateFrameTitle(BOOL Nada) <br>
{<br>
// get app name from string table resource<br>
//----------------------------------------<br>
CString csAppName;<br>
csAppName.Format(AFX_IDS_APP_TITLE); <br>
// Set caption of main frame window<br>
//---------------------------------<br>
SetWindowText(csAppName);<br>
}<br>
*注意,在微软的联机帮助中是找不到这个函数的,在新的版本中也可能不支持这个函数,所以要慎用<br>
方法四:最好的和最安全的方法,就是改写窗口的属性<br>
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)<br>
{<br>
cs.style &= ~(LONG) FWS_ADDTOTITLE;<br>
<br>
return CFrameWnd::PreCreateWindow(cs);<br>
}<br>
<br>
5、在ODBC编程中,在过滤器中可以用参数取代过滤字符串,以便在运行时动态改变过滤器,但是该参数必须用如下方法声明:<br>
(1)在记录集的定义中添加成员参数:<br>
class CStudentSet : public CRecordset<br>
{<br>
// Field/Param Data<br>
//{{AFX_FIELD(CStudentSet, CRecordset)<br>
CString m_strFirstName;<br>
CString m_strLastName;<br>
CString m_strStudentID;<br>
CString m_strGradYear;<br>
//}}AFX_FIELD<br>
<br>
CString m_strGradYrParam; //成员参数<br>
};<br>
(2)改变在CPP文件中的DoFieldExchange成员函数,并且对每一个你添加在类中的成员参数都调用一次RFX函数,如下:<br>
pFX->SetFieldType( CFieldExchange::param );//指示以下给出的是参数绑定<br>
// RFX calls for parameter data members<br>
//在此处加入RFX调用:,例如:<br>
pFX->RFX_Text(pFX,"bookname", m_strGradYrParam);<br>
*其中,bookname是要在其上添加参数的列名,后面是参数名。<br>
(3)在你的recordset类的构建函数中,增加反映参数个数的m_nParams成员变量的值。<br>
(4)然后可以在你的SQL过滤串中以?代替可变过滤参数了,这种对应是一一对应的,即?的顺序要严格遵守RFX调用的顺序。然后给出过滤参数的值,就可以用此值代替?了。注意,该过滤参数的值一定要在数据源打开之前给定。</small>
</p>
</td>
</tr>
<tr>
<td width="100%" height="12" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="6" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="8" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="17" class="font" colspan="2"></td>
</tr>
</table>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -