- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
1997年,我用C++编写了一个MDI MFC程序。
我创建了一个名为 XFormFiew 的类,它扩展了 MFC CFormView 类。
在 OnInitialUpdate()
事件方法中,我写了一些代码来自动修改 View 的缩放。
过去,大多数屏幕分辨率为 800x600,但现在分辨率更高。在 XFormView
中自动缩放时,我避免在所有 View 中进行一些修改。
缩放代码修改了 Left 和 Bottom,还修改了事件 CFormView
中包含的每个 CWnd
的 Width 和 Height
代码如下
void XFormView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
pLogFont = new LOGFONT;
CFont* pDialogFont = GetFont();
pDialogFont->GetObject(sizeof(LOGFONT),pLogFont);
pLogFont->lfHeight = MulDiv(pLogFont->lfHeight, Config.GetDstH(), Config.GetSrcH());
pLogFont->lfWeight = FW_NORMAL;
pFont = new CFont;
pFont->CreateFontIndirect(pLogFont);
SetFont(pFont);
CWnd* pWnd;
pWnd = GetWindow(GW_CHILD);
while (pWnd != NULL)
{
ZoomWnd(pWnd);
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
// TRY to modify WIDTH and HEIGTH of CFormView
ZoomWnd(this);
}
void XFormView::ZoomWnd(CWnd* pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.left = (int)((long)rect.left * Config.GetDstH() / Config.GetSrcH());
rect.top = (int)((long)rect.top * Config.GetDstV() / Config.GetSrcV());
rect.right = (int)((long)rect.right * Config.GetDstH() / Config.GetSrcH());
rect.bottom = (int)((long)rect.bottom * Config.GetDstV() / Config.GetSrcV());
pWnd->MoveWindow(&rect);
pWnd->SetFont(pFont);
}
代码运行良好,但对于某些 View ,缺少垂直和水平滚动条。
窗口总是加载最大化。如果我取消最大化窗口,滚动条总是丢失。
如果我减少 WIDTH 或 HEIGHT,当宽度或高度达到 RC 资源文件中定义的值时,将显示滚动条。
示例:
IDD_OVFORM DIALOGEX 0, 0, 370, 297
其中 370 是 Form 的宽度,297 是高度。
如果我减小子窗口的宽度,在宽度减小到 370 之前什么都不会发生。此时会自动显示一个水平滚动条。
我的问题是如何动态更改(不是在 RC 文件中)IDD_OVFORM 的宽度和高度以对应缩放级别,以便正确显示水平和垂直滚动条?
我已经尝试在 OnInitialUpdate() 方法中更改这些属性,但没有任何效果。
如果我在 RC 资源文件中更改宽度和高度,则缩放对于特定缩放级别(但不是所有缩放级别)都可以正常工作。
在 Internet 上,我找到了一些关于删除滚动条但没有关于使用 MDI MFC 窗体缩放和滚动条丢失的解决方案。
有没有人已经找到解决这个问题的方法?
2019-02-12:感谢 Barmak Shemirani 的完美解决方案(选项 3)。
最佳答案
调用 SetScrollSizes
以特定尺寸显示滚动条:
CRect rect;
GetClientRect(rect);
//this multiplication is to make sure the scrollbar is visible
//remove it in actual code.
rect.right *= 2;
rect.bottom *= 2;
SetScrollSizes(MM_TEXT, rect.Size());
但这不是一般的正确方法。
选项 1:
您可以转到资源编辑器,选择对话框,选择对话框的属性,然后更改对话框的默认字体大小。将字体大小增加到 9 或更大,这将自动使对话框及其控件变大,并使用更大的字体。
选项 2:
在对话框的属性中,您还会看到一个名为“动态布局”的部分。这使您可以在调整大小时缩放控件,或将它们向上/向下和向左/向右移动。
选项 3:
在运行时更改对话框模板中的字体。为此,您必须覆盖 CFormView::Create
,后者又会调用 CreateDlg
。这些函数名称必须完全如下声明。
请注意,对话框模板中的字体只能在加载对话框之前更改一次。
Visual Studio 2017 示例(此代码可能与旧版 MFC 不兼容)
BOOL XFormView::CreateDlg(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
{
CDialogTemplate dlt;
if(dlt.Load(lpszTemplateName)))
{
// set your own font
dlt.SetFont(L"Arial", 20);
HINSTANCE hInst = AfxFindResourceHandle(lpszTemplateName, RT_DIALOG);
LPCDLGTEMPLATE dlgtemplate = (LPCDLGTEMPLATE)GlobalLock(dlt.m_hTemplate);
// create a modeless dialog
BOOL bSuccess = CreateDlgIndirect(dlgtemplate, pParentWnd, hInst);
GlobalUnlock(dlt.m_hTemplate);
return bSuccess;
}
return CFormView::CreateDlg(lpszTemplateName, pParentWnd);
}
BOOL XFormView::Create
( LPCTSTR lpszClassName
, LPCTSTR lpszWindowName
, DWORD dwRequestedStyle
, const RECT& rect
, CWnd* pParentWnd
, UINT nID
, CCreateContext* pContext
);
{
ASSERT(pParentWnd != NULL);
ASSERT(m_lpszTemplateName != NULL);
m_pCreateContext = pContext; // save state for later OnCreate
// call PreCreateWindow to get prefered extended style
CREATESTRUCT cs;
memset(&cs, 0, sizeof(CREATESTRUCT));
if(dwRequestedStyle == 0)
dwRequestedStyle = AFX_WS_DEFAULT_VIEW;
cs.style = dwRequestedStyle;
if(!PreCreateWindow(cs))
return FALSE;
// create a modeless dialog
if(!CreateDlg(m_lpszTemplateName, pParentWnd))
return FALSE;
m_pCreateContext = NULL;
ModifyStyle(WS_BORDER | WS_CAPTION, cs.style & (WS_BORDER | WS_CAPTION));
ModifyStyleEx(WS_EX_CLIENTEDGE, cs.dwExStyle & WS_EX_CLIENTEDGE);
SetDlgCtrlID(nID);
CRect rectTemplate;
GetWindowRect(rectTemplate);
SetScrollSizes(MM_TEXT, rectTemplate.Size());
// initialize controls etc
if(!ExecuteDlgInit(m_lpszTemplateName))
return FALSE;
// force the size requested
SetWindowPos(NULL, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_NOZORDER | SWP_NOACTIVATE);
// make visible if requested
if(dwRequestedStyle & WS_VISIBLE)
ShowWindow(SW_NORMAL);
return TRUE;
}
XFormView.h 中的类定义必须包含以下几行
protected:
BOOL Create
( LPCTSTR lpszClassName
, LPCTSTR lpszWindowName
, DWORD dwRequestedStyle
, const RECT& rect
, CWnd* pParentWnd
, UINT nID
, CCreateContext* pContext
);
BOOL CreateDlg(LPCTSTR lpszTemplateName, CWnd* pParentWnd);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
OnCreate
声明是绝对必要的。
没有这个声明,什么也不会发生!!!
OnCreate
仅在包含文件中声明,未在 CPP 文件中定义。
关于c++ - 如何在 MDI MFC C++ Windows 应用程序中动态更改 CFormView WIDTH 或 HEIGHT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54444723/
我创建了一个没有文档/ View 支持的 SDI MFC 应用程序。 MFC 模板为我提供了一个带有空白窗口(和菜单等)的应用程序 我想在那个主窗口上显示我的 CFormView 对象。 (基于gui
我有一个 CFormView,上面有一些控件。我在我的 CFormView 上实现了一个 OnKeyDown 事件。一切都很好,除了我的事件永远不会被触发,因为焦点在我的 CFormView 中的组合
我有一个 CView,我一直在上面画东西,效果很好。然后我意识到我需要向我的 CView 添加一些控件,如文本框和组合框。所以我试图将我的 CView 转换为没有默认构造函数的 CFormView。但
根据这个 stackoverflow 问题: What is the correct way to programmatically quit an MFC application? 我正在使用 Af
我正在开发一个 View 继承 CFormView 的 SDI 项目。我正在尝试覆盖 CView::OnUpdate ,但编译器会这样提示: 'CMyFormView::OnUpdate' : 'vi
我的 CFormView 派生类的结构如下: class FormViewClass : public CFormView { ... FormViewClass();
我知道如何强制 CDialog 始终位于程序中所有其他窗口的顶部……非模态。如下面的测试方法(代码)所示,您没有使用 *.DoModal 创建。我明白这一点。 void CMFCTestAApp::O
现在我尝试搜索谷歌,但找不到如何创建 3d 文本。我看到它可能使用 OpenGL 或 freetype-gl 等库,但它并没有说太多,特别是一步一步 >.m_hWnd 此外,您可能不想使用源代码中的循
如何将 MFC CFormView 放置在 VS 2008 MFC 功能包中引入的 CDockablePane 中? 最佳答案 检查 BCGSoft使用 cview 执行此操作的示例。类名略有不同,但
在我的应用程序中,我有一个 CFormView 和一个 CTabCtrl,我还有 4 个 CFormView,它们是主 CFormView 的子级,当用户更改时显示/隐藏选定的选项卡。 但是,我找不到
我试过了 MoveWindow(50,50,150,200,TRUE) 在 CMyFormView::OnInitialUpdate(); 此外,我尝试了以下代码 CWinApp::InitInsta
我有一个对话框资源,里面有一些控件,主要是用户和密码编辑控件,绑定(bind)到 CFormView。这样的对话框是一个 300 x 200 像素的小矩形。 当我运行应用程序时,CFrameWindo
我正在使用带有 CFormView 基类的 MFC 单文档界面创建一个 Windows Mobile 6 应用程序。 我将 CBitmapButton 放在 Form/Dialog 资源中,并将它们放
我最近问了this question这让我开始朝着正确的方向前进——至少是为了加载 MFC DLL 并尝试显示 dlg 框。 问题是,典型的对话框作为APP的主窗口是很糟糕的。创建一个新的 exe 项
我是 Visual Studio 2019 社区的初学者。特别是 MFC C++。 这很有挑战性,因为我正在努力寻找好的引用资料和示例。 Youtube 对教程和示例非常有帮助。但是,我发现的所有信息
1997年,我用C++编写了一个MDI MFC程序。 我创建了一个名为 XFormFiew 的类,它扩展了 MFC CFormView 类。 在 OnInitialUpdate() 事件方法中,我写了
我是一名优秀的程序员,十分优秀!