怎么实现一个mfc界面程序中嵌入另外一个mfc

怎么实现一个mfc界面程序中嵌入另外一个mfc,第1张

如果只是把另外一个程序的窗口嵌入进来可以

创建一个CDialog,在OnInitDialog中

HWND hWnd = ::FindWindow(_T("TXGuiFoundation"), _T("QQ"));

::SetParent(hWnd, GetSafeHwnd());

::SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) &~WS_POPUP | WS_CHILD);

//移动到合适的位置

CRect rc;

GetClientRect(rc);

::MoveWindow(hWnd, rcleft, rctop, rcWidth(), rcHeight()-20, TRUE);

::BringWindowToTop(hWnd);

::ShowWindow(hWnd, SW_SHOW);

void CMFCApplication2Dlg::OnBnClickedOk()

{

// TODO: 在此添加控件通知处理程序代码

CString textStr;

GetDlgItemText(IDC_EDIT1, textStr);

AfxMessageBox( textStr  );

//CDialogEx::OnOK();

}

void CTectCreateFileView::OnDraw(CDC pDC)

{

CTectCreateFileDoc pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

CFont font;

LOGFONT lf;

// Do something with the font just created

memset(&lf, 0, sizeof(LOGFONT)); // zero out structure

CFont def_font;

int y = 5;

for( int i = 8; i<28; )

{

lflfHeight = i; // request a 12-pixel-height font

strcpy(lflfFaceName, "宋体"); // request a face name "Arial"

VERIFY(fontCreateFontIndirect(&lf)); // create the font

def_font = pDC->SelectObject(&font);

CString strmsg;

strmsgFormat("这是%d号宋体",i);

pDC->TextOut(5, y,strmsg);

pDC->SelectObject(def_font);

fontDeleteObject();

i += 2;

y += lflfHeight;

}

}

在CView::OnDraw里画即可实现

同样的,我们可以编写其他菜单项的处理函数代码,其代码如下:

//PS_DASH菜单项处理函数

void CDrawTestView::OnPenDash()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DASH;

this->SetMenuItemCheck(0,0,7,1);

}

//PS_DOT菜单项处理函数

void CDrawTestView::OnPenDot()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DOT;

this->SetMenuItemCheck(0,0,7,2);

}

//PS_DASHDOT菜单项处理函数

void CDrawTestView::OnPenDashdot()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DASHDOT;

this->SetMenuItemCheck(0,0,7,3);

}

//PS_DASHDOTDOT菜单项处理函数

void CDrawTestView::OnPenDashdotdot()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DASHDOTDOT;

this->SetMenuItemCheck(0,0,7,4);

}

//PS_NULL菜单项处理函数

void CDrawTestView::OnPenNull()

{

// TODO: Add your command handler code here

m_PenStyle = PS_NULL;

this->SetMenuItemCheck(0,0,7,5);

}

//PS_INSIDEFRAME菜单项处理函数

void CDrawTestView::OnPenInsideframe()

{

// TODO: Add your command handler code here

m_PenStyle = PS_INSIDEFRAME;

this->SetMenuItemCheck(0,0,7,6);

}

//宽度1菜单项处理函数

void CDrawTestView::OnPen1()

{

// TODO: Add your command handler code here

m_PenWidth = 1;

this->SetMenuItemCheck(0,1,4,0);

}

//宽度3菜单项处理函数

void CDrawTestView::OnPen3()

{

// TODO: Add your command handler code here

m_PenWidth = 3;

this->SetMenuItemCheck(0,1,4,1);

}

//宽度5菜单项处理函数

void CDrawTestView::OnPen5()

{

// TODO: Add your command handler code here

m_PenWidth = 5;

this->SetMenuItemCheck(0,1,4,2);

}

//宽度7菜单项处理函数

void CDrawTestView::OnPen7()

{

// TODO: Add your command handler code here

m_PenWidth = 7;

this->SetMenuItemCheck(0,1,4,3);

}

//画笔颜色下黑色菜单项处理函数

void CDrawTestView::OnPenBlack()

{

// TODO: Add your command handler code here

m_PenColor = RGB(0,0,0);

this->SetMenuItemCheck(0,2,4,0);

}

//画笔颜色下红色菜单项处理函数

void CDrawTestView::OnPenRed()

{

// TODO: Add your command handler code here

m_PenColor = RGB(255,0,0);

this->SetMenuItemCheck(0,2,4,1);

}

//画笔颜色下绿色菜单项处理函数

void CDrawTestView::OnPenGreen()

{

// TODO: Add your command handler code here

m_PenColor = RGB(0,255,0);

this->SetMenuItemCheck(0,2,4,2);

}

//画笔颜色下蓝色菜单项处理函数

void CDrawTestView::OnPenBlue()

{

// TODO: Add your command handler code here

m_PenColor = RGB(0,0,255);

this->SetMenuItemCheck(0,2,4,3);

}

//None菜单项处理函数

void CDrawTestView::OnBrushNone()

{

// TODO: Add your command handler code here

m_BrushStyle = -1;

this->SetMenuItemCheck(1,0,7,0);

}

//HS_BDIAGONAL菜单项处理函数

void CDrawTestView::OnBrushBdiagonal()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_BDIAGONAL;

this->SetMenuItemCheck(1,0,7,1);

}

//HS_CROSS菜单项处理函数

void CDrawTestView::OnBrushCross()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_CROSS;

this->SetMenuItemCheck(1,0,7,2);

}

//HS_DIAGCROSS菜单项处理函数

void CDrawTestView::OnBrushDiagcross()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_DIAGCROSS;

this->SetMenuItemCheck(1,0,7,3);

}

//HS_FDIAGONAL菜单项处理函数

void CDrawTestView::OnBrushFdiagonal()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_FDIAGONAL;

this->SetMenuItemCheck(1,0,7,4);

}

//HS_HORIZONTAL菜单项处理函数

void CDrawTestView::OnBrushHorizontal()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_HORIZONTAL;

this->SetMenuItemCheck(1,0,7,5);

}

//HS_VERITICAL菜单项处理函数

void CDrawTestView::OnBrushVertical()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_VERTICAL;

this->SetMenuItemCheck(1,0,7,6);

}

//画刷颜色下白色菜单项处理函数

void CDrawTestView::OnBrushWhite()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(255,255,255);

this->SetMenuItemCheck(1,1,4,0);

}

//画刷颜色下红色菜单项处理函数

void CDrawTestView::OnBrushRed()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(255,0,0);

this->SetMenuItemCheck(1,1,4,1);

}

//画刷颜色下绿色菜单项处理函数

void CDrawTestView::OnBrushGreen()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(0,255,0);

this->SetMenuItemCheck(1,1,4,2);

}

//画刷颜色下蓝色菜单项处理函数

void CDrawTestView::OnBrushBlue()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(0,0,255);

this->SetMenuItemCheck(1,1,4,3);

}

我们在CDrawTestView类中再添加两个函数GetPen和GetBrush来获得自定义画笔和画刷指针,函数代码如下:

//获得自定义画笔指针

CPen CDrawTestView::GetPen()

{

return new CPen(m_PenStyle,m_PenWidth,m_PenColor);

}

//获得自定义画刷指针

CBrush CDrawTestView::GetBrush()

{

//判断是否是阴影线画刷

if (m_BrushStyle == -1)

//不是阴影线画刷

return new CBrush(m_BrushColor);

else

//是阴影线画刷

return new CBrush(m_BrushStyle,m_BrushColor);

}

编写这两个函数的好处在于:如果以后需要更改获得画笔或者画刷的方式(比如画笔改用第三个构造函数来构造),只需要修改这两个函数即可。如果在每个绘图函数菜单项的处理函数中写构造画笔和画刷的代码,一旦画笔和画刷的构造方式要发生改变,就必须逐个修改每个绘图函数菜单项的处理函数。

现在修改绘图函数菜单项的处理函数,调用GetPen和GetBrush函数获得画笔和画刷,然后选用画笔和画刷,并在函数的最后删除画笔和画刷。这是因为获得画笔和画刷的函数每次都是构造新的画笔和画刷,而它们将占用系统资源,所以在使用完毕后要进行删除。而LineTo等绘制线形图形的绘图函数不受画刷影响,所以在这些绘图函数的处理函数中不需要选用画刷。因为所有线形图形绘图函数菜单项的处理函数要添加的代码是相同的,同样所有区域图形绘图函数菜单项的处理函数要添加的代码也是相同的,所以这里只列出“LineTo”(绘制线形图形)菜单项和“Rectangle”(绘制区域图形)菜单项修改后的处理函数代码,读者只需按照相同方法修改其它处理函数即可。修改后的代码如下:

//LineTo菜单项处理函数

void CDrawTestView::OnDrawLineto()

{

// TODO: Add your command handler code here

CClientDC dc(this);

CPen pen = this->GetPen();

dcSelectObject(pen);

dcMoveTo(300,300);

dcLineTo(400,400);

pen->DeleteObject();

}

//Rectangle菜单项处理函数

void CDrawTestView::OnDrawRectangle()

{

// TODO: Add your command handler code here

CClientDC dc(this);

CPen pen = this->GetPen();

CBrush brush = this->GetBrush();

dcSelectObject(pen);

dcSelectObject(brush);

dcRectangle(450,100,650,250);

pen->DeleteObject();

brush->DeleteObject();

}

代码中粗体字部分是后添加的代码,修改原则是在获得设备环境对象之后,调用绘图函数之前,先获得画笔或画笔和画刷,然后让设备环境对象选用它们。最后在所有绘图函数执行完后,删除前面获得的画笔或画笔和画刷。

下面我们看一个例子,修改OnDraw函数,输入如下代码:

void CDrawTestView::OnDraw(CDC pDC)

{

CDrawTestDoc pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

//构造要输出的文本字符串

CString s;

s = "DrawTest Function";

//构造文本要输出的矩形区域

CRect r;

rleft = 50;rright =150;

rtop =10;rbottom = 40;

//绘制矩形,以便确定输出的文本在矩形区域中的位置

pDC->Rectangle(r);

//水平,垂直方向都居中,单行显示,超出区域范围不剪切

pDC->DrawText(s,r,DT_VCENTER|DT_CENTER|DT_SINGLELINE|DT_NOCLIP);

//向下平移矩形区域

rtop = rtop + 50;rbottom = rbottom +50;

pDC->Rectangle(r);

//垂直方向居底,水平方向靠右,单行显示

pDC->DrawText(s,r,DT_BOTTOM|DT_RIGHT|DT_SINGLELINE);

//向下平移矩形区域

rtop = rtop + 50;rbottom = rbottom +50;

pDC->Rectangle(r);

//垂直方向居顶,水平方向靠左,超出矩形区域时,在单词之间换行

pDC->DrawText(s,r,DT_TOP|DT_LEFT|DT_WORDBREAK);

//向下平移矩形区域

rtop = rtop + 50;rbottom = rbottom +50;

pDC->Rectangle(r);

//垂直方向居中,水平方向靠左,单行显示,超出范围时用省略号取代字符串尾部字符

pDC->DrawText(s,r,

DT_VCENTER|DT_LEFT|DT_SINGLELINE|DT_END_ELLIPSIS);

}

基于MFC的对话框程序加启动进度条(转)

对于比较大的程序,在启动的时候都会显示一个画面,以告诉用户程序正在加载,或者显示一些关于软件的信息,如Visual C++,Word, PhotoShop等。

这些启动画面在Visual C++中怎么实现呢?对于文档/视图结构的程序,可以直接使用VC提供的SplashWnd组件。可是在基于对话框的程序却不能使用SplashWnd组件。因此只能自己来实现此功能。

因为显示启动画面的同时还要进行程序的加载工作,所以要用到多线程。MFC区分了两种不同类型的多线程:用户界面(UI)线程和工作者线程。两者的区别是UI线程有消息循环,而工作者线程没有,UI线程能够创建窗口并处理发送给窗口的消息。工作者线程用来执行后台任务,这些后台任务不直接接受用户输入,因此不需要窗口和消息循环。 因为这里要显示一个画面,所以要使用UI线程。

下面结合我做的一个小软件“实用闹钟”来说明如何为对话框程序制作启动画面。

打开Visual C++建立一个对话框工程Page

首先准备一副位图资源插入到工程中,作为启动时显示的画面。再插入一个对话框,设置ID为IDD_SPLASH。在上面放一个picture控件,类型设为”Bitmap”,图象选择刚才插入的位图。

设置对话框的Style为Popup,Border 为None,去掉Title Bar属性,并调整对话框的大小与位图等大,这样对话框显示的时候,你看到的只是。打开 ClassWizard为此对话框建立一个新类CSplashDlg, 基类为CDialog

UI线程是由一个动态可创建的类来控制,该类是从CWinThread派生的,非常类似从CWinApp派生的一个应用程序类打开ClassWizard建立一个由CWinThread派生的类----CSplashThread,在SplashThreadh 中加入 #include"SplashDlgh",并添加一个protected型指针变量:

CSplashDlg m_pSplashDlg; //声明一个对话框指针

下面我们将在UI线程的InitInstance()函数中调用刚才创建的对话框并显示。

BOOL CSplashThread::InitInstance()

{

::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE );

//:通常系统内的每个线程都有自己的输入队列。本函数允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态 (这个函数可以不用)

m_pSplashDlg=new CSplashDlg;

m_pSplashDlg->SetEnable(true);

m_pSplashDlg->Create(IDD_SPLASH);

m_pSplashDlg->ShowWindow(SW_SHOW);

return true;

}

为CSplashThread类添加一个函数HideSplash(), 用来隐藏启动画面(即关闭对话框)

void CSplashThread::HideSplash()

{

m_pSplashDlg->SendMessage(WM_CLOSE);

}

在ExitInstance()中释放资源:

int CSplashThread::ExitInstance()

{

m_pSplashDlg->DestroyWindow();

delete m_pSplashDlg;

return CWinThread::ExitInstance();

}

在应用程序类CPageApp中包含头文件: #include “SplashThreadh”

并添加两个变量:

public: //设为pulic类型,是为了在其他类中能够访问

CSplashThread pSplashThread;

CSplashDlg m_pSplashDlg;

在InitInstance()中启动UI线程:

pSplashThread = (CSplashThread) AfxBeginThread(

RUNTIME_CLASS(CSplashThread),

THREAD_PRIORITY_NORMAL,

0, CREATE_SUSPENDED);

ASSERT(pSplashThread->IsKindOf(RUNTIME_CLASS(CSplashThread)));

pSplashThread->ResumeThread();

Sleep(1);

为了让程序一起动就显示启动画面,这段代码应该放在InitInstance()最开头的地方

启动画面是显示了,可是结束代码应该放在什么地方呢如果放在InitInstance()的CPageDlg dlg; m_pMainWnd = &dlg; 后面,即在构造了主对话框之后隐藏启动画面, 程序运行时会发现,启动画面结束后,还要等一会才能显示出主对话框,这样就达不到启动画面应有的效果 最好应该在即将显示主对话框的时候隐藏启动画面 我的这个软件中在主对话框中定义了5个子对话框类的对象,分别是page1,page2,…page5

程序启动时的流程如下:

Page1构造 --->Page2构造 --->Page3构造---> Page4构造---> Page5构造---> 主对话框构造 --->主对话框初始化---> Page1初始化---> Page2初始化 --->Page3初始化 Page4初始化---> Page5初始化

由此可见,启动画面结束的最好地方应该是在 page5的初始化函数中

BOOL CPage5::OnInitDialog()

{

CDialog::OnInitDialog();

if ( ((CPageApp)AfxGetApp())->pSplashThread != NULL)

((CPageApp)AfxGetApp())->pSplashThread->HideSplash();

return TRUE;

}

到此,一个对话框程序的启动画面就这样完成了由于是用对话框作为启动画面,所以你可以你可以发挥你的想象力,在对话框上设计出丰富多才的效果来,比如加上Flash,Gif动画等

以上就是关于怎么实现一个mfc界面程序中嵌入另外一个mfc全部的内容,包括:怎么实现一个mfc界面程序中嵌入另外一个mfc、在VC平台上,利用MFC编写一个输入输出对话框程序,实现一个基本的互动效果、写一个简单MFC应用程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9857709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存