⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc3.txt

📁 提供100多种VC++操作的方法。很好的。
💻 TXT
📖 第 1 页 / 共 2 页
字号:
(78)在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能

,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框?
MessageBox 函数来自 CWnd 类,所以你只能在从 CWnd 继承的类 ( 如 CView ) 中调用它。但是,MFC 也提供了 AfxMessageBox 

函数,你可以在任何地方调用它。

(79)我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该吧它放到哪儿?
把该变量放到该应用程序类的头文件中的 attribute 处。然后,在程序的任何地方,你都可以用下面的方法来访问该变量:

    CMyApp *app = (CMyApp *)AfxGetApp();
    app->MyGlobalVariable = ...

(80)我听说MFC可以发现内存漏洞,我怎样使用该特性?
如果你在 Debug 菜单中的 Go 选项 ( 不是 Project 菜单中的 Execute 选项 ) 来运行你的应用程序,MFC 应该在程序终止时报

告内存漏洞。如果没有,那么试试运行 MFC Tracer 工具程序 ( 在 VC++ 程序组中 ),并启动跟踪。然后返回应用程序。

(81)我怎样才能在我的应用程序中循环浏览已经打开的文档?
使用CDocTemplate中未公开的GetFirstDocPosition()和GetNextDoc()函数。

(82)才能在我的应用程序中循环浏览已经打开的视?
使用 CDocument 中未公开的 GetFirstViewPosition() 和 GetNextView() 函数。

(83)数PreCreateWindow是干什么用的?
PreCreateWindow 允许你在调用 CreateWindow 之前来改变窗口属性。

(84)该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名?
在 PreCreateWindow 函数中删除 FWS_PREFIXTITLE 标志的窗口样式:

    cs.style &= ~FWS_PREFIXTITLE;

(85)我应该怎样防止MFC在窗口标题栏上添加文档名?
在 PreCreateWindow 函数中删除 FWS_ADDTOTITLE 标志的窗口样式:

    cs.style &= ~FWS_ADDTOTITLE ;

(86)我应该如何改变视窗口的大小?
因为视窗口实际上是框架窗口的子窗口,所以你必须改变框架窗口的大小,而不是改变视窗口。使用 CView 类中的 

GetParentFrame() 函数获得指向框架窗口的指针,然后调用 MoveWindow() 函数来改变框架的大小。这会使变尺寸的视充满框架

窗口。

(87)我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象?
把“delete this”加到 PostNcDestroy 中。这主要用在需要自动删除对象的场合。

(88)为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy?
OnNcDestroy 只被已建立的窗口调用。如果建立窗口失败 ( 如 PreCreateWindow ),则没有窗口处来发送 WM_NCDESTROY 消息。

PostNcDestroy 是在对象窗口被完全删除,在 OnNcDestroy 后,甚至在窗口建立失败之后调用的。

(89)File菜单中的MRU列表是从哪儿来的?列表中的名字放在哪儿了?我怎样才能改变列表中项目的最大值?
在应用程序类的 InitInstance 函数中对 LoadStdProfileSettings 的调用中。该调用接受一个参数 ( 在缺省情况下如果没有传

递值则为 4 )。MRU 文件名是从 INI 文件中调用的。如果你有带有 ID_FILE_MRU_FILE1 的 ID 的菜单选项,它会为调入的 MRU 

列表所替换。如果你改变传递给 LoadStdProfileSettings 的数值 ( 最大为 16 ),则你就改变了所装如文件名的最大值。

(90)我在菜单中添加了新的项。但是,当我选该项时,在状态栏上没有出现任何提示信息。为什么?
打开资源文件中的菜单模板。打开新菜单选项的属性对话框。在对话框的底部的 Prompt 编辑框中,你可以如下指定状态栏上的提

示信息和工具栏上的提示信息 ( 如果你已经建立的工具栏按钮 ):

    Status bar string"nFlying tag

(91)我怎样才能在应用程序的缺省系统菜单中加上一些东西?
系统菜单与其它菜单类似,你可以添加或删除项目,这需要使用 CMenu 类的成员函数。下面的代码在你的系统菜单后面添加一个

新菜单项:

    CMenu *sysmenu;
    sysmenu = m_pMainWnd->GetSystemMenu(FALSE);
    sysmenu->AppendMenu(MF_STRING, 1000, "xxx");
参见 MFC 帮助文件中的 CMenu 类。

(92)我建立了一个对话框。但是当我显示该对话框时,第一个编辑框总是不能获得焦点,我必须单击它来使它获得焦点。我怎样

才能使第一个编辑框在对话框打开时就获得焦点?
打开资源编辑器中的对话框模板。在 Layout 菜单中选择 Tab Order 选项。按你的需求单击对话框中的控制来重新排列这些控制

的 tab 顺序。

(93)我怎样才能使一个窗口具有“always on top”特性?
在调用 OnFileNew 后,在你的 InitInstance 函数中加上下面的代码:

m_pMainWnd->SetWindowPos(&CWnd::wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);

(94)   我要为我的form view添加文档模板。我先建立了对话框模板,然后使用ClassWizard建立了基于CFormView的新类,它也是

从CDocument继承来的。我还建立了相应的资源并在InitInstance中添加了新的文档模板。但是,当我试图运行该程序时,出现了

Assertion信息。为什么?

form 的对话框模板需要些特殊设置以便可用于 CFromView。确保这些设置的最简单方法是使用 AppWizard 来建立 CFormView 应

用程序,并查看 AppWizard 所建立的对话框模板所选择的Styles Properties。你会发现该对话框模板具有下列样式:没有标题栏

、不可见和“Child”。把你的 form view 的对话框属性变成这样就可以了。

(95)   我在一对话框中有一列表框,我需要tabbed列表框中的项目。但是,当我处理含有tab字符(用AddString添加的)的列表项

时,tab被显示成小黑块而没有展开。哪儿出错了?

在对话框模版中,打开列表框的属性。确保选择了“Use Tabstops” 样式。然后,确保在对话框类中 OnInitDialog 函数中调用 

SetTabStops。

(96)  我建立了一个应用程序,并使用了CRecordset类。但是,当我运行该程序时,它试图要访问数据库,并给出“Internal 

Application Error”对话框。我应该怎样做?

通常情况下,当你的程序中向数据库发送信息的 SQL 语句出现问题时才出现该对话框。例如,参见下面的例子:

    set.m_strFilter = "(ZipCode = '27111')";
如果 ZipCode 列被定义为字符串时不会出现问题,如果定义为 long,则会出现“Internal Application Error”对话框,这是由

于类型不匹配的缘故。如果你删除 27111 的单引号,则不会出现问题。当你看到“Internal Application Error”时,最好检查

一下试图要发送给数据库的 SQL 语句。

(97)   我用ClassWizard建立了一个类。但是,我把名字取错了,我想把它从项目中删除,应该如何做?

在 ClassWizard 对话框关闭后,用文件管理器删除新类的 H 和 CPP 文件。然后打开 ClassWizard,它会提示丢失了两个文件,

并询问你该如何做。你可以选择从项目中删除这两个问的按钮。

(98)     当我打开应用程序中的窗口时,我要传递该窗口的矩形尺寸。该矩形指定了窗口的外围大小,但是当我调用

GetClientRect时,所得到的尺寸要比所希望的值要小(因为工具栏和窗口边框的缘故)。有其它方法来计算窗口的尺寸吗?

参见 CWnd::CalcWindowRect。

(99)   我在文档类中设置了一个整型变量。但是,当我试图把该变量写入Serialize函数中的archive文件中时,出现了类型错误

。而文档中的其它变量没有问题。为什么?

archive 类只重载某些类型的 >> 和 << 操作符。“int”类型没有在其中,也许是因为 int 变量在 Windows 3.1 与 Windows 

NT/95 有所不同的缘故吧。“long”类型得到了支持,所以你可以把 int 类型改成 long 型。参见 MFC 帮助文件中 CArchive 类



(100)  如何控制菜单的大小?
我用MFC的CMenu生成了一个动态菜单(例如File,Edit,View...Help), 我想控制这个菜单的大小(长+高).

方法一:查找 WM_MEASUREITEM 和 MEASUREITEMSTRUCT.
方法二:查询系统::GetSystemMetric(SM_CXMENUSIZE).

     /* 你可以通过如下代码来获得文本的大小:
        (A)获得被使用的字体 */

       NONCLIENTMETRICS ncm;
     HFONT hFontMenu;
     SIZE size;
     size.cy = size.cy = 0;

     memset(&ncm, 0, sizeof(NONCLIENTMETRICS));
     ncm.cbSize = sizeof(NONCLIENTMETRICS);
     if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))
     {
          hFontMenu = CreateFontIndirect(&ncm.lfMenuFont);
          /*
          (B) 获得菜单项的文本: */
          char szText[_MAX_PATH];

          pMenu->GetMenuString(0, szText, _MAX_PATH, MF_BYPOSITION);
          /*
          然后,获得菜单项文本的高度: */
          HFONT hFontOld;
          HDC hDC;

          hDC = ::GetDC(NULL);
          hFontOld = (HFONT) ::SelectObject(hDC, hFontMenu);
          GetTextExtentPoint32(hDC, szText, lstrlen(szText), &size);
          SelectObject(hDC, hFontOld);
          ::ReleaseDC(NULL, hDC);
     }

/*此时,size.cy即为高度,size.cx为宽度,你可以给菜单加上自定义的高度和宽度,通过比较,我发现宽度为4

比较合适。*/


(101)  改变LVIS_SELECTED的状态颜色?
我想将CListCtrl项和CTreeCtrl项在LVIS_SELECTED状态时的颜色变灰.

方法一:查找函数CustomDraw,它是IE4提供的公共控制,允许有你自己的代码.
方法二:生成一个draw控件,然后在DrawItem中处理文本颜色.

(102)   如何只存储文档的某一部分?
我只想存储文档的某一部分,能否象使用文件一样使用文档?(也就是有定位函数).将每个CArchive类设置为CFile类的派生类,这样

你就能使用Seek等成员函数.

(103)   保存工具条菜单有bug吗?

使用浮动菜单条时,SaveBarState和LoadBarState出现了问题.如果菜单是浮动的,重起应用程序时它会出现在左上角,而它固定在屏

幕其它位置时,下一次启动就会出现在该位置,这是什么原因?你试试这个PToolBar->Create(this,...,ID_MYTOOLBAR);
你的工具条需要包括id,而不是象默认的工具条那样.

(104)   Tip of the day的bug

我创建了一个简单的mdi应用程序,使用.BSF(自定义的文档扩展名)作为它的文档我保存一个foo.bsf文档后,可以在资源管理器中双

击该文件打开mdi应用程序同时打开foo.bsf文档.但当我给mdi应用程序加上a tip of the day组件之后,从资源管理器中双击

foo.bsf后,就会给我一个警告:ASSERT(::IsWindow(m_hWnd)),然后mdi应用程序就死那了.

当从dde启动应用程序(例如:双击相关文档)时,"Tip of the Day"是有bug的.你可以看看函数"ShowTipAtStartup",它

在"InitInstance"中调用,可以看到tip of the day作为一个模式对话框显示,在处理其它消息时它一直进行消息循环你可心修改

ShowTipAtStartup使其从dde启动时不出现tip of the day.
void CTipOfApp::ShowTipAtStartup(void)
        {
                // CG: This function added by 'Tip of the Day' component.

                CCommandLineInfo cmdInfo;
                ParseCommandLine(cmdInfo);

                if (
                        cmdInfo.m_bShowSplash &&
                        cmdInfo.m_nShellCommand != CCommandLineInf:FileDDE
                        )
     

;           {
                        CTipDlg dlg;
                        if (dlg.m_bStartup)
                                dlg.DoModal();
                }
        }
如果还有其它bug,你可以设定cmdInfo.m_nShellCommand的过滤.

(105)   如何可以让我的程序可以显示在其它的窗口上面?

让用户选择"总是在最上面"最好是在系统菜单里加入一个选项.可以通过修改WM_SYSCOMMAND消息来发送用户的选择.菜单的命令标

识(id)会作为一个参数传给OnSysCommand().要定义标识(id),将如下代码加入到CMainFrame.CPP中:

    #define WM_ALWAYSONTOP WM_USER + 1
将"总在最上面"的菜单项加入到系统菜单中,将如下代码加入到函数CMainFrame::OnCreate()中:

      CMenu* pSysMenu = GetSystemMenu(FALSE);
      pSysMenu->AppendMenu(MF_SEPARATOR);
      pSysMenu->AppendMenu(MF_STRING, WM_ALWAYSONTOP,
                     "&Always On Top");
使用ClassWizard,加入对WM_SYSCOMMAND消息的处理,你应该改变消息过滤器,使用系统可以处理这个消息.
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
    switch ( nID )
    {
    case WM_ALWAYSONTOP:

        if ( GetExStyle() & WS_EX_TOPMOST )
        {
            SetWindowPos(&wndNoTopMost, 0, 0, 0, 0,
                SWP_NOSIZE | SWP_NOMOVE);
            GetSystemMenu(FALSE)->CheckMenuItem(WM_ALWAYSONTOP,



                MF_UNCHECKED);
        }
        else
        {
            SetWindowPos(&wndTopMost, 0, 0, 0, 0,
                SWP_NOSIZE | SWP_NOMOVE);
            GetSystemMenu(FALSE)->CheckMenuItem(WM_ALWAYSONTOP,MF_CHECKED);
        }

        break;

    default:
        CFrameWnd::OnSysCommand(nID, lParam);
    }
}

(106)    如何控制窗口框架的最大最小尺寸?

要控制一个框架的的最大最小尺寸,你需要做两件事情.在CFrameWnd的继承类中处理消息WM_GETMINMAXINFO,结构MINMAXINFO设置了

整个窗口类的限制,因此记住要考虑工具条,卷动条等等的大小.

// 最大最小尺寸的象素点 - 示例
#define MINX 200
#define MINY 300
#define MAXX 300
#define MAXY 400

void CMyFrameWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
    CRect rectWindow;
    GetWindowRect(&rectWindow);

    CRect rectClient;
    GetClientRect(&rectClient);

      // get offset of toolbars, scrollbars, etc.
    int nWidthOffset = rectWindow.Width() - rectClient.Width();
    int nHeightOffset = rectWindow.Height() - rectClient.Height();

    lpMMI->ptMinTrackSize.x = MINX + nWidthOffset;
    lpMMI->ptMinTrackSize.y = MINY + nHeightOffset;
    lpMMI->ptMaxTrackSize.x = MAXX + nWidthOffset;
    lpMMI->ptMaxTrackSize.y = MAXY + nHeightOffset;
}
第二步,在CFrameWnd的继承类的PreCreateWindow函数中去掉WS_MAXIMIZEBOX消息,否则在最大化时你将得不到预料的结果.

BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.style &= ~WS_MAXIMIZEBOX;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -