MFC 中创建Dlg的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC 中创建Dlg的问题相关的知识,希望对你有一定的参考价值。
已知在MFC中从一个Dlg中调用另一个Dlg为NewDlg myDlg;myDlg.DoModal();但是这样的话,子窗口不关闭,主窗口上的button都是无效的有没有方法使得子窗口保持在主窗口最上层,但是主窗口的button有效呢然后设置子窗口的位置时刻和主窗口相对一致,这样可以实现主窗口移动时子窗口跟着相对移动,高手帮忙 其实我想实现c#中的Panel功能,设置好多Panel,可见性=false;单击不同的 button 显示不同的panelMFC中的Panel没有类似的功能,我用Dlg代替但是不知道具体怎么做,求高手帮忙,高分送上
有办法!! 使用非模态对话框...假设你要显示的对话框的类名为: CNewDlg;
首先: 在主窗口的头文件中做提前声明 class CNewDlg;
为主窗口类添加成员变量: CNewDlg *m_pDlg;
在主窗口构造函数中复初值: m_pDlg = new CNewDlg(this);
其次: 在需要弹出该窗口的地方加入代码:
if (m_pDlg->GetSafeHwnd()==0)
m_pDlg->Create(); //注意:非模态对话框必须调用Create创建产生(原因参见实验指导书P65)
else
m_pDlg->SetActiveWindow();
最后: 就是销毁窗口了.
非模态对话框必须使用函数DestroyWindow()来销毁窗口. 这个工作,最好通过下面的步骤来做:
对CNewDlg类响应 IDOK 消息. 在消息响应函数中, 发送一个自定义消息给m_pDlg 父窗口, 也就是
你的主窗口, 在主窗口中对消息进行响应, 执行代码: m_pDlg->DestroyWindow(); 即可.
还需要在主对话框的析构函数中进行资源的释放:
delete m_pDlg;
希望对你能有帮助..如果不会添加自定义消息,随时可以联系我.... 参考技术A 你应该创建一个窗体,而不是对话框,创建完窗体后将窗体的OnTop属性设置就可以了,相关函数为
CreateWindow
ShowWindow 参考技术B 在mfc中创建对话框
对话框样式分两种,一种是模式对话框,另一种是非模式对话框.当打开对话框时需要阻塞进程时,使用模式对话框,当打开对话框需可以进行其它操作时,使用非模式对话框.
一般在菜单中选择某菜单项,当选择后直接打开对话框,
例如显示模态对话框CxxxDlg mydlg; mydlg.DoModal();
例如显示非模态对话框CxxxDlg* pmydlgp = new CxxxDlg;
if ( pmydlgp)
pmydlgp->Create(IDD_MYDIALOG,this);
pmydlgp->ShowWindow(SW_SHOW); 参考技术C DoModal是创建模态对话框
Show是创建非模态对话框
myDlg.Show();
如何在 MFC 中创建圆角矩形按钮
【中文标题】如何在 MFC 中创建圆角矩形按钮【英文标题】:How to create Rounded Rectangle Buttons in MFC 【发布时间】:2016-01-30 20:51:57 【问题描述】:我需要在 MFC 中创建圆角矩形按钮。我尝试了几种资源,但没有找到正确的解释方式。即使在**代码项目**中,我也创建了圆形或椭圆形按钮。
请建议我们如何创建圆角矩形按钮或任何其他文章
【问题讨论】:
【参考方案1】:我的答案是……
1.使用皮肤库。
我通常使用 Codejock SkinFramework。 这很容易。在您的 stdafx.h 中包含 XTSkinFrameworkPro.h,然后在调用您的对话框之前加载皮肤文件。
XTPSkinManager()->LoadSkin(_T("..."));
2-1。自己画。
最简单的一个在这里。请先阅读。
https://vcpptips.wordpress.com/tag/owner-draw-button-control/
然后使用此代码制作圆形按钮。如果在他们点击按钮时将标签文本滑动到右下角 1px 会更好。
http://www.codeproject.com/Articles/11683/CRoundButton-A-fancy-graphical-button
2-2。自己画。 (使用位图)
另一个是使用位图按钮。制作圆形按钮的位图图像,然后将其设置为您的按钮。
how to add bitmap image to buttons in MFC?
示例:
在下面保存为 SimpleBitmapButton.h 并将其包含在您的项目中。
#pragma once
#include <afxwin.h>
class CSimpleBitmapButton : public CButton
DECLARE_DYNAMIC(CSimpleBitmapButton)
protected:
enum EButtonState
NORMAL = 0,
PUSHED = 1
;
public:
CSimpleBitmapButton();
BOOL Open( int resource_id );
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
protected:
int Width, Height;
BOOL Pushed;
CBitmap Bitmap;
;
在下面保存为 SimpleBitmapButton.cpp 并将其包含在您的项目中。
#include "stdafx.h"
#include "SimpleBitmapButton.h"
const int BUTTON_IMAGE_NUM = 2;
IMPLEMENT_DYNAMIC(CSimpleBitmapButton, CButton)
BEGIN_MESSAGE_MAP(CSimpleBitmapButton, CButton)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_CREATE()
END_MESSAGE_MAP()
CSimpleBitmapButton :: CSimpleBitmapButton()
Pushed = FALSE;
Width = 0;
Height = 0;
void CSimpleBitmapButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct )
CDC memDC;
memDC.CreateCompatibleDC( NULL );
CBitmap *oldBitmap = memDC.SelectObject( &Bitmap );
if( Pushed == FALSE )
BitBlt( lpDrawItemStruct->hDC, 0, 0, Width, Height, memDC, 0, 0, SRCCOPY );
else
BitBlt( lpDrawItemStruct->hDC, 0, 0, Width, Height, memDC, Width , 0, SRCCOPY );
memDC.SelectObject( oldBitmap );
BOOL CSimpleBitmapButton :: Open( int resource_id )
Pushed = FALSE;
Bitmap.LoadBitmap( resource_id );
//adjust the button size
BITMAP bm;
Bitmap.GetObject(sizeof(BITMAP),&bm);
Width = bm.bmWidth / BUTTON_IMAGE_NUM;
Height = bm.bmHeight;
RECT rect;
GetWindowRect( &rect );
GetParent()->ScreenToClient( &rect );
rect.right = rect.left + Width;
rect.bottom = rect.top + Height;
MoveWindow( &rect );
return TRUE;
void CSimpleBitmapButton::OnLButtonDown(UINT nFlags, CPoint point)
Pushed = TRUE;
Invalidate( FALSE );
CButton::OnLButtonDown(nFlags, point);
void CSimpleBitmapButton::OnLButtonUp(UINT nFlags, CPoint point)
Pushed = FALSE;
Invalidate( FALSE );
CButton::OnLButtonUp(nFlags, point);
将此位图导入资源。
然后为资源 ID 设置 IDB_ROUND_BUTTON。
在对话框中添加按钮并将“Owner Darw”属性设置为 True。 重要!
将按钮的成员变量添加为m_PlayButton。
在对话框标题处,包含 SimpleBitmapButton.h 并将 m_PlayButton 的类从 CButton 更改为 CSimpleBitmapButton。
CSimpleBitmapButton m_Button; // it was CButton m_Button;
最后,在 OnInitDialog() 上设置位图
m_PlayButton.Open( IDB_ROUND_BUTTON );
【讨论】:
请建议业主抽取样本 好的。我添加了更多细节和链接。希望对您有所帮助。 这本质上是一个仅链接的答案,不包含任何有用的信息,以防链接到的资源不可用。 知道了。如果@sumanreddy 告诉我他/她想要实现哪种方式,我将使用 MFC 制作一些示例代码。 @Jin 你为什么不从使用位图图像开始。我确实尝试过,但是一旦我运行代码按钮就消失了(使用 2-2 链接代码)以上是关于MFC 中创建Dlg的问题的主要内容,如果未能解决你的问题,请参考以下文章
创建共享 MFC 对话框:常规 DLL 或 MFC 扩展 DLL