在Visual C++中常用到得一些绘图或者控件的语句(mfc)

C++编程基础 同时被 2 个专栏收录
2 篇文章 0 订阅
3 篇文章 0 订阅

 为快速开发学mfc推荐看吕鑫的教学视频,因为这个比较清楚百度搜索 吕鑫mfc就可以了!

 这个就挺好:http://www.tudou.com/programs/view/sirRzIM0gj0

vs2010对vc 6.0有了很大的改进,扩充了类库。在vc 6.0中很多不便使用的功能得到了改进。
要实现某个功能,比如vc6.0中CDialogBar使用,不如在vs2010中的DockablePane方便,列表控件的排序用CListCtrl不如用CMFCListCtrl方便,在vc6.0中的方法比较麻烦,看起来也费劲,模仿操作可能还不成功。
在有一定vc6.0经验后要学习vs2010的新特性。
vc学习:
http://family.baidu.com/portal/techForum/detail?articleId=685441801
消息函数解析:
http://bbs.csdn.net/topics/300216012
Windos API初体验:
http://blog.csdn.net/fucumt/article/details/8547227
遍历文件目录:
CFileFind   tempFind;
 CString path=
"C:\\Documents and Settings\\huangzhiqiang03\\桌面\\语料2\\cand\\*.*";
 CString strFileName; 
 int nCount=0;

 BOOL bIsFinded =(BOOL)tempFind.FindFile( path ); 
 while( bIsFinded )
 {
  bIsFinded = (BOOL)tempFind.FindNextFile(); 
  if( !tempFind.IsDots() ) 
  {
   nCount++;//文件数
   //每次得到一个文件名
   strFileName = tempFind.GetFileName();
   MessageBox(strFileName);
  }
 }
 tempFind.Close(); 
修改单文档程序的标题栏:
找到document类,找到OnNewDocument() 函数,添加SetTitle()函数
OnNewDocument()      { 
              if   (!CDocument::OnNewDocument())
                              return   FALSE;
              SetTitle   ("   文档标题   "   );
              return   TRUE;      
}      

画点函数:

pDC->SetPixel(x,y,RGB(0,0,220));

画线函数:

pDC->MoveTo(point0);
pDC->LineTo(temppoint); 

pDC->LineTo(x,y);

画多边形:

CPoint res【】中存了n个点,定义画刷可以填充。

CBrush MyBrush; 
 CDC *pDC=GetDC();
 MyBrush.CreateSolidBrush(RGB(100,250,250));
 pDC->SelectObject(&MyBrush);
 pDC->Polygon(res,n);
画椭圆:

CDC *pDC=GetDC();
 MyBrush.CreateSolidBrush(RGB(100,250,250));
 pDC->SelectObject(&MyBrush);

pDC->Ellipse(point.x-r,point.y-r,point.x+r,point.y+r);

点的初始化:

CPoint point1=CPoint(250,500);
创建画笔:
 CPen Mypen,*oldPen; 
  Mypen.CreatePen(1,1,RGB(255,0,0));
  oldPen=pDC->SelectObject(&Mypen);
  //draw...
  pDC->SelectObject(oldPen); 

 

RedrawWindow();//刷新屏幕
Sleep(1);//延时1ms,提高填充过程的可视性

取得一个绘图类指针的方法
方法一
CTestDoc *pDoc=GetDocument();
ASSERT_VALID(pDC);
pDC->MoveTo(50,50);
pDC->LineTo(500,500);
方法二
CDC *pDC=GetDC();
pDC->MoveTo(50,50);
pDC->LineTo(500,500);
ReleaseDC(pDC);
方法三
CClientDC dc(this);
dc.MoveTo(50,50);
dc.LineTo(500,500);

CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Polygon(Point,7);//绘制多边形
//输出多边形的顶点编号
pDC->TextOut(550,410,"P0");

RedrawWindow();//刷新屏幕
double temp[N][3]={};数组初始化置空 在DEV C++中可用,visual C++图形学中编译报错
数组批量赋值:
double m[3][3]={1,0,0,0,1,0,1,1,1};

设置窗口范围函数:
类属  CDC::SetWindowExt
原型  virtual CSize SetWindowExt(int x,int y);
返回值: 原窗口范围的CSize对象

设置视区范围函数:
类属  CDC::SetViewportExt
原型  virtual CSize SetViewportExt(int x,int y);
返回值: 原视区范围的CSize对象

设置视区坐标原点函数:
类属  CDC::SetViewportOrg
原型  virtual CPoint SetViewportOrg(int x,int y);
返回值: 原视区原点的CPoint对象

得到当前绘图窗口的大小及屏幕坐标:
CDC *pDC=GetDC();
CRect Rect;
GetClientRect(&Rect);
Rect .Width();Rect.Height(); 
绘图窗口左上角的屏幕坐标:
GetWindowRect(Rect);
x=Rect.left;y=Rect.top;
使控件获得焦点:

GetDlgItem(IDC_BUTTON1)->SetFocus(); 

GetDlgItem(控件ID)->SetFocus(); 

双缓冲绘图:
         //预操作
CRect rc;                       //用于保存当前窗口的大小
GetClientRect(&rc);
CDC dcMem,*mypDC; //用于设置内存映像和获得当前设备上下文指针
mypDC=GetDC();
dcMem.CreateCompatibleDC(mypDC);//mypDC->dcMem; dcMem依附窗口DC创建兼容内存DC
CBitmap bmp,*pOldBit;           //内存中承载临时图像的位图,及获得位图指针
bmp.CreateCompatibleBitmap(mypDC,rc.Width(),rc.Height());//创建于当前窗口对应的位图
pOldBit=dcMem.SelectObject(&bmp);//bmp->dcMem; dcMem选择位图
dcMem.FillSolidRect(rc,RGB(255,255,255));
//用memDC绘图
dcMem.MoveTo(200,0);
dcMem.LineTo(0,200);
//memDC->mypDC,绘制内存映像
mypDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
//善后,删除内存
dcMem.DeleteDC();
bmp.DeleteObject();
取得视区范围内的点的像素,并且剥离RGB值的方法:

        CDC *pDC=GetDC();
   int x,y;
   COLORREF c;
     COLORREF temp;
 for(x=0;x<xx;x++)
     for(y=0;y<yy;y++)
    {
    c=pDC->GetPixel(x,y);
      if(x==0&&y==0)
       temp=c;

          //剥离rgb变量c的rgb值!
            BYTE r = GetRValue(c); 
            BYTE g = GetRValue(c); 
            BYTE b = GetRValue(c);
   
            BYTE rr = GetRValue(temp); 
            BYTE gg = GetRValue(temp); 
            BYTE bb = GetRValue(temp); 
            temp=c;
          //判别两个像素点之间差异范围是否超过一定阈值

            if(abs(r-rr)+abs(g-gg)+abs(b-bb)>100)
               c=RGB(255,0,0);   
          pDC->SetPixel(x,y,c);
  }

关于在视区内输出文字及变量的语句                  
                  CString data;           //定义一个字符串变量
    data.Format("%f",k);    //将浮点型变量K格式化成字符串到data 
   如果是在vs2010中则需写成data.Format(L"%f",k); 
   pDC->SetTextColor(RGB(0,0,0));    设置字体颜色
    pDC->SetBkColor(RGB(0,200,100));   设置文字背景颜色
    pDC->TextOut(0,0,"直线的斜率为:");  在特定位置(0,0)输出常量字符串
    pDC->TextOut(100,0,data);             在特定位置(100,0)输出data变量
载入位图的方法(可用来做小游戏)

下面一段程序是来自Mousemove消息的,point.x和point.y是mousemove自动生成的Cpoint的横纵坐标

CDC MemDC;//定义一个内存设备上下文对象
 CBitmap Bitmap,*OldBitmap;//定义一个CBitmap对象和一个CBitmap对象指针
 Bitmap.LoadBitmap(bitxq);//从资源中导入图片,在Resouce视图下已经导入位图资源的ID号设为bitxq
 MemDC.CreateCompatibleDC(pDC);//建立与位图相应的内存设备上下文
 OldBitmap=MemDC.SelectObject(&Bitmap);//把内存设备上下文换成位图图像
 pDC->BitBlt(point.x-20,point.y-20,40,50,&MemDC,0,0,SRCCOPY);//将位图数据传送到屏幕(point.x-20,point.y-20为位图的左上角设备坐标系坐标;40,50为长宽) 
 MemDC.SelectObject(OldBitmap);//从内存设备上下文中释放位图图像

combox的使用:
m_combox.InsertString(1,_T("19200"));添加待选条目
m_combox.GetCurSel();得到选中条目的序号
m_BaudRate.SetCurSel(0);设置选中条目
 

  在单文档工程中使用滚动条:
   1 把CView改成 CScrollView
   2 重载
OnInitialUpdate()函数
  
void CCh10Demo3View::OnInitialUpdate()
  {
    CScrollView::OnInitialUpdate();
    SIZE size={3000,1500};
    SetScrollSizes(MM_TEXT,size);//滚动窗口的最大区域/
  }
    3 协调文档位置与屏幕坐标
   CClientDC dc(this);//获取客户窗口DC
    OnPrepareDC(&dc);//进行坐标原点的匹配
    dc.DPtoLP(&point);//将视图坐标转换为文档作标   
   详细看:http://ffwmxr.blog.163.com/blog/static/6637272220100167315583/
 颜色对话框
        COLORREF bgColor;
        CColorDialog dlg(RGB(255, 255, 0), CC_FULLOPEN);
dlg.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT;
dlg.m_cc.rgbResult = bgColor;
if (dlg.DoModal() == IDOK)
{
bgColor = dlg.GetColor();
}

    使用文件夹对话选择 框:

目录对话框SHBrowseForFolder:

CString docPath;
  BROWSEINFO bi;
  TCHAR Buffer[MAX_PATH];
  //初始化入口参数bi开始
  bi.hwndOwner = NULL;
  bi.pidlRoot = NULL;
  bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
  bi.lpszTitle = _T("选择路径");//显示提示信息
  bi.ulFlags = BIF_RETURNONLYFSDIRS;//可以选很多值,
BIF_NEWDIALOGSTYLE可以新建目录并缩放窗口

  bi.lpfn = NULL;
  bi.iImage = 0;
  //初始化入口参数bi结束
  LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
  //如果没有选择路径则返回 0 
  //如果选择了路径则复制路径,返回路径长度 
  if(pIDList)
  {
    SHGetPathFromIDList(pIDList,Buffer);
    //取得文件夹路径到Buffer里
    docPath = Buffer;
    //docPath+="\\";//将路径保存在一个CString对象里
    MessageBox(docPath);
  }
//详细参看:http://www.cnblogs.com/hibernate6/archive/2011/11/24/2521995.html 

在单文档程序中添加按钮:
在view类中添加CButton m_button;
在Resource选项卡的StringTable中添加m_button的ID,比如:代号为 IDB_BTN 数值为 130,不与现有ID冲突就行
用类向导为view类添加消息处理函数处理 WM_CREATE消息 ,会生成 OnCreate(LPCREATESTRUCT lpCreateStruct) 函数
在函数内添加 按钮的初始化与显示的语句:
如:
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect_button(40,10,200,60);//描述控件位置以及大小的结构
m_button.Create("打开文件", WS_CHILD | WS_VISIBLE | WS_BORDER, rect_button, this, IDB_BTN);
m_button.ShowWindow(SW_SHOWNORMAL);
return 0;
}
F5调试,程序运行就可显示按钮。
在类向导command选项卡下找到按钮的ID(IDB_BTN),添加Message COMMAND;
生成OnIdbBtn()函数
void CChildView::OnIdbBtn()
{
MessageBox("你点击了单文档程序里的按钮");

F5运行,点击按钮就出现对话框。 
部分参看:http://blog.sina.com.cn/s/blog_6d0cbb0301018u1w.html 
各种对话框:
        MessageBox(_T("这是一个最简单的消息框!"));
MessageBox(_T("这是一个有标题的消息框!"),_T("标题"));
MessageBox(_T("这是一个确定 取消的消息框!"),_T("标题"), MB_OKCANCEL ); 
MessageBox(_T("这是一个警告的消息框!"),_T("标题"), MB_ICONEXCLAMATION ); 
MessageBox(_T("这是一个两种属性的消息框!"),_T("标题"), MB_ICONEXCLAMATION|MB_OKCANCEL );
if(MessageBox(_T("一种常用的应用"),_T("标题"),MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL) 
        MessageBox(_T("你点击了取消按钮!")); 
设置鼠标指针外形:
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
IDC_ARROW 标准箭头;   IDC_CROSS  十字光标;  IDC_HAND windows   2000:手型       
详见:http://shwang112.blog.163.com/blog/static/44712101200811912522195/
鼠标滚轮事件:
OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
nFlags
nFlags的值表示鼠标、Shift键和Ctrl键的状态组合
当ctrl键按下的时候   nFlags=MK_CONTROL
当shift键按下的时候 nFlags=MK_SHIFT
zDelta  
当滚轮滚动朝上滚动的时候  zDelta>0
当鼠标滚动朝下滚动的时候  zDelta<0
pt
CPoint pt为鼠标滚轮滚动时鼠标所在的位置,这个坐标以屏幕的左上角为零点。
详见:http://blog.sina.com.cn/s/blog_4c7fa77b010007is.html 


添加快捷键:
1
找资源视图-》Accelerate-》IDR_MAINFRAME,
在展开的列表中找到“ID_EDIT_UNDO修饰符ctrl 键Z 类型VIRTKEY”,(如果没有自己创建的可能无效)
点击该条右键,选择添加事务处理程序,OnEditUndo(){。。。}
2
在类向导中点击消息,找到WM_KEYDOWN,添加事件处理函数
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){。。。};
CWnd窗体控件改变位置:
Cwnd窗体控件派生了CView, CScrollView, CDialog, 各种control类,FrameWindows(CFrameWnd),CControlBar,CPropertySheet等。
其中contrls包括常用的CButton,CEdit,ClistBox,CComboBox等。
以CButton为例,
有一个按钮控件CButton m_btn1;
采用CWnd的MoveWindow函数移动 m_btn1。
MoveWindow(m_btn1的左上角x坐标,m_btn1的左上角y坐标,m_btn1的宽,m_btn1的高,TRUE)。 
CPoint zeroPoint(0,0);
m_btn1.MoveWindow(zeroPoint.x,zeroPoint.y,100,20,TRUE); 
MoveWindow的的zeroPoint是设备坐标,不是文档坐标。(在带滚动条的单文档中,文档坐标和设备坐标通常不同)。

CWnd窗体控件的Create()函数
CWnd::Create
virtual BOOL Create(
             LPCTSTR lpszClassName,
             LPCTSTR lpszWindowName,
             DWORD dwStyle,                 //窗体显示方式WS_CHILD 子窗口 WS_VISIBLE可见
             const RECT& rect,               //窗体大小
             CWnd* pParentWnd,           //父窗体的指针       ,如&m_wndToolBar,编辑框m_MyEdit是工具条m_wndToolBar的子窗口
             UINT nID,                             //窗体控件的控件ID,如IDC_MYEDIT
             CCreateContext* pContext = NULL
             );
参数:
lpszClassName指向一个以null结尾的字符串,它命名了一个Windows的窗口类(一个WNDCLASS结构)。类名可以是用全局函数AfxRegisterWndClass注册的任何名字,也可以是任何预定义的控制类名。如果该参数为NULL,则使用缺省的CWnd属性。 
lpszWindowName指向一个null结尾的字符串,其中包含了窗口名。
dwStyle指定了窗口风格属性。不能使用WS_POPUP。如果你想要创建一个弹出窗口,则应使用CWnd::CreateEx。
rect窗口的位置和大小,使用pParentWnd的客户区坐标。
pParentWnd父窗口。
nID子窗口的ID。
pContext窗口的创建上下文。
 
Cwnd派生了很多控件,不同控件重写了这个create函数:
编辑框-create:
 
//hzq 在工具条上添加使用编辑框
CRect rect;
m_wndToolBar.GetItemRect(7,&rect);
m_MyEdit.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndToolBar,IDC_MYEDIT);
图片
按钮-create:
//在CView类中,创建一个按钮,按钮上显示 “转到句子”
CRect tempRect_button(0,0,100,20);
m_btn1.Create("转到句子",WS_CHILD|WS_VISIBLE|WS_BORDER,tempRect_button,this,IDS_BTN1);
  图片
参看参数:
图片
CButton::Create
BOOL Create(
     LPCTSTR lpszCaption,
     DWORD dwStyle,
     const RECT& rect,
     CWnd* pParentWnd,
     UINT nID
    );
返回值:调用成功时返回非零值,否则为0。
参数:
lpszCaption指定按钮控件上的文本。
dwStyle指定按钮控件的风格。可以采用控件风格的各种组合。
rect指定按钮控件的大小和位置。既可以是一个CRect对象,也可以是一个RECT结构。 
pParentWnd指定按钮控件的父窗口,通常是一个CDialog对象。注意不能为NULL。
nID指定按钮控件的ID号。
说明:
构造一个CButton对象需要两步:首先调用构造函数,然后调用Create函数创建Windows按钮控件并在CButton对象上应用它。
如果设置了WS_VISIBLE风格,Windows将向该按钮控件发送所有用来激活和显示该按钮的消息。
按钮控件上可用的窗口风格如下:
·WS_CHILD总是设置
·WS_VISIBLE通常要设置
·WS_DISABLED很少使用
·WS_GROUP成组按钮
·WS_TABSTOP按钮按制表键次序排列 

CString转int:
CString tempStr;                             //定义一个CString对象tempStr
m_edit1.GetWindowText(tempStr); //tempStr获得CEdit控件m_edit1的值
int tempNum=_ttoi(tempStr);           //转CString变量tempStr为 int变量tempNum

单文档view类获得焦点:
原因:因为在单文档中添加了按钮,按钮截获了单文档的快捷键消息,所以希望在按钮操作完后,让单文档重新得到焦点。
方法:得到view指针,然后设置焦点。以下代码在view类中实现,头文件添加"MainFrm.h"。
C工程名View *pView = (C工程名View *)((CMainFrame *)AfxGetApp()->GetMainWnd())->GetActiveView(); 
CYGJD4View *pView = (CYGJD4View *)((CMainFrame *)AfxGetApp()->GetMainWnd())->GetActiveView(); 
pView->SetFocus(); 
参考:http://zhidao.baidu.com/link?url=RiGEOEErH9sNVGtflNSiUFffPEpCHROajJaUB_nCfm2mKyfw5iq1Kek6X3E1O2h5WuoL3sUwtrkiaog0McCR3a

更多参考学习:
 http://blog.sina.com.cn/s/articlelist_1604917350_0_1.html 

单文档中得到CView类,CMainRrame类,APP类指针,及句柄与指针转换
1指针转化为句柄
在MFC应用程序中首先要获得窗口的指针,然后将其转化为句柄
CWnd* pWnd;
HANDLE hWnd = pWnd->GetSafeHwnd();
2句柄转化为指针
在MFC应用程序中首先获得对话框控件的句柄,然后获得其指针
HANDLE hWnd;
GetDlgItem(IDC_xxx,&hWnd);
CWnd * pWnd = FromHandle(hWnd);
获得程序窗口指针的办法
1获得主框架窗口指针(任何时候都可以用,只要是MFC程序中)
CWnd* pWnd = AfxGetMainWnd();
调用pWnd成员得做指针类型转化,如((CMainFrame*)pWnd)->m_editF.GetWindowText(tempStr); 2获得对话框中控件指针
CWnd* pWnd = GetDlgItem(IDC_xxx);
3获得对话框中某控件的句柄
HANDLE GetDlgItem(m_hDLG,m_nID_DlgItem);
4获得GDI对象的句柄
HANDLE m_hGDIObj = m_pGDIObj->GetSafeHanle(); 
实例:
在一个CDockablePane的dialog中,获得CView的指针,并调用CView中的方法:
    CMainFrame   *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
    CpaneTestView    *pView=(CpaneTestView  *)pMain->GetActiveView();  
    pView->funcView(); 
参考:http://hi.baidu.com/chenfalei/item/3c4294e40af7010e560f1dc2  
http://blog.csdn.net/shuilan0066/article/details/6743789
判断左边Shift键是否按下:
if(GetAsyncKeyState(VK_LSHIFT))//Shift左键按下
{...按下应该做的...}
在鼠标滚动操作中判断control键是否按下:
 BOOL CYGJD4View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){
if(nFlags==MK_CONTROL){//ctrl键按下了    
             if(zDelta>0){还是往上滚动的...}
使用滑动条
 
(windows里面控制音量的那个东西):
添加滑动条控件slider,ID号默认为:IDC_SLIDER1,并为之绑定控制变量m_slider,
在窗口初始化函数OnInitDialog()里设置滑动块的滑动范围:m_slider.SetRange(0,255);
 在类向导命令选项卡下通过控件ID号IDC_SLIDER1找到slider对应的对象,在该对象右边的消息列表中找到消息NM_RELEASEDCAPTURE,该消息在拖滚动条释放的时候触发。
添加处理函数
比如:得到滑动块的位置 m_slider.GetPos();
使用非模态对话框:
创建了dialog对话框类dialog1 ,
包含头文件dialog1.h
dialog1 *pDlg=new dialog1;             //在堆中开辟对话框内存,模态对话框在栈中,生命期短。
pDlg->Create(IDD_DIALOG1);        //以调用位置所在的窗口为父窗口
或pDlg->Create(IDD_DIALOG1,GetDesktopWindow());//以桌面窗口为父窗口,这样可以取得类似qq的效果。 
pDlg->ShowWindow(SW_SHOW);   //显示对话框。

使用Rebar工具条容器
Rebar工具条是一个工具条容器
在MainFra.h中定义
CReBar                 m_wndReBar;     //Rebar工具条容器
        CMFCToolBar       m_wndToolBar;  //标准工具条
        CMFCToolBar       myToolBar1;      //自定义工具条
CEdit                     m_edit;              //想要在工具栏显示的编辑框
在MainFra.cpp中修改OnCreate函数:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{       。。。。
        //工具栏
//系统工具栏
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)
||!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1;      // 未能创建
}
//自定义工具栏
if (!myToolBar1.CreateEx(this, TBSTYLE_FLAT ,WS_CHILD |WS_VISIBLE|CBRS_ALIGN_BOTTOM|CBRS_TOOLTIPS) ||
!myToolBar1.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("未能创建工具栏\n");
return -1;      // 未能创建
}
        //编辑框
m_edit.Create(WS_CHILD|WS_VISIBLE, CRect(5,5,50,25),this, 0);
       //创建Rebar工具条容器,并把标准工具条m_wndToolBar、自定义工具条myToolBar1和编辑框m_edit加入Rebar 
if( !m_wndReBar.Create(this,RBS_BANDBORDERS,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CBRS_TOOLTIPS,IDD_DIALOG1)
||!m_wndReBar.AddBar(&m_wndToolBar) 
||!m_wndReBar.AddBar(&m_edit)
                ||!m_wndReBar.AddBar(&myToolBar1)
){
TRACE0("Failed to create rebar\n");
return -1;     
}
        //显示工具条容器m_wndReBar 
m_wndReBar.SetWindowPos(NULL, 123,8 ,40, 20,SWP_SHOWWINDOW); 
       //设置工具栏停靠
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
myToolBar1.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); 
DockPane(&m_wndToolBar);
DockPane(&myToolBar1); 
       。。。
参考:http://blog.csdn.net/bwmwm/article/details/4734923

Dialog程序中使用滚动条:
添加滚动条控件并绑定控制变量 
 CScrollBar m_scrollbar;
在OnInitDialog()函数中初始化滚动条的滚动范围,并设置滚动条的初始位置: 
m_scrollbar.SetScrollRange(0,100);





m_scrollbar.SetScrollPos(10); 
为对话框添加滚动消息:WM_HSCROLL或者WM_VSCROLL(对应水平、竖直滚动条的消息)
void C滚动条控件使用Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
//nSBCode,消息的类型,nPos拖动停止的地方,pScrollBar触发消息的滚动条对应控制变量的指针
CDC *mypDC;//用于设置内存映像和获得当前设备上下文指针
mypDC=GetDC();
int leftW=oriRc.Width()-seeRc.Width();
int n=m_scrollbar.GetScrollPos();
int rangeMax,rangeMin;
m_scrollbar.GetScrollRange(&rangeMin,&rangeMax);
if(pScrollBar==&m_scrollbar)//对话框中的多个滚动条通过pScrollBar识别时谁的消息
{
switch(nSBCode)
{
case SB_THUMBTRACK://拖动滚动条
m_scrollbar.SetScrollPos(nPos);//  draw the scrollbar
mypDC->BitBlt(seeRc.left,seeRc.top,seeRc.Width(),seeRc.Height(),&memDC,oriRc.left+leftW*n/float(rangeMax-rangeMin),oriRc.top,SRCCOPY);
       break;
case SB_LINERIGHT://滚动条边上的箭头
m_scrollbar.SetScrollPos(n+1);break;// click arrow
case SB_LINELEFT:
m_scrollbar.SetScrollPos(n-1);break;
case SB_PAGELEFT://点击滚动条和边缘箭头之间的区域
m_scrollbar.SetScrollPos(n-3);break;//click area
case SB_PAGERIGHT:
m_scrollbar.SetScrollPos(n+3);break;
}
CString strPos;
strPos.Format("%d",n);
m_edit.SetWindowTextA(strPos);
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);







文件选择对话框:
CString pathName,fileName,docPath;
CFileDialog openDlg(TRUE,("*.*"),NULL,0,_T("文件|*.*||"),this);
if(openDlg.DoModal()==IDOK)
{
         pathName  =openDlg.GetPathName();//文件所在目录+文件名
fileName  =openDlg.GetFileName();//文件名
docPath   =pathName.Left(pathName.GetLength()-fileName.GetLength())+"\\";//文件所在目录





使用列表控件listCtrl:
拖一个listCtrl控件到CDialog或者viewForm工程,
给listCtrl控件绑定控制变量CListCtrl m_list;
插入3列: 
m_list.InsertColumn(0,"姓名",LVCFMT_LEFT,100);
m_list.InsertColumn(1,"年龄",LVCFMT_LEFT,100);





m_list.InsertColumn(2,"妻子的数目",LVCFMT_LEFT,100); 
插入两行:
m_list.InsertItem(0,"陈水扁",0);    
m_list.SetItemText(0,1,"66");         
m_list.SetItemText(0,2,"67");        
m_list.InsertItem(2,"布什",0);
m_list.SetItemText(2,1,"77");          





m_list.SetItemText(2,2,"26"); 
点击列表头对应控件m_list的消息WM_COLUMCLICK; 
void C列表控件Dlg::OnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

CString strTemp;
strTemp.Format("%d",pNMLV->iSubItem);//pNMLV->iSubItem为被点击的列号
MessageBox("click head"+strTemp);

*pResult = 0;

点击m_list某一行时,产生WM_CLICK消息:
//点击listctrl控件的时候,显示行列号
void C列表控件Dlg::OnClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);

LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;

int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
*pResult = 0;






点击表头排序,参考:http://blog.csdn.net/precipitant/article/details/1254878 
单文档CRichEditView使用:
得到CRichEditView的引用
CRichEditCtrl& ctrl = GetRichEditCtrl();
CString strContent=“CRichEditView内容文本”;
//设置CRichEditView中的内容为StringContent
 ctrl.SetWindowText(strContent);          
或者采用如下方式   
SendMessage(WM_SETTEXT, 0, (LPARAM)static_cast<LPCTSTR>(strContent));
设置RichEdit中的字体
CHARFORMAT cf;
 ZeroMemory(&cf, sizeof(CHARFORMAT)); 
 cf.cbSize = sizeof(CHARFORMAT);  
 cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |  CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE; 
 cf.dwEffects = 0;  

 cf.yHeight = 24*24;//文字高度
 cf.crTextColor = RGB(200, 100, 255); //文字颜色
 strcpy(cf.szFaceName ,_T("隶书"));//设置字体
CRichEditCtrl& m_richedit1 = GetRichEditCtrl();
 m_richedit1.SetSel(1, 5); //设置处理区域
 m_richedit1.SetSelectionCharFormat(cf); 
CRichEditView上同样支持绘图 
CClientDC dc(this); 

dc.TextOut(50,50,"Hello");
CRichEditView设置字体
CFontDialog myFontDlg(0,CF_EFFECTS|CF_SCREENFONTS,0,0);
 if(myFontDlg.DoModal()==IDOK)
 { 
  CHARFORMAT cf; 
  myFontDlg.GetCharFormat(cf);
  CRichEditCtrl& m_richedit1 = GetRichEditCtrl();
  m_richedit1.SetSel(0,-1); //设置处理区域,0,-1为全选
  m_richedit1.SetSelectionCharFormat(cf); 
 } 
得到CRichEditView中的文本:
//得到编辑框内容
 CRichEditCtrl& ctrl = GetRichEditCtrl();
 ctrl.GetWindowText(strContent); 
 char *pContent;
 pContent=strContent.GetBuffer(); 
CDockablePane使用
参看:http://blog.csdn.net/sky_lily_1985/article/details/7609727 
将CFormView嵌入到CDockablePane中(vs2010)
http://blog.csdn.net/zhongyu627/article/details/7239756 


  • 3
    点赞
  • 0
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值