(1) 当文档被修改时,如何在标题上加上标志'*'?
重载CDocument类的虚函数virtual SetModifiedFlag:
void CTest2Doc::SetModifiedFlag(BOOL bModified)
{
    CString strTitle = GetTitle();
    CString strDirtyFlag = " *"; // note space before the '*'
            // so we don't break Save As dialog

if (!IsModified() && bModified)
    {
        SetTitle(strTitle + strDirtyFlag);
    }
    else if ( IsModified() && !bModified )
    {
        int nTitleLength = strTitle.GetLength();
        int nDirtyLength = strDirtyFlag.GetLength();
        SetTitle( strTitle.Left(nTitleLength - nDirtyLength) );
    }

UpdateFrameCounts();

CDocument::SetModifiedFlag(bModified);
}

(2) VC6.0对VC5.0的兼容性?
很不幸,vc6.0在调试模式对vc5.0不兼容,但发行模式没有问题.原因在微软改变了调试模式所用dll的格式,而保留了原文件名. 因此,不要在vc6.0中打开vc5.0的调试版本工程.

(3) 打印和打印机的问题?
我碰到这么一个问题:在打印方法中使用了MM_LOMETRIC模式,在 LOGFONT结构中改变了字体的大小,但不知道173(或者对于屏幕而言是25)是从哪来的,它是自动的.然而当我用另外一个打印机时173并不适合. 我想知道的是:我如何对所有的打印来调整这个数字.

我以前也碰到过类似的问题,我让用户改变字体(大小,颜色等等).这些改变在屏幕上看起来挺好,但是打印时太小(我的同事 在程序包中加入一个放大类).原因非常简单:打印机的分辨率可能是300dpi,而屏幕的分辨率则低得多.我是这么解决的:在获得屏幕字体信息后,我获取 屏幕字体的毫米级大小(使用LPtoDP,然后将模式变为MM_LOMETRIC,调用DPtoLP),接着对打印机设定了相同的模式,再调用 LPtoDP.切换回原来的模式之后,我调用了DPtoLP,这样就得到了想要的字体高度和宽度. 在LOGFONT中使用这个值,并且带有其它诸如下划线,斜体等字体信息,我实现了用户的要求.

(4) CRichEditCtrl滚动条的问题?
我使用了CRichEditCtrl控制来显示某个文件中的数据(将该控制设置为只读).我已经设置了ES_MULTILINE | ES_AUTOVSCROLL,但当数据内容比控制显示多的时候,滚动条并不出现,是不是因为设置了只读属性而引起了其它的问题?

ES_AUTOVSCROLL | ES_AUTOHSCROLL属性只在控制是可编辑时有效.你可心使用下面的滚动条风格来使滚动条出现:WS_VSCROLL | WS_HSCROLL,但是这样一来,不管你的数据量有多大,滚动条总是会出现.

(5) 从数据库中读大于32k的内容?
我在从数据库中读数据时碰到了问题.当数据栏包含超过32k的内容时,我就读不出来,我试过ODBC::SQLGetData()也不行.

哪种类型的数据库?MS SQL,SYBASE... 试试设置一下大小:
BOOL CGetBlobStmt::Execute(LPCTSTR stmt)
{
m_cbSize = 0;
m_size = 0;
LPBYTE
  lpData;
lpData = (LPBYTE)GlobalLock(m_hData);

m_retcode = SQLSetStmtOption(GetHandle(),SQL_MAX_LENGTH,m_dwBytesLeft);

m_retcode = SQLExecDirect(GetHandle(),(UCHAR*)stmt,SQL_NTS);
if (m_retcode == SQL_SUCCESS)
{
  m_retcode = SQLFetch(GetHandle());
  if (m_retcode == SQL_SUCCESS ||m_retcode == SQL_SUCCESS_WITH_INFO)
  {
   m_retcode = SQLGetData(GetHandle(),1,SQL_C_BINARY,lpData,254,&m_cbSize);
   while(m_retcode == SQL_SUCCESS_WITH_INFO)
   {
    lpData+= 254;
    m_retcode = SQLGetData(GetHandle(),1,SQL_C_BINARY,lpData,254,&m_cbSize);
   }
   GetError();
  }
}
GlobalUnlock(m_hData);
#if TESTDATA
TRACE("%ld",m_size);
#endif

SaveFile();

return RETVALUE;
}

(6) 如何获得CRichEditCtrl中字符的位置?
我想在CRichEditCtrl中使用右键菜单,因此想判定光标处字符的位置,请指点.

查看如下的帮助:
IRichEditOleCallback::GetContextMenu
EM_SETOLECALLBACK

(7) 如何限制mdi子框架最大化时的大小?
用ptMaxTrackSize代替prMaxSize,如下所示:

void CChildFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
   // TOD Add your message handler code here and/or call default
   CChildFrame::OnGetMinMaxInfo(lpMMI);
   lpMMI->ptMaxTrackSize.x = 300;
   lpMMI->ptMaxTrackSize.y = 400;
}

(8) 如何切换视口而不破坏它们?
我创建了一个带有静态分隔区的sdi应用程序,左边显示工作区,右过显示左边选取的东西.我想达到的是如果在分隔区之间进行切换,而不覆盖或破坏原来的CView对象.

以下代码是你所想要的:

class CExSplitterWnd : public CSplitterWnd
{
// Construction
public:
    CExSplitterWnd();
// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CExSplitterWnd)
    //}}AFX_VIRTUAL
// Implementation
    virtual ~CExSplitterWnd();
    BOOL AttachView(CWnd* pView, int row, int col);
    BOOL DetachView(int row, int col);
    // Generated message map functions
    //{{AFX_MSG(CExSplitterWnd)
        // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CExSplitterWnd::CExSplitterWnd()
{
}

CExSplitterWnd::~CExSplitterWnd()
{
}

BOOL CExSplitterWnd::AttachView(CWnd* pView, int row, int col)
{
    //Make sure the splitter window was created
    if (!IsWindow(m_hWnd))
    {
        ASSERT(0);
        TRACE(_T("Create the splitter window before attaching windows to panes"));
        return (FALSE);
    }

//Make sure the row and col indices are within bounds
    if (row >= GetRowCount() || col >= GetColumnCount())
    {
        ASSERT(0);
        return FALSE;
    }

//Is the window to be attached a valid one
    if (pView == NULL || (!IsWindow(pView->m_hWnd)))
    {
        ASSERT(0);
        return FALSE;
    }

pView->SetDlgCtrlID(IdFromRowCol(row, col));
    pView->SetParent(this);
    pView->ShowWindow(SW_SHOW);
    pView->UpdateWindow();
    return (TRUE);
}

BOOL CExSplitterWnd::DetachView(int row, int col)
{
    //Make sure the splitter window was created
    if (!IsWindow(m_hWnd))
    {
        ASSERT(0);
        TRACE(_T("Create the splitter window before attaching windows to panes"));
        return (FALSE);
    }

//Make sure the row and col indices are
    //within bounds
    if (row >= GetRowCount() || col >= GetColumnCount())
    {
        ASSERT(0);
        return FALSE;
    }

CWnd* pWnd = GetPane(row, col);
    if (pWnd == NULL || (!IsWindow(pWnd->m_hWnd)))
    {
        ASSERT(0);
        return FALSE;
    }

pWnd->ShowWindow(SW_HIDE);
    pWnd->UpdateWindow();

//Set the parent window handle to NULL so that this child window is not
    //destroyed when the parent (splitter) is destroyed
    pWnd->SetParent(NULL);
    return (TRUE);
}

(9) 改变列表控制时发生闪烁现象?
我创建了一个简单的对话框,在对话框中设置了一个列表控件,这个控件 占用了对话框的全部客户区.对话框是可以改变大小的,因此我要保证列表控件在对话框中维持正确的位置,在对话框的ONSize()事件中我对列表控件使用 了MoveWindow(),这起到了作用,但当用户改变对话框的大小时,列表控件不停地闪烁.

要解决这个问题,在用MoveWindow之前,先用ShowWindow(SW_HIDE)隐藏列表控件,然后在MoveWindow之后用ShowWindow(SW_SHOW)来显示列表控件.

(10) 处理列表控件可见项的问题?
我在一个列表控件中加入了好多条目.我通过获取某个条目是否可见或最后是哪个条目来进行处理.我看了CListCtrl::GetItem()的帮助,但是没有找到如何判断一个条目是否可见的方法.

如果你只想处理可见的条目,你可以用GetTopIndex.它返回最大可见条目的索引值,然后你再用GetCountPerPage来得到在可见区域的条目数.

(11) 产生线程的问题?
我在使用CreateThread时碰到了问题.我想让调用的函数和被调用的函数属于同一个类,结果在我调用CreateThread时得到如下错误:

error C2440: 'type cast' : cannot convert from 'unsigned long (__stdcall Cdmi::*)(void *)' to 'unsigned long (__stdcall *)(void *)'

方法一:
(i)'unsigned long (__stdcall Cdmi::*)(void *)'是指向Cdmi某个成员函数的指针.
(ii)'unsigned long (__stdcall *)(void *)'仅仅只是一个c形式函数的指针. 编译器无法将(1)转换为(2)是因为c++成员函数取第一个(隐藏)参数"this pointer"作为成员函数,但当是一个静态的成员时则例外.可按如下方法解决.

class XMyThread
{
public:
    void StartThread(void);
    virtual UINT ThreadFunction(void);
    static UINT __bogusthreadfunc(LPVOID lpparam);
};

void XMyThread::StartThread()
{
    AfxBeginThread(__bogusthreadfunc,this);
}

UINT XMyThread::ThreadFunction(void)
{
    //here you do all your real work
    return 0;
}

UINT XMyThread::__bogusthreadfunc(LPVOID lpparam)
{
     XMyThread* This = dynamic_cast(lpparam);
     return This->ThreadFunction();
}

for the sake of clairty, I did not add StopThread and I did not save the
CWinThread* returned by AfxBeginThread.

If you wanted a thread that does other things, simply derive from XMyThread
and override ThreadFunction()

example:
class XAnotherThread : public XMyThread
{
    virtual UINT ThreadFunction(void);
};

UINT XAnotherThread :: ThreadFunction(void)
{
    //do some other work here
    return 0;
}

方法二:Cdmi::MonitorFiles()是个静态的成员函数.

(12) CFile使用了缓冲区吗?
请告诉我CFile到底有没有使用缓冲区来处理文件?

CFile没有使用运行库的I/O缓冲例程,从这个意义上讲CFile并没有使用缓冲.但是有可能操作系统在处理文件时使 用了缓冲区,如果你完全不需要缓冲区,你可以设置FILE_FLAG_NO_BUFFERING.CFile工作在这种模式下的唯一的方法是 CFile::Attach().

(13) DAO的密码?
我创建了一个使用数据库的mfc应用程序.用类模板生成CDaoRecordset直接打开数据库(不通过ODBC),但问题是我如何打开有密码保护的数据库?

方法一:试试下面的代码:

DAODBEngine* pDBEngine = AfxDaoGetEngine();
ASSERT(pDBEngine != NULL);

COleVariant varUserName (strUserName, VT_BSTRT);
COleVariant varPassword (strPassword, VT_BSTRT);

DAO_CHECK(pDBEngine->put_DefaultUser (V_BSTR(&varUserName));
DAO_CHECK(pDBEngine->put_DefaultPassword (V_BSTR(&varPassword));

方法二:你可以使用CDaoDatabase的Open方法来打开:
MyDaoDatabase->Open("C:/MyDatabaseFile.mdb",FALSE,FALSE,";PWD=MyPassWord");
btw:不要忘了PWD=前面的;号.

(14) 如何知道CListBox什么时候滚动了?
每次绘制列表框都要重绘某项,通过消息WM_CTLCOLOR从父窗口获得DC颜色.因此每欠列表框的滚动你都可以用WM_CTLCOLOR来检验是否滚动.

HBRUSH CParentDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   // is the control _the_ list box we're interested in?
   if( nCtlColor == CTLCOLOR_LISTBOX &&
      pWnd->GetDlgCtrlID() == IDC_LIST )
   {
      // if the top index changed, the list box has been scrolled

int iTop = ((CListBox*)pWnd)->GetTopIndex();

if( iTop != m_iTopOld )
      {
         // keeps tracking of the top index changes
         m_iTopOld = iTop;

// process scrolling
         ...
      }
   }

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   return hbr;
}
使用这种方法可以不必为了实现这个功能而去产生一个继承类.

(15) 视口的不活动性如何处理?
有什么方法使CListView成为类似WM_DIASBLED的风格,或者使它和背景色一致.

方法一:你所要做的是处理CListView的WM_SETFOCUS消息,然后在TreeView中调用SetFocus,
这样,ListView就永远不会获得焦点.
    afx_msg void CMyListView::OnSetFocus(CWnd* pOldWnd);
    {
        // assuming m_pwndTreeView points to the valid TreeView
        // on the left side
        m_pwndTreeView->SetFocus();
    }

方法二:重载PreTranslateMessage,然后当消息为WM_LBUTTONDOWN或WM_RBUTTONDOWN时返回真即可.

(16) 如何使用COleClientItem的IDispatch接口?
我创建了一个如何使用 COleClientItem对象,我想使用它的自动化方法.有什么方法来获得IDispatch的接口?我试过以CCmdTarget为基类的的 GetIDispatch函数但却出错,我用过EnableAutomation和GetIDispatch,却什么也没得到.

MSDN中有一篇关于这个的文章(TN039).如下的代码也可能是你所需要的:

LPDISPATCH CMyClientItem::GetIDispatch()
{
    ASSERT_VALID(this);
    ASSERT(m_lpObject != NULL);

LPUNKNOWN lpUnk = m_lpObject;

Run(); // must be running

LPOLELINK lpOleLink = NULL;
    if (m_lpObject->QueryInterface(IID_IOleLink,
        (LPVOID FAR*)&lpOleLink) == NOERROR)
    {
        ASSERT(lpOleLink != NULL);
        lpUnk = NULL;
        if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
        {
            TRACE0("Warning: Link is not connected!/n");
            lpOleLink->Release();
            return NULL;
        }
        ASSERT(lpUnk != NULL);
    }

LPDISPATCH lpDispatch = NULL;
    if (lpUnk->QueryInterface(IID_IDispatch, &lpDispatch)
        != NOERROR)
    {
        TRACE0("Warning: does not support IDispatch!/n");
        return NULL;
    }

ASSERT(lpDispatch != NULL);
    return lpDispatch;
}

(17) 关于用户自定义的消息使用?
我写了一个基于MFC应用程序的对话框,在这个程序中,我创建了等待网络传输 数据的线程,一旦该线程接收到数据,它就传送一个用户自定义的消息到对话框,使对话框知道有数据过来.但是为何在 CMyDialog::PreTranslateMessage(MSG* pMsg)中能捕捉到WM_MYCMD这个消息,却不能和OnMyCommand相映射?

将你所有自定义消息的基类设为WM_APP,而不是WM_USER.

(18) 在打开一个文档时退出?
我有一个mdi程序,在打开文件的处理过程中,我想判断该文档是不是应用程序需要处理的文档,因此,我检测文档中的某个数字是否符合要求,如何在发现不是该文档时出现一个错误提示,然后不打开该文档?

给文档设定某个标志,如果文档不是所要的就设定它.然后OnOpenDocument中检测,当发现标志被设定后返回FALSE.

(19) 在CListCtrl控件中多选择项的删除?

如何从在CListCtrl中删除多个选择项?

按如下方法处理:如果你的在CListCtrl是m_list,to_delete是个整数数组.
i=3D0;
POSITION pos=3Dm_list.GetFirstSelectedItemPosition();
if(pos)
  while(pos)
   to_delete[i++]=3Dm_list.GetNextSelectedItem(pos);
然后用删除保存在to_delete中的项目,用GetSelectedCount来得到已选项的个数.

(20)工作线程的登录状态?
我使用循环删除了用AfxBeginThread创建的线程的好几个实例.每个线程打开一个iNET连接,打开一个URL并返回结果.我需要找出哪一个或者何时这些线程进入到登录状态.

按如下方法处理:(伪代码)

// Start Threads
    for( unsigned u = 0; u < NUMBER_OF_THREADS; u++ )
{
    ThreadHandleArray[ u ] = AfxBeginThread( ...... )->m_hThread;
}

DWORD count = NUMBER_OF_THREADS
DWORD dwWait;

while( count )
{
    dwWait = ::WaitForMultipleObjects( count, ThreadHandleArray, FALSE,
INFINITE );

if( dwWait >= WAIT_OBJECT_0 && dwWait < ( WAIT_OBJECT_0 + count ) )
    {
        dwWait -= WAIT_OBJECT_0;
        // dwWait now has index to thread that completed do whatever
you want to do with it
        // set array back up for next wait
        if( dwWait != ( count - 1 ) )
            ThreadHandleArray[ dwWait ] = ThreadHandleArray[
count - 1 ];
            count--;
    }
}

(21) 如何增加视图中ActiveX控件的事件处理函数?
如果我在对话框中加入微软的网络浏览器,很容易通过类模板加入对事件的处理.但我现在在视图中用m_pBrowser=new CWebBrowser2加入了网络浏览器,我该如何对事件进行处理?

到www.vcdj.com(inet 章节)去看看,有一篇文章名为"Building a Webbrowser in a Afternoon".如下的代码也可能是你所需要的:

#include // For AFX_EVENT def.

BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
    AFX_EVENT *pEvent = (AFX_EVENT *)pExtra;

//If this is a control notification event.
    if (nCode == CN_EVENT)
    {
        // If we have information on this event.
        if (pEvent)
        {
            // Event DISPID is stored at pEvent->m_dispid
            // Event DISPPARAMS are stored at pEvent->m_pDispParams
            // Handle the event from here...
        }
    }

return CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

(22) 如何创建一个动态的Tree控件?
我想创建一个动态的tree控件,就象弹出窗口一样,但它并不象想象中那么容易.

方法一:用CreateWindow(SDK)创建风格为WS_POPUP,WS_CAPTION和WS_TICKFRAME的窗口,并作为父窗口.

方法二:创建一个包含Tree控件的对话框.

(23) SDI程序开始时不打开文档?
我创建了一个SDI应用,但每次启动时它都会打开一个文档("untitled"),如何不让它打开该文档呢?

看看InitInstance函数中有没有关于OnFileNew的调用,去掉它即可.

(24) List控件中整栏选择?
我在处理List控件时碰到了麻烦,我想创建一个ListView,来依据Tree控件的选择同时在ListView和ReportView中显示列表的信息.以下是相关的代码:

// Set full line select
ListView_SetExtendedListViewStyle(m_plstCustomers->GetSafeHwnd(),
LVS_EX_FULLROWSELECT);

按如下方法处理:

// -------------------- begin of snippet --------------------------------
bool CCommCtrlUtil32::ListCtrl_ModifyExtendedStyle(CListCtrl& p_rListCtrl,
                                   const DWORD p_dwStyleEx,
                                   const bool p_bAdd)
{
    HWND t_hWnd = p_rListCtrl.GetSafeHwnd();
    DWORD t_dwStyleEx = ListView_GetExtendedListViewStyle(t_hWnd);

if(p_bAdd)
    {
        if(0 == (p_dwStyleEx & t_dwStyleEx))
        {
            // add style
            t_dwStyleEx |= p_dwStyleEx;
        }
    }
    else
    {
        if(0 != (p_dwStyleEx & t_dwStyleEx))
        {
            // remove style
            t_dwStyleEx &= ~p_dwStyleEx;
        }
    }

ListView_SetExtendedListViewStyle(t_hWnd, t_dwStyleEx);

return true;
}

(25) 如何重载MRU文件?
我创建了一个应用程序可以载入图象文件,但当我点击FILE菜单下MRU文件列表时,却不能从磁盘载入以前曾经打开过的文件.

下面是我所能想到的解决方案:
(i)在文档类中定义一个成员函数(例如:CMyDoc::Reopen)来处理重新打开这个问题,指明参数和返回值.
(ii)产生一个CMultiDocTemplate的继承类(如CMyDocTemplate),定义一个构造函数,取和基类相同的参数,不做任何事,只是调用基类的构造函数.
(iii)重载MatchDocType:
CMyDocTemplate::Confidence CMyDocTemplate::MatchDocType(
    LPCTSTR lpszPath,
    CDocument *&rpDocMatch
    )
{
    Confidence match = CMultiDocTemplate::MatchDocType(lpszPath, rpDocMatch);

if(yesAlreadyOpen == match) // clear enough
    {
        ASSERT_KINDOF(CMyDoc, rpDocMatch);
        ((CMyDoc *) rpDocMatch)->Reopen(/* your parameters */);

// you can take any other actions here...
    }

return match;
}
当这个函数返回"yesAlreadyOpen"时,你的文档框架将会被激活.

(26) CImageList控件中图象橙色被显示为黄色?
我使用了一个CImageList控件来装入位图,用于TREE控件,其它的色彩都很正常就是橙色被显示成为黄色.

你只能使用系统指定的20种颜色(橙色不包括在内);当然,你也可以用下面的方法来装载位图资源而不受颜色数的限制.

HBITMAP LoadResourceBitmap(HINSTANCE hInstance, LPSTR lpString,
                           HPALETTE FAR* lphPalette)
{
    HRSRC hRsrc;
    HGLOBAL hGlobal;
    HBITMAP hBitmapFinal = NULL;
    LPBITMAPINFOHEADER lpbi;
    HDC hdc;
    int iNumColors;
    if (hRsrc = ::FindResource(hInstance, lpString, RT_BITMAP))
{
  hGlobal = ::LoadResource(hInstance, hRsrc);
  lpbi = (LPBITMAPINFOHEADER)LockResource(hGlobal);
  hdc = ::GetDC(NULL);
  *lphPalette = CreateDIBPalette ((LPBITMAPINFO)lpbi, &iNumColors);
  if (*lphPalette)
  {
   ::SelectPalette(hdc,*lphPalette,FALSE);
   ::RealizePalette(hdc);
  }
  hBitmapFinal = ::CreateDIBitmap(hdc,
       (LPBITMAPINFOHEADER)lpbi,
       (LONG)CBM_INIT,
       (LPSTR)lpbi + lpbi->biSize + iNumColors * sizeof(RGBQUAD),
                   (LPBITMAPINFO)lpbi,
                   DIB_RGB_COLORS );
  ::ReleaseDC(NULL,hdc);
// ::UnlockResource(hGlobal);
// ::FreeResource(hGlobal);
}
    return (hBitmapFinal);
}

// internally used by LoadResourceBitmap
HPALETTE CreateDIBPalette (LPBITMAPINFO lpbmi, LPINT lpiNumColors)
{
LPBITMAPINFOHEADER lpbi;
LPLOGPALETTE lpPal;
HANDLE hLogPal;
HPALETTE hPal = NULL;
int i;
lpbi = (LPBITMAPINFOHEADER)lpbmi;
if (lpbi->biBitCount <= 8)
  *lpiNumColors = (1 << lpbi->biBitCount);
else
  *lpiNumColors = 0; // No palette needed for 24 BPP DIB
if (lpbi->biClrUsed > 0)
  *lpiNumColors = lpbi->biClrUsed; // Use biClrUsed
if (*lpiNumColors)
{
  hLogPal = GlobalAlloc (GHND, sizeof (LOGPALETTE) +
   sizeof (PALETTEENTRY) * (*lpiNumColors));
  lpPal = (LPLOGPALETTE) GlobalLock (hLogPal);
  lpPal->palVersion = 0x300;
  lpPal->palNumEntries = *lpiNumColors;
  for (i = 0; i < *lpiNumColors; i++)
  {
   lpPal->pal
PalEntry.
peRed = lpbmi->bmiColors.rgbRed;
   lpPal->palPalEntry.peGreen = lpbmi->bmiColors.rgbGreen;
   lpPal->palPalEntry.peBlue = lpbmi->bmiColors.rgbBlue;
   if (i<=10 || i>=246)
    lpPal->palPalEntry.peFlags = PC_NOCOLLAPSE;
   else
    lpPal->palPalEntry.peFlags = 0;
  }
  hPal = CreatePalette (lpPal);
  GlobalUnlock (hLogPal);
  GlobalFree (hLogPal);
}
return hPal;
}
该函数也重载了位图调色板,这个功能被CBitmap::LoadBitmap忽略了(它假定位图只使用20种颜色).因此要保证在DC中有SelectPalette和RealizePalette.

(27) 无法正确改变应用程序的图标?
我有一个基于对话框的应用程序,在初始化时我使用了AfxGetApp()->LoadIcon(IDI_BRIEFCASE)来载入自己的图标,当把程序拷贝到桌面上时,图标是我所期望的.但在资源管理器中的图标却还是MFC的图标.

资源管理器仅使用16x16的小图标,可能你在资源编辑器中只修改了32x32的标准图标.你需要重建16x16的小图标.

(28) 工具条状态的问题?
在应用程序中我创建了三个工具条,我想让它们在应用程序启动的时候排成一行正好在主菜单的下面,我该如何去做?

在VC CDs上有一个例子:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//other stuff here...

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar,AFX_IDW_DOCKBAR_TOP);
    DockControlBarLeftOf(&m_wndListToolBar,&m_wndToolBar);

return 0;
}

void CMainFrame::DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf)
{
    CRect rect;
    DWORD dw;
    UINT n;

// get MFC to adjust the dimensions of all docked ToolBars
    // so that GetWindowRect will be accurate
    RecalcLayout();
    LeftOf->GetWindowRect(&rect);
    rect.OffsetRect(1,0);
    dw=LeftOf->GetBarStyle();
    n = 0;
    n = (dw & CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP :n;
    n = (dw & CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM :n;
    n = (dw & CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT :n;
    n = (dw & CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT :n;

// When we take the default parameters on rect, DockControlBar will dock
    // each Toolbar on a seperate line. By calculating a rectangle, we in effect
    // are simulating a Toolbar being dragged to that location and docked.
    DockControlBar(Bar,n,&rect);
}

(29) 在SDI应用程序中使用Active控件?
我刚了解到如何在MFC应用程序中使用Active控件,文档上说只能在视图为CFormView和CDialog时使用,但要是其它的情况该怎么办呢?

你可以在你应用程序的任何地方使用Active控件,而不仅仅局限于CFormView和CDialog为视图基类的情 况.DevStudio通过资源编辑器和对话框模板来使得在上述两个条件下使用Active控件更容易.因此,你也可以在任何视图中使用Active控 件,条件是你直接操纵该控件,创建它并手工的布置好它的位置(这也是DevStudio为你所做的事).

(30) 有RichEdit控件的对话框无法正常显示?
我在对话框中放置了一个RichEdit控件,但是对话框却无法正常显示.

在你的应用程序InitInstance()中调用了::AfxInitRichEdit()吗?

VC 编程技巧 (四)相关推荐

  1. 【VC编程技巧】窗口☞3.4利用bitmap改变对话框的背景。

    效果图: 代码: 1.在对话框初始化函数OnInitDialog中载入bitmap,然后创建新的画刷. // CBitmapDemoDlg メッセージ ハンドラーBOOL CBitmapDemoDlg ...

  2. 大量C语言、C++、C#、VC编程相关书籍下载

    大量C语言.C++.C#.VC编程相关书籍下载 http://www.juntuan.net/dh/CYYdowmload.htm C语言 C语言编程宝典大全 C语言实例教程 1.72 C语言程序基础 ...

  3. VC++ 常用编程技巧总结

    VC++6.0的使用以及编程技巧整理 1.MDI子窗口一启动就最大化      BOOL   CChildFrame::PreCreateWindow(CREATESTRUCT&   cs) ...

  4. VC++动态链接库(DLL)编程(四)――MFC扩展 DLL

    VC++动态链接库(DLL)编程(四) ――MFC扩展 DLL 作者:宋宝华  e-mail:21cnbao@21cn.com   前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细 ...

  5. vc++ 编程 经典电子书

    完整版目录都在这里了:http://www.cctry.com/forum-46-1.html C.C++ 语言: 一个月挑战C++ http://www.cctry.com/thread-778-1 ...

  6. VC雕虫小技集(四)

    原文: VC雕虫小技集(四) VC雕虫小技集(四) 何志丹 1, 阅读程序常常要看此变量在那些地方值改变过 ctrl+f查找太麻烦 将此变量前加const 改变的地方报错 :office" ...

  7. 很全的linux网络编程技巧

    注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意. 本文转自:https://www.cnblogs.com/jfyl1573/p/6476607.html 看到好文章想留做自己学习,如有侵权, ...

  8. 你不知道的18个Python高效编程技巧

    来源 | Python编程时光 初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行 ...

  9. 关于ThinkPHP的一些编程技巧

    在TP学习过程中难免会遇到一些大大小小的问题,把这些问题积累下来就可以在以后遇到时能很快速的解决,提高编程效率. 1.让Runtime下的文件格式化:入口文件处:define('STRIP_RUNTI ...

最新文章

  1. Jmeter 压测 http(s)
  2. 15个相当不错的jQuery技巧
  3. VTK:Math之1DTupleInterpolation
  4. HihoCoder - 1828 Saving Tang Monk II(bfs+动态规划/bfs+优先队列)
  5. 如何选择适合自己的CMS建站系统
  6. 136_Power BI 自定义矩阵热力图
  7. PHP学习笔记十九【析构函数】
  8. Axure RP 9 最新版授权与汉化
  9. Java权限管理系统之数据库设计(一)
  10. 用sokit发送http请求和响应
  11. dm7达梦7Linux安装包,【达梦】DM7安装部署 2 安装达梦7数据库软件
  12. NLPIR python测试
  13. 百度服务器保存信息多久,百度识图会保存图片在服务器上吗?
  14. Yasm的作用及NASM详解
  15. python复制excel图片_python批量导出excel区域图片
  16. 宏病毒的研究与实例分析01——基础篇
  17. Github创建个人博客
  18. TikTok跨境电商:TikTok是中国的吗?发展趋势是什么样的?
  19. java button中文乱码_java解决中文乱码的几种写法
  20. 银行考试计算机基础知识及答案,银行考试计算机基础知识试题及答案-精品

热门文章

  1. DSP ADAU1452输入与ASRC之间的关系
  2. 信号发生器基础知识学习
  3. 复变函数与积分变换matlab,《复变函数与积分变换》课程教学与MATLAB应用
  4. 对近期的学习内容进行一个梳理总结
  5. 系统流程图与数据流图的联系与区别
  6. 珊瑚虫QQ/TM增强包4.1正式版发布(转)
  7. ADC芯片3421驱动程序
  8. matlab2016a中drtoolbox工具箱安装
  9. 奇洛金卡达 father.cpp
  10. 「自然语言处理(NLP)」神经机器翻译(NMT)论文整理(一)