学VC时做的一些笔记

来源:互联网 发布:信贷员客户资源软件 编辑:程序博客网 时间:2024/04/17 04:51

 字体应用
CFont font;
font.CreateFont(10 + x*8, //字体字符的逻辑高度
  0, //字符平均宽度取默认值
  0, //文本行角度为0,水平
  0, //字符角度为0,正交
  FW_NORMAL, //正常字体
  FALSE, //不倾斜
  FALSE, //不加下划线
  FALSE, //不加删除线
  ANSI_CHARSET,  //字符集
  OUT_DEFAULT_PRECIS,  //字体输出的结果和要求的匹配
  CLIP_DEFAULT_PRECIS,  //如何剪裁落于剪裁区之外的字符
  DEFAULT_QUALITY,  //字体属性匹配的精确度
  DEFAULT_PITCH|FF_MODERN,  //字体间距和字体族
  "Times New Roman");   //字符名称
CFont *oldFont = pDC->SelectObject(&font);  //选择字体
pDC->TextOut(r.left + 200,r.bottom/2+50 * x,"FONT 字体演示");  //显示字符串
pDC->SelectObject(oldFont);    //选择原有字体


CRect应用
CRect r;
GetClientRect(&r);  //获取屏幕大小
//随着屏幕的大小,改变屏幕颜色
if(r.right>700||r.bottom>500)
 pDC->FillSolidRect(r,RGB(255,0,0));
else
 if(r.right<700&&r.right>350||(r.bottom>250&&r.bottom<500))
  pDC->FillSolidRect(r,RGB(0,255,0));
 else
  if(r.right<350&&r.right>0||(r.bottom>0&&r.bottom<250))
   pDC->FillSolidRect(r,RGB(0,0,255));


滚动轴的使用
//先将父类 CView 改成 CScrollView
 CSize sizeTotal;// 设置实现滚动窗口时的窗口大小
 sizeTotal.cx = pDoc->Text.GetLength()*5;
 sizeTotal.cy = 0;//当窗口小于sizeTotal.cx,sizeTotal.cy时显示滚动轴
 SetScrollSizes(1,sizeTotal);//设置滚动轴尺寸
// GetParentFrame()->RecalcLayout();
// ResizeParentToFit();//当对窗口进行声明后,调用ResizeParentToFit()来调整窗口大小


非模式对话框的创建
 CDlg1* dlg;  //构造对象
 dlg = new CDlg1(this);   //开辟空间
 dlg->Create(IDD_DIALOG);  //创建窗口
 dlg->ShowWindow(SW_RESTORE);  //窗口显示状态


改变鼠标形状
 HCURSOR CUR;  //定义对象
 UINT CurName;  //记录当前鼠标ID

 LoadCursorID(IDC_CURSOR);  //将IDC_CURSOR --> CurName(自定义函数)
 CUR = AfxGetApp()->LoadCursor(CurName);   //将鼠标改成目标鼠标
 ::SetCursor(CUR);  //改变鼠标形状
简单写成: ::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR)); //IDC_CURSOR为资源鼠标ID

 


限制鼠标范围
 ::SetCursor(IDC_CURSOR);
 RECT rect;
 GetClientRect(&rect);
 ClientToScreen(&rect);
 ClipCursor(&rect);  //限制鼠标的移动范围


从键盘输入字符并显示:
void CEx2View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 // TODO: Add your message handler code here and/or call default
 CEx2Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);

 pDoc->Text += nChar;  //将输入字符写进,pDoc->Text
 Invalidate();  //刷新
 CScrollView::OnChar(nChar, nRepCnt, nFlags);
}
void CEx2View::OnDraw(CDC *pDC)
{
 CEx2Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 pDC->TextOut(0,0,pDoc->Text);  //显示字符
}

 

菜单扩展的实现
void CEx1View::OnExpand()   //自定义的菜单映射函数
{
 // TODO: Add your command handler code here
 CMenu *pAddinMenu,*pTopMenu; //创建CMenu对象
 pTopMenu = AfxGetMainWnd()->GetMenu(); //得到主菜单的指针
 pAddinMenu = pTopMenu->GetSubMenu(3); //获取添加菜单命令的响应位置(位置从左到右为:0,1,2,3......)
 ASSERT(pAddinMenu != NULL);
 pAddinMenu->AppendMenu(MF_SEPARATOR); //在添加扩展菜单之前,添加一条分割线
 CString MenuName;
 for(int i = 0; i<2;i++)  //i为添加菜单数(添加的菜单必须在同一遍内存中(资源树中的string table))
 {
  MenuName.LoadString(IDS_B + i); //调用用于显示菜单命令的字符串
  pAddinMenu->AppendMenu(MF_STRING,IDS_B + i,MenuName); //指定位置添加字符串
 }  //利用for()循环语句添加扩展菜单
 
}
void CEx1View::OnStandard()    //自定义的菜单映射函数
{
 // TODO: Add your command handler code here
 CMenu *pAddinMenu,*pTopMenu; //创建CMenu对象
 pTopMenu = AfxGetMainWnd()->GetMenu(); //得到主菜单的指针
 pAddinMenu = pTopMenu->GetSubMenu(3); //获取菜单位置(位置从左到右为:0,1,2,3......)
 int i = pAddinMenu->GetMenuItemCount();  //获取菜单总数
 if(6 == i)  //6一般为菜单数
 {
  i--;  //因为菜单从上往下数,为:0,1,2......
  while(i > 2)  //2为扩展前的菜单数(视具体情况而定)
  {
   pAddinMenu->RemoveMenu(i,MF_BYPOSITION);  //删除菜单项
   i--;
  }
 }
 else
 {
  pAddinMenu->DeleteMenu(3,MF_BYPOSITION);  //删除菜单项
  pAddinMenu->RemoveMenu(3,MF_BYPOSITION);
  pAddinMenu->RemoveMenu(3,MF_BYPOSITION);
 }
}


创建活动工具条
CToolBar  *m_pColorToolBar;  //定义工具条对象

void CMainFrame::OnViewColortoolbar()
{
 // TODO: Add your command handler code here
 if(m_pColorToolBar == NULL)
 {
  m_pColorToolBar = new CToolBar;  //初始化m_pColorToolBar
  if(m_pColorToolBar->Create(this) == 0)
  {
   MessageBox("创建失败");  //如果创建失败则显示一个信息对话框.
   return;
  }
  m_pColorToolBar->LoadToolBar(IDR_COLORTOOLBAR);  //获取工具条资源
  m_pColorToolBar->EnableDocking(CBRS_ALIGN_ANY);  //设置工具条出现时的位置
  DockControlBar(m_pColorToolBar);
 }
 else
 {
  if(m_pColorToolBar->IsWindowVisible() == TRUE)
  {
   ShowControlBar(m_pColorToolBar,FALSE,FALSE);//if the window is visibble, hide it
  }
  else
  {
   ShowControlBar(m_pColorToolBar,TRUE,TRUE);//Otherwise, show it
  }
 }
}

 

数据存储与读出
步骤:
1、完成要从磁盘串行读写的每个类;
2、实现对话类的Serialize()虚成员函数;
3、给对话对象添加从磁盘对象的代码。
4、给对话对象添加向磁盘写对象的代码。
在头文件:添加宏 DECLARE_DYNCREATE(CEx1Doc) //CEx1Doc为子类名
在cpp文件:添加宏 IMPLEMENT_DYNCREATE(CEx1Doc, CDocument) //CDocument为CObject的子类
void CEx1Doc::Serialize(CArchive& ar) //Serialize()的实现
{
 if (ar.IsStoring())
 {
  // TODO: add storing code here
  ar<<Text;
 }
 else
 {
  // TODO: add loading code here
  ar>>Text;
 }
}

 

CFileDialog类应用:(创建“打开”对话框)
 CString FilePathName;
 CString FileName;
 CFileDialog dlg(TRUE,_T("TXT"),_T("*.TXT"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
     _T("文本文件(*.TXT)|*.TXT|")); //设置打开文件为“.TXT”(过滤文件类型)
 if(IDOK == dlg.DoModal())
 {
  FilePathName.Format("%s %s","filepath:",dlg.GetPathName()); //GetPathName()获取文件名和文件路径
  FileName.Format("%s %s","filename:",dlg.GetFileName());  //GetFileName()获取文件名
 }
 Invalidate();  //更新OnDraw()函数

 

非打印的虚拟键码
VK_CONTROL   Control(控制)
VK_DELETE   Delete
VK_DOWN    下箭头
VK_END    End
VK_F1到F12   F1到F12
VK_HOME    Home
VK_INSERT   Insert
VK_LEFT    左箭头
VK_PAUSE   Pause
VK_NEXT    Page Down
VK_PRIOP   Page UP
VK_SNAPSHOT   Print Screen
VK_RIGHT   右箭头
VK_SHIFT   Shift
VK_UP    上箭头

 


显示位图:CBitmap类
void CEx3View::OnDraw(CDC* pDC)
{
 CEx3Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 CBitmap Bitmap;
 Bitmap.LoadBitmap(IDB_BITMAP1);
 CDC MemDC;
 MemDC.CreateCompatibleDC(pDC);
 CBitmap *pOldBitmap = MemDC.SelectObject(&Bitmap);
 BITMAP bm;
 Bitmap.GetObject(sizeof(BITMAP),&bm);
 pDC->BitBlt(130,20,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); //显示位图
 MemDC.SelectObject(pOldBitmap); 
}


关于BITMAP结构,代码中定义的BITMAP bm;BITMAP结构存储了这样的数据:
typedef struct tagBITMAP
{
 int bmType;
 int bmWidth;
 int bmHeight;
 int bmWidthBytes;
 BYTE bmPlanes;
 BYTE bmBitsPixel;
 LPVOID bmBits;
}BIYMAP;

 

切分窗口
CSplitterWnd m_wndSplitter;  //定义对象

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 // TODO: Add your specialized code here and/or call the base class
 CRect cr;
 GetClientRect(&cr);  //获取窗口大小
 CSize paneSize(cr.Width()/5,cr.Height()/5);  //设置窗口的尺寸
 m_wndSplitter.CreateStatic(this,3/*行数*/,2/*列数*/);  //创建静态切分窗口
 m_wndSplitter.CreateView(0/*表示第1行*/,0/*表示第1列*/,RUNTIME_CLASS(CEx3View),paneSize,pContext);
 m_wndSplitter.CreateView(1/*表示第2行*/,0,RUNTIME_CLASS(CEx3View),paneSize,pContext);
 m_wndSplitter.CreateView(2/*表示第3行*/,0,RUNTIME_CLASS(CEx3View),paneSize,pContext);
 m_wndSplitter.CreateView(0,1/*表示第2列*/,RUNTIME_CLASS(CEx3View),paneSize,pContext);
 m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CEx3View),paneSize,pContext);
 m_wndSplitter.CreateView(2,1,RUNTIME_CLASS(CEx3View),paneSize,pContext);
 return TRUE;
 return CFrameWnd::OnCreateClient(lpcs, pContext);
}

 

24位或32位真彩色位图现实
 HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,_T("start.bmp"),//图像文件名
     IMAGE_BITMAP, //读入位图
     0, //位图的宽度(不改变默认0)
     0, //位图的高度(不改变默认0)
     LR_CREATEDIBSECTION //创建DibSection
     |LR_DEFAULTSIZE  //源图像的大小
     |LR_LOADFROMFILE); //从文件读
 if(hBitmap == NULL)
  return FALSE;
 m_bitmap.Attach(hBitmap); //获取位图指针

 函数LoadImage()提供了将资源中或文件中的位图、光标和图标的读入方法。并且,提供了Win95的DibSection的支持。
DibSection提供了一种直接对显示内容的控制方法,大大提高了图像绘制的能力及速度。