Visual C++ 技术文档03
51.设置另存为..对话框
CString str;
CFileDialog* filedialog;//设置另存为..对话框
filedialog=new CFileDialog(false,"txt",NULL,OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt");
if(filedialog->DoModal()==IDOK)
{
str=filedialog->GetPathName();//获取文件名及路径
CFile m_rFile;
if (!m_rFile.Open(str,CFile::modeCreate | CFile::modeReadWrite) )
{
AfxMessageBox("创建文件失败");
return;
}
m_rFile.SeekToEnd();
CString rxd;
GetDlgItemText(IDC_RXD,rxd);
m_rFile.Write((LPCTSTR)rxd,rxd.GetLength());
m_rFile.Flush();
m_rFile.Close();
}
delete(filedialog);
52.获取鼠标在屏幕上的坐标并转化为窗体坐标
CPoint pt;
GetCursorPos(&pt);//获取鼠标在屏幕上的坐标
ScreenToClient(&pt);//将屏幕坐标转换为窗体坐标
53.控件大小随窗体改变
响应WM_SIZE消息。
void CTempletDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
GetDlgItem(IDC_RXD)->MoveWindow(10,10,cx-20,200);
m_statusbar.MoveWindow(0,cy-20,cx-55,20);
GetDlgItem(IDC_PUSHPIN)->MoveWindow(cx-50,cy-20,50,20);
}
54. 最上层显示
void CTempletDlg::OnPushpin() //最上层显示
{
m_bVisible=!m_bVisible;
if(m_bVisible)
{
SetWindowPos(&wndTopMost,0,0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
}
else
{
SetWindowPos(&wndBottom,0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOREDRAW);
BringWindowToTop();
}
}
55.创建状态栏窗口
1. 定义一个CStatusBar类型变量
CStatusBar m_statusbar;
2. 在OnInitDialog() 加入下面代码
UINT array[3];
for (int i = 0;i <3;i++)
{
array[i] = 100+i;
}
m_statusbar.Create(this); //创建状态栏窗口
m_statusbar.SetIndicators(array,sizeof(array)/sizeof(UINT)); //添加面板
for (int n = 0; n<3;n++)
{
m_statusbar.SetPaneInfo(n,array[n],0,95);//设置面板宽度
}
m_statusbar.SetPaneInfo(2,array[2],0,850);
m_statusbar.SetPaneText(0,"DSME R&D Dept.YX");
m_statusbar.SetPaneText(1,"Port Closed");
m_statusbar.SetPaneText(2,"仅支持对16进制字符进行操作及处理");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
56.向编辑框赋值,并显示
SetDlgItemText(IDC_ED_TEST, _T("Sample"));
57.改变文件保存路径
void CSCOMMDlg::OnButtonDirbrowser()
{
static char displayname[MAX_PATH];
static char path[MAX_PATH];
LPITEMIDLIST pidlBrowse; // PIDL selected by user
BROWSEINFO bi;
bi.hwndOwner = this->m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = displayname;
bi.lpszTitle = "请选择要保存接收数据的文件夹";
bi.ulFlags = BIF_EDITBOX ;
bi.lpfn = NULL;
pidlBrowse=SHBrowseForFolder( &bi);
if(pidlBrowse!=NULL)
{
SHGetPathFromIDList(pidlBrowse,path);
}
CString str=path; //得到路径
if(str.IsEmpty()) return; //如果没有选择,就返回
m_strCurPath=str; //接收路径编辑框对应变量
UpdateData(FALSE);
}
58.播放WAV文件
#include "mmsystem.h"
#pragma comment(lib,"winmm.lib")
1.通过文件名
如果一个声音文件为"C:/a.wav",播放它可以用下面的语句:
PlaySound("C:/a.wav",NULL,SND_ASYNC|SND_FILENAME);
2.通过可执行文件资源标识
导入一个.wav文件,其ID为IDR_CAMERA,这样调用:
PlaySound(MAKEINTRESOURCE(IDR_CAMERA),AfxGetResourceHandle(), SND_SYNC|SND_RESOURCE);
3. 停止当前播放的声音
PlaySound(NULL,NULL,0);
59.点击任意位置均可拖动窗体
1.可以在LBUTTONDOWN里面发送一个点到标题的消息
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
2.对你的窗口添加WM_NCHITTEST消息处理函数
如果在类向导中看不到WM_NCHITTEST消息,可以将class info中的message filter改为windows就能看到了
UINT CTTTDlg::OnNcHitTest(CPoint point)
{
// return CDialog::OnNcHitTest(point); 这是原来的默认CDialog处理函数
return HTCAPTION; // 改成直接返回HTCAPTION,系统就会以为你点击的位置是标题栏,也就允许拖动窗口了
}
60.滑杆的使用
1. 在头文件中添加变量
int m_nTrackbar2;//滑杆初始位置
static int dValue[];//存储滑杆的值
2. 在CPP中:
int CCurveView::dValue[10] = {480,420,360,300,240,180,120,60,30,20};//滑杆的值的范围
CCurveView::CCurveView()
: CFormView(CCurveView::IDD)
{
//{{AFX_DATA_INIT(CCurveView)
//}}AFX_DATA_INIT
// TODO: add construction code here
m_nTrackbar2 = 9;//滑杆初始位置
}
void CCurveView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCurveView)
DDX_Check(pDX, IDC_CHECK_ONTIME, m_ontime);
DDX_CBIndex(pDX, IDC_COMBO_TIME, m_time);
//}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate)
{
CSliderCtrl* pSlide2 =(CSliderCtrl*) GetDlgItem(IDC_SLIDER);
m_nTrackbar2 = pSlide2->GetPos();
}
}
void CCurveView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
CString strText2;//以下设置滑杆
CSliderCtrl* pSlide2 =(CSliderCtrl*) GetDlgItem(IDC_SLIDER);
pSlide2->SetRange(0, 9);//
pSlide2->SetPos(m_nTrackbar2);//初始位置
strText2.Format("%d", dValue[pSlide2->GetPos()]);
strText2=strText2+"分钟";
SetDlgItemText(IDC_STATIC1, strText2);
}
void CCurveView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //滑杆调节时显示当前位置的值
{
CSliderCtrl* pSlide = (CSliderCtrl*) pScrollBar;
CString strText;
switch(pScrollBar->GetDlgCtrlID())
{
case IDC_SLIDER:
strText.Format("%d", dValue[pSlide->GetPos()]);
strText=strText+"分钟";
SetDlgItemText(IDC_STATIC1, strText);
break;
default:break;
}
CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
}
61.用GetModuleFileName获取程序当前执行文件名
在开发过程中经常需要获得程序当前的运行目录,这时就可以使用GetModuleFileName函数
DWORD WINAPI GetModuleFileName(
HMODULE hModule,
LPTSTR lpFileName,
DWORD nSize
);
hModule:要获取文件名的模块名柄,null表示当前模块
lpFileName:输出参数,存放取得的文件名
nSize:lpFileName参数的长度
GetModuleFileName的第一个参数是HINSTANCE,你可以利用AfxGetInstanceHandle()来获得这个参数的取值。
例
void FileName()
{
TCHAR lpFileName[MAX_PATH];
::GetModuleFileName(null, lpFileName, MAX_PATH);
SetDlgItemText(IDC_TEXTBOX, lpFileName);
}
62.用GetModuleFileName获取应用程序当前路径,并分解
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
GetModuleFileName(NULL, path_buffer, _MAX_PATH);
_splitpath(path_buffer, drive, dir, 0, 0);
CString strPathName;
strPathName += drive;
strPathName += dir;
63._makepath和_splitpath的用法(MSDN)
#include <stdlib.h>
#include <stdio.h>
void main( void )
{
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_makepath( path_buffer, "c", "//sample//crt//", "makepath", "c" );
printf( "Path created with _makepath: %s/n/n", path_buffer );
_splitpath( path_buffer, drive, dir, fname, ext );
printf( "Path extracted with _splitpath:/n" );
printf( " Drive: %s/n", drive );
printf( " Dir: %s/n", dir );
printf( " Filename: %s/n", fname );
printf( " Ext: %s/n", ext );
}
Output
Path created with _makepath: c:/sample/crt/makepath.c
Path extracted with _splitpath:
Drive: c:
Dir: /sample/crt/
Filename: makepath
Ext: .c
64.压缩ACCESS数据库需先确定数据库已关闭
void CHisenseView::CompressDB()//压缩
{
try
{
::CoInitialize(NULL);
JRO::IJetEnginePtr jet(__uuidof(JRO::JetEngine));
jet->CompactDatabase(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data//data.mdb",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data//datad1.mdb;"/
"Jet OLEDB:Engine Type=5");
}
catch(_com_error &e)
{
AfxMessageBox((LPCTSTR)e.Description());
}
}
65.限制编辑框内输入字符
1.新建基于CEdit的类,如CNumberEdit,为编辑框添加CNumberEdit类型控制变量
2.在CNumberEdit中响应WM_CHAR消息
void CNumberEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString str;
GetWindowText(str);
if (nChar == 8) //退格键
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
return;
}
if (nChar == 32) //空格键
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
return;
}
// if ((nChar==46)&&(!str.IsEmpty())&&(str.Find('.',0)!= -1)) //防止输入两个小数点
// nChar = 0;
if (((nChar<48)||((nChar>57)&&(nChar<65))||((nChar>70)&&(nChar<97))||(nChar>102))) //只允许输入16进制字符
{
nChar = 0;
AfxMessageBox("请输入16进制字符");
}
else
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
66.保存位图时,背景颜色为黑色,如何更改背景颜色?
在绘图时为绘图区域填充背景颜色
void CCurveView::OnCurve(CDC *pDC)
{
//填充背景颜色
CRect rc(0,0,1100,700);
CBrush newbrush,*oldbrush;
newbrush.CreateSolidBrush(RGB(212,208,200));
oldbrush=pDC->SelectObject(&newbrush);
pDC->Rectangle(rc);
newbrush.DeleteObject();
pDC->SelectObject(oldbrush);
}
67.采用双缓冲方式重绘以消除闪烁
void CCurveView::OnDraw(CDC* pDC) //重绘,双缓冲实现无闪烁
{
CDC MemDC;
CBitmap MemBitmap;
int x,y;
CSize sizeTotal=GetTotalSize();
x=sizeTotal.cx+20;
y=sizeTotal.cy+15;
MemDC.CreateCompatibleDC(pDC);
MemBitmap.CreateCompatibleBitmap(pDC,x,y);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.BitBlt(0,0,x,y,pDC,0,0,SRCCOPY);
MemDC.FillSolidRect(0,0,x,y,RGB(212,208,200));
OnCurve(&MemDC);
pDC->BitBlt(0,0,x,y,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
BOOL CCurveView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return true;
}
68.Radio Button 的使用方法
CButton* radioindoor;
radioindoor = (CButton*)GetDlgItem(IDC_RADIO1);
radioindoor->SetCheck(1);
69.遍历数据库(ADO)
void CMobileNewView::DisplayRecorder()//遍历记录
{
UpdateData(true);
m_list.DeleteAllItems();
m_list.DeleteColumn(3);
for(int i=2;i>=0;i--)
{
m_list.DeleteColumn(i);
}
m_list.InsertColumn(0,"时间",LVCFMT_CENTER,130);
m_list.InsertColumn(1,"数据",LVCFMT_LEFT,400);
m_list.InsertColumn(2,"内容",LVCFMT_LEFT,100);
::CoInitialize(NULL);
m_Connection.CreateInstance(__uuidof(Connection));
try
{
m_Connection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data//Mobile.mdb","","",adModeUnknown);
m_Recordset.CreateInstance(__uuidof(Recordset));
_variant_t RecordsAffected;
m_Recordset=m_Connection->Execute("SELECT * FROM receive ORDER BY 编号",&RecordsAffected,adCmdText);
if(m_Recordset->BOF)
{
AfxMessageBox("kong");
return;
}
m_Recordset->MoveFirst();
CString str1;
int nItem;
while(!m_Recordset->adoEOF)
{
_variant_t vCount=m_Recordset->GetCollect("时间");
str1.Format("%S",vCount.lVal);
nItem=m_list.InsertItem(0,str1);
vCount=m_Recordset->GetCollect("数据");
str1.Format("%S",vCount.lVal);
m_list.SetItemText(nItem,1,str1);
vCount=m_Recordset->GetCollect("内容");
str1=VariantToString(vCount);
m_list.SetItemText(nItem,2,LPCTSTR(str1));
m_Recordset->MoveNext();
}
m_Recordset->MoveFirst();
}
catch(_com_error &e)
{
GenerateError(e.Error(),e.Description());
}
}
70.从数据库中读取类型为时间的字段,取出后类型为_variant_t VT_DATE,如何转换为CString?
_variant_t vCount=m_Recordset->GetCollect("时间");
COleDateTime t(vCount);
str1=t.Format("%Y-%m-%d %H:%M:%S");