您的位置:首页 > 其它

分享 总结:VC小知识!

2009-08-27 08:40 323 查看
 (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;

   return CFrameWnd::PreCreateWindow(cs);

  }

  (107) 如何改变窗口框架的颜色?

  MDI框架的客户区被另一个窗口的框架所覆盖.为了改变客户区的背景色,你需要重画这个客户窗口.为了做到这点,你要处理消息WM_ERASEBKND产生一个新类,从CWnd继承,姑且称之为CMDIClient.给它加上一个成员变量,

  #include "MDIClient.h"

  class CMainFrame : public CMDIFrameWnd

  {

  ...

  protected:

  CMDIClient m_wndMDIClient;

  }

  在CMainFrame中重载CMDIFrameWnd::OnCreateClient

  BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

  {

   if ( CMDIFrameWnd::OnCreateClient(lpcs, pContext) )

   {

   m_wndMDIClient.SubclassWindow(m_hWndMDIClient);

   return TRUE;

   }

   else

   return FALSE;

  }

  然后就可以加入对消息WM_ERASEBKGND的处理了.

  (108) 如何将应用程序窗口置于屏幕正中?

  要将你的应用程序窗口放置在屏幕正中央,只须在MainFrame的OnCreate函数中加入:

  CenterWindow( GetDesktopWindow() );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: