mikenoodle's home

mikenoodle@163.com 嵌入式开发&打杂的

文章图片

划分任意子窗口

7.4.2  划分任意子窗口

除了上面分割视图的方法以外,还可以划分任意子窗口。划分任意子窗口时也是先调用CreateStatic方法创建静态分割的窗体,然后调用CreateView方法创建子视图,但是不为要分割的子窗口创建视图,而是调用CreateStatic方法继续分割窗体。

例7.3  划分任意子窗口。(实例位置:光盘\TM\sl\7\3)

步骤如下:

(1)创建一个单文档应用程序。

(2)在框架类的头文件中声明CSplitterWnd类对象m_wndSplitter。

(3)重载框架类的OnCreateClient虚方法,在该方法中分割视图窗口。代码如下:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, 

CCreateContext* pContext) 

{

m_wndSplitter.CreateStatic(this,1,2);      //创建分割窗口

//创建视图

m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CRandomDivisionView),

CSize(100,200), pContext);

m_ChildWnd.CreateStatic(&m_wndSplitter,2,1,WS_CHILD|WS_VISIBLE,

m_wndSplitter.IdFromRowCol(0,1));     //为子窗口创建分割窗口

m_ChildWnd.CreateView(0,0,RUNTIME_CLASS(CRandomDivisionView),

CSize(100,100),pContext);

m_ChildWnd1.CreateStatic(&m_ChildWnd,1,2,WS_CHILD|WS_VISIBLE,

m_ChildWnd.IdFromRowCol(1,0));      //为子窗口创建分割窗口

m_ChildWnd1.CreateView(0,0,RUNTIME_CLASS(CRandomDivisionVi

修改SDI主窗口Title

一般情况下,SDI主窗口标题形式为: "文档标题 - 主窗口标题"。

参见winfrm.cpp的代码:

void CFrameWnd::OnUpdateFrameTitle(BOOL bAddToTitle)

{

...

UpdateFrameTitleForDocument(pDocument->GetTitle());

...

}

void CFrameWnd::UpdateFrameTitleForDocument(LPCTSTR lpszDocName)

{

CString WindowText;

if (GetStyle() & FWS_PREFIXTITLE)

{

// get name of currently active view

WindowText += lpszDocName + _T(" - ") + m_strTitle;

}

else

{

WindowText += m_strTitle + _T(" - ") + lpszDocName;

}

AfxSetWindowText(m_hWnd, (LPCTSTR) WindowText);

}

可以看到, 主窗口最终显示的 Title 是由文挡名和主窗口标题组成的,修改文档标题或主窗口标题都能影响最后的结果。

有下面几种修改主窗口Title的方法:

方法一:文档标题的改变

CDocument::SetTitle()

例如,在OnNewDocument()中就可以用SetTitle()修改文档标题

方法二:主窗口标题的改变

主窗口的标题默认是工程的文件名

2.1 利用ResourceView打开工程的资源,修改String Table中的IDR_MAINFRAME的值

2.2 在 CMainFrame::PreCreateWindow() 修改CMainFrame::m_strTitle

以上办法只

结合Leaning OpenCV 第二个例子 显示一个视屏文件 写了一下 获取摄像头的代码为并且创建窗口显示的代码为:

#include "stdafx.h"

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

int main( int argc, char** argv )

{

//声明IplImage指针

IplImage* pFrame = NULL;

//获取摄像头

CvCapture* pCapture = cvCreateCameraCapture(-1);

//创建窗口

cvNamedWindow("video", 1);

//显示视屏

while(1)

{

pFrame=cvQueryFrame( pCapture );

if(!pFrame)break;

cvShowImage("video",pFrame);

char c=cvWaitKey(33);

if(c==27)break;

}

cvReleaseCapture(&pCapture);

cvDestroyWindow("video");

}

其中必须说一下几个函数用分割线框起来了

具体是这样的:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// testc.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "stdafx.h"

#include <cstdio>

#include <highgui.h>

int main()

{

 IplImage *pImg = NULL;

 CvCapture *cap = cvCaptureFromCAM(0);

 char fileName[100];

 char key;

 int count = 0;

 while(1)

 {

  pImg = cvQueryFrame(cap);

  //cvFlip(pImg, NULL, 1); //水平翻转图像,像照镜子一样,不想要这个效果可以去掉此句

  key = cvWaitKey(50);

  if(key == 27) break; //按ESC键退出程序

  if(key == 'c')       //按c键拍照

  {

   sprintf(fileName, "Picture %d.jpg"

1. select

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

void FD_CLR(int fd, fd_set *set);

int FD_ISSET(int fd, fd_set *set);

void FD_SET(int fd, fd_set *set);

void FD_ZERO(fd_set *set);

select的调用一般要注意几点:

① readfds等是值结果参数,会被函数修改,所以一般会另外定义一个allread_fdset,保持全部要监听读的句柄,将它的拷贝传递给select函数,返回可读的句柄集合,类型fdset支持赋值运算符=;

② 要注意计算nfds,当新增监听句柄时比较容易修改,当减少监听句柄时较麻烦些,如果要精确修改需要遍历或者采用最大堆等数据结构维护这个句柄集,以方便的找到第二大的句柄,或者干脆在减少监听句柄时不管nfds;

③ timeout如果为NULL表示阻塞等,如果timeout指向的时间为0,表示非阻塞,否则表示select的超时时间;

④ select返回-1表示错误,返回0表示超时时间到没有监听到的事件发生,返回正数表示监听到的所有事件数(包括可读,可写,异常),通常在处理事件时 会利用这个返回值来提高效率,避免不必要的事件触发检查。(比如总共只有一个事件,已经在可读集合中处理了一个事件,则可写和