??xml version="1.0" encoding="utf-8" standalone="yes"?> 如何抛出QthrowQ由CUserExceptionz的异常? 当我试图捕获QcatchQ一个派生类异常Ӟ我得C下错?error C2039:'classCMyException': is
not a member of 'CMyException' 'classCMyException': undeclared
identifier 'IsKindOf': cannot convert parameter 1 from 'int*' to 'const
struct CRuntimeClass*" 异常cM定要从CUserException中派生出来吗Q?/strong> 不,CUserException中的"User"仅仅指用户生的异常。而把它当作你所能派生的唯一异常是种常见的误解?/p>
如何从HDC建立一个CDCc? 有时Windows API会l你一个DC句柄Q你可以通过它徏立一个CDCcR例如:下拉式列表、组合框和按钮。通过hDC你将接收到绘制消息。下面是HDC转换成你更熟悉的CDC的程序段。你也可以将该技巧用在其他Q何MFCcdWindows句柄的{换中?/p>
如何从磁盘上d256色位图文Ӟ 当前QMFCq不支持直接d和显CDIB文g和BMP文g。然而,有很多样例应用程序能够说明如何完成该Q务。第一个例子是MFC样例E序
DIBLOOK。样例MULTDOCS用DIBLOOK提供的相同源代码来读取ƈ昄DIB文g和BMP文g。其他两个VC++中附带的例子是SDK软g
包中的DIBVIEWE序和SHOWDIBE序?/p>
如何改变一个视囄大小Q?/strong> 通常Q你可以调用函数MoveWindowQ)来改变窗口的大小。在用MFC库开发的应用E序中,
视图是被框架H口所围绕的一个子H口。ؓ了改变一个视囄大小Q你可以通过调用函数GetParentFrame()来得到框架窗口的指针Q然后调用函?
MoveWindow()来改变父H口的大。当父框架窗口改变大时Q视图也会自动地改变大小来适应父窗口?/p>
如何改变一个CFormView的大? 要想详细了解的话Q你可以看有关Visual CQ+基础知识的文章Q98598 《Using CFormView in SDI and
MDI
Applications》。基本上Q在从CFormViewcL生出来的cMQ你必须覆盖函数OnInitialUpdate()。其他有兛_?
CFormView的细节问题,可以从该文章中获得?/p>
如何使用一个文档模板的新视图? 在用AppWizard创徏的应用程序中Q你有两U选择Q改变当前视囄z关系或者徏立一个新视图q且在你的MDIE序中同时利用新视图和原先的视图?br>
如何改变视图的背景色Q?/strong> 你可以通过处理WM_ERASEBKGND消息来改变CView、CFrameWnd或CWnd对象的背景色。请看如下的E序D: 如何得到当前视图Q?/strong> 最x法是视囑ֽ作一个参数来传递。如果不能这样做Q但你确信它是当前激zL档和当前Ȁz视囄话,你也可以得到该视图。具体细节见Visual
C++文章Q108587《Get Current CDocument or CView from Anywhere》?/p>
如何在一个文中建立多个视图Q?/strong> CDocTemplate::CreateNewFrame()函数创徏MFC
MDI应用E序中的文的附加视图。ؓ了调用该函数Q要指定一个指向CDocument对象Q指ؓ之徏立视囄文Q的指针和一个指向可从中复制属性的
框架H口的指针。一般情形下Q该函数的第二个参数为NULL? 如何在MDIE序中得到所有的视图Q?/strong> 你必ȝ一些文中没有记蝲的函敎ͼ 你还需要与CWinApp的成员m_templateList打交道?br>
注意Q在MFC 版本4.0中已改变。现在已l有一个叫CDocManager的类可以帮助你显C所有的视图和文档。请参考《MFC Internals》获得更详细的信息?/p>
如何建立一个可用鼠标拉动的CScrollViewc?/strong> 在CIS上从MSMFC库下载AUTOSV.LZH。这个程序告诉你如何实现一个辅助消息@环来理鼠标的活动,q提供了钩挂来对代码q行定制。这是一个免费Y件?/p>
一定要用视?文l构吗? MFCq不一定要求你使用文/视图l构。查看HELLO?MDI和HELLOAPP例子―它们就没有用U结构。大多数MFCҎ都可以在非文/视图应用E序中得到运用。但是当你不用文?/ 视图l构Ӟ你确实会失去一些特性,例如打印预览和许多OLEҎ?/p>
如何得到当前文Q?/strong> 误l参?如何得到当前视图Q?章节?/p>
文档何时被析构? 在SDIE序中,E序退出后文档p删除。在MDIE序中,与该文档相关的最后一个视囑օ闭时文p删除。ؓ了在SDI和MDI中同时用q个文Q你应该在虚函数DeleteContents()函数中删除该文档的数据,而不是在析构器中?/p>
如何建立多文档? Z加入寚w加文类型的支持Q你可以在CWinAppzcM创徏和注册附加CmultiDocTemplate对象。这U方法已l在MULTDOCS样例E序中得以说明。将一个附加文类型加入到MFCE序的一般步骤如下: 用AppWizard来创Z个新的文档类和视囄? 如何得到一个打开文档的列表? 下面的程序段指明如何得到用CDocTemplate对象建立的所有文的指针列表?br>
下面的程序段中,CMyApp由CWinAppz而来。变量m_templateList是一个CPtrList对象Q它是CwinApp的成员变量,
包含一个所有文模板指针的列表。文模板函数GetFirstDocPosition()和GetNextDoc()被用来在文档模板列表中进行P代来
得到每一个文模ѝ?/p>
在参考手册或在线帮助中,有两个CdocTemplatecȝ公共成员函数没有被说明。然而, q些公共成员函数在CDocTemplatecM被定义,q且为在打开文的列表中前后搜烦提供了简单的支持?/p>
q些函数如下Q?br>
注意Q这仅对MFC3.2版本或更低版本有效,对MFC4.0版本请参考下面: 如何使我的程序在启动时不创徏一个新文Q?/strong> 在程序的InitInstance中的ProcessShellCommand函数之前加入Q?cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing Q-Q? 下面是常见的Afx全局函数Q?/p>
AfxFormatString1Q类似printf一般地字W串格式?/p>
AfxFormatString2Q类似printf一般地字W串格式?/p>
AfxMessageBoxQ类似Windows API 函数 MessageBox AfxOuputDebugStringQ将字符串输往除错装置 AfxGetAppQ获得application object (CwinAppz对象)的指?/p>
AfxGetMainWndQ获得程序主H口的指?/p>
AfxGetInstanceQ获得程序的instance handle Q二Q? CString 与char []之间的{? 在VC中,恐怕这两个是经常要q行转换的吧 char str[10] = ”str”; CString sstr = “sstr”; sstr.Format(“%s”,str); strcpy(str,(LPCTSTR)sstr); Q三Q? 关闭E序: PostQuitMessage(WM_CLOSE); 或者PostQuitMessage(WM_DESTROY); 更绝的是关闭所有的E序Q?:ExitWindows (); Q四Q? 在关闭窗口时Q当要对文gq行保存Ӟ可在q里d函数Q?/p>
1.Q在CMainFrame里的OnCloseQ)里,用MessageBox("内容","标题",l合形式);l合形式可以查看MSDN的MESSAGEBOX( ) Function 2.Q在CXXXDoc::SaveModified() 里,只能用AfxMessageBox(""); 不能用MessageBoxQ)函数 Q五Q? 如何修改H体的标题: 1.Q修改主H口的标题:m_pMainWnd->SetWindowText("你的标题"); 2.Q如果在你的documentcMq行改,则直接调用SetTitle("...")Q如果在你的viewcM改,则GetDocument()->SetTitle("...") 3.Q如果想使窗口的标题全部替换Q则用:AfxGetMainWnd()->SetWindowText("你的标题"); Q六Q? 得到H体的标题: 1.QAfxGetMainWnd()->GetWindowText(); 2.Q先FindWindow()扑ֈH口的HWND,在GetWindowText(); Q七Q? 在多文档/视图中: 1.Q子H口的最大化Q?/p>
void CChildFrame::ActivateFrame(int nCmdShow) { // TODO: Add your specialized code here and/or call the base class nCmdShow=SW_MAXIMIZE; CMDIChildWnd::ActivateFrame(nCmdShow); } 2.Q屏蔽子对话框:在APPc里把这两句话屏蔽掉 if (!ProcessShellCommand(cmdInfo)) return FALSE; 3.Q关闭子H口Q?/p>
::SendMessage(::AfxGetMainWnd()->m_hWnd, WM_COMMAND,ID_FILE_CLOSE,0); Q八Q? 在装q自定义的光标后Q在Ud的过E中Q鼠标的形状L在自定义和默认的光标之间晃动Q可以这栯冻I在视中的PreCreateWindowQ)中加入如下几句: BOOL CXXXXView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.lpszClass =AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0, (HBRUSH)::GetStockObject (WHITE_BRUSH),0); return CView::PreCreateWindow(cs); } Q九Q? 怎样止改变H口的大和不能Ud的窗口: ?CMainFrame的OnCreate函数中加入: CMenu *pTopMenu=GetSystemMenu(false); pTopMenu->RemoveMenu(4,MF_BYPOSITION);//最大化H口不可?/p>
pTopMenu->RemoveMenu(2,MF_BYPOSITION);//size pTopMenu->RemoveMenu(1,MF_BYPOSITION);//使不可移?/p>
Q十Q?使窗口始l在最前方Q?/p>
只要在AppcM的InitInstance()函数中加入以下代码就可以? BOOL CwindowOnTopApp:: InitInstance() { //此处略去了VC自动生成的代?/p>
m_pMainWnd->showWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); m_pMainWnd->SetWindowPos(&CWnd::WndTopMost,0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); Return true; } 转蝲Q留待以后查看?br> awatch 指定一个变量,如果q个变量被读或者被写,则暂停程序运行,在调试器中显CZ息,q等待下一个调试命令。参?span lang="EN-US">rwatch?span lang="EN-US">watch命o?span lang="EN-US"> backtrace 昄函数调用得所有栈框架Q?span lang="EN-US">stack framesQ的 t迹和当前函数的参数的|bt是这个命令的写?span lang="EN-US"> break 讄一个断点,q个命o需要指定代码行或者函数名作ؓ参数 clear 删除一个断点,q个命o需要制定代码行或者函数名作ؓ参数 continue 调试器停止的地方l箋执行 Ctrl-C 在当前位|停止执行正在执行的E序Q断点在当前?span lang="EN-US"> disable 止断点功能Q这个命令需要禁止的断点在断点列表烦引g为参?span lang="EN-US"> display 在断点的停止的地方,昄指定的表辑ּ的倹{(昄变量Q?span lang="EN-US"> enable 允许断点功能Q这个命令需要允许的断点在断点列表烦引g为参?span lang="EN-US"> finish l箋执行Q知道当前函数返?span lang="EN-US"> ignore 忽略某个断点制定的次数。例Q?span lang="EN-US">ignore 4 23 忽略断点4?span lang="EN-US">23ơ运行,在第24ơ的时候中?span lang="EN-US"> info breakpoints 查看断点信息 info display 查看讄的需要显C的表达式的信息 kill l止当前debug的进E?span lang="EN-US"> list 昄10行代码。如果没有提供参数给q个命oQ则从当前行开始显C?span lang="EN-US">10行代码?span lang="EN-US"> load 动态蝲入一个可执行文g到调试器?span lang="EN-US"> next 执行下一行的源代码的所有指令。如果是函数调用Q则也当作一行源代码Q执行到此函数返?span lang="EN-US"> nexti 执行下一行的源代码中的一条汇~指?span lang="EN-US"> print 昄变量的?span lang="EN-US"> ptype 昄变量的类?span lang="EN-US"> return 强制从当前函数返?span lang="EN-US"> run 从程序开始的地方执行 rwatch 指定一个变量,如果q个变量被读Q则暂停E序q行Q在调试器中昄信息Qƈ{待下一个调试命令。参?span lang="EN-US">rwatch?span lang="EN-US">watch命o?span lang="EN-US"> set 讄变量的倹{例如:set nval=54 把54保存?span lang="EN-US">nval变量?span lang="EN-US"> step l箋执行E序下一行源代码的所有指令。如果是调用函数Q这个命令将q入函数的内部,单步执行函数中代码?span lang="EN-US"> stepi l箋执行E序下一行源代码中的汇编指o。如果是函数调用Q这个命令将q入函数的内部,单步执行函数中的汇编代码?span lang="EN-US"> txbreak 在当前函数的退出的点上讄一个时的断点Q只可用一ơ)?span lang="EN-US"> undisplay 删除一?span lang="EN-US">display讄的变量显C。这个命令需要将display list中的索引做参数?span lang="EN-US"> watch 指定一个变量,如果q个变量被写Q则暂停E序q行Q在调试器中昄信息Qƈ{待下一个调试命令。参?span lang="EN-US">rwatch?span lang="EN-US">watch命o?span lang="EN-US"> whatis 昄变量的值和cd?span lang="EN-US"> xbreak 在当前函数的退出的点上讄一个断炏V?/span>
C2785: 'T InitialStatValue(void)' and 'FD3DCounter InitialStatValue(void)' have
different return types
development\src\d3ddrv\src\D3DStats.h(27) : error
C3637: 'InitialStatValue' : a friend function definition cannot be a
specialization of a function template
development\src\d3ddrv\src\D3DStats.h(27) : error
C2912: explicit specialization; 'FD3DCounter InitialStatValue(void)' is not a
specialization of a function template
最后在一个国外的论坛扑ֈ解决ҎQ?br>class FD3DCounter
{
template <class FD3DCounter> friend FD3DCounter InitialStatValue(FD3DCounter()) {
return FD3DCounter();
}
// Constructor.
public:
DWORD RenderCycles,
WaitCycles,
Pixels;
FD3DCounter():
RenderCycles(0),
WaitCycles(0),
Pixels(0)
{}
};
注意q个时候还要改友元函数?br>?br>template<class T> T InitialStatValue(int FD3DCounter&) { return 0; }
改ؓtemplate <class T> friend T InitialStatValue(T()) {
return T();
}
q样~译可以用过?br>看来真的要好好复习下C++模板了?br>
]]>
你必需通过使用DECLARE_DYNAMICQ)和IMPLEMENT_DYNAMIC()宏来使你的CMyExceptioncd以动态地创徏。CATCH宏希望能够得到关于被抛出cȝq行时刻信息?/p>
void MyODList::DrawItem(LPDRAWITEMSTRUCT lpDrawItem)
{
CDC myDC;
myDC.Attach(lpDrawItem->hDC);
//在此插入其他需要的代码?br>
//如果你不句柄分,它将被删除,从而导致问题?br> myDC.Detach();
}另一个方法是调用CDCcȝFromHandleҎQ?br> CDC * pDC = CDC:FromHandle(lpDrawItem->hDC);
目前q不清楚哪种Ҏ更优―用FromHandle()的错误也怼更少些,因ؓ它不要求你分(detachQ句柄?
在类ClikethisView中声明如下函敎ͼ
virtual void OnInitialUpdate();
在ClikethisView的代码中Q函数如下:
void ClikethisView::OnInitialUpdate()
{
//使窗口与d话框同样大小
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit( /*FALSE*/ );
}
Z创徏一个新视图Q你可以用ClassWizard由CViewz一个新的类。当新类创徏以后Q利用新视图或修改由AppWizard提供的视图,两者的步骤是相同的?br>
修改视类的头文gQ从而将所有对CViewcȝ引用改名Z所惌的名U。本例中的类由CScrollViewz而来。通常Q这个步骤包括对cȝ改变Q视cd由如下方式派生而来Q?br>
class CMyView : public CScrollView
修改视类的实现文Ӟ从而将所有对CView的引用改名ؓ你所惌的名U。这包括IMPLEMENT_DYNCREATE那一行的语句改ؓQ?br>
IMPLEMENT_DYNCREATE(CMyView, CScrollView)
BEGIN_MESSAGE_MAP那一行的语句改ؓQ?br>
BEGIN_MESSAGE_MAP(CMyView, CScrollView)
q且其他所有的CViewҎCScrollView.
假如你修改的视图是由AppWizard生成的,那么׃需要作更多的修改了。而如果你在创Z个新视图Q先?
CWinApp::InitInstance()函数中找到对AddDocTemplate()函数的调用。AddDocTemplate()函数的第?
个参数是RUNTIME_CLASS(CSomeView)Q用CMyView来代替CSomeViewQ就可以当前视图改为新视图。在MDI应用E序
中,你可以增加第二个AddDocTemplate()函数调用来用多视图cdQ将RUNTIME_CLASS(CSomeView)改ؓ
RUNTIME_CLASS (CMyView)?br>
要想获得更多的信息请参阅Q99562中相x章《Switching Views in a Single Document Interface Program??/p>
BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
而我则用如下Ҏ解决q个问题Q?
{
// 讄所要求背景色的刷子
CBrush backBrush(#ff8080);
// 保存旧刷?br> CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect); // 擦除所需的区?br> pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}HBRUSH dlgtest::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch (nCtlColor)
{
case CTLCOLOR_BTN:
case CTLCOLOR_STATIC:
{
pDC->SetBkMode(TRANSPARENT);
}
case CTLCOLOR_DLG:
{
CBrush* back_brush;
COLORREF color;
color = (COLORREF) GetSysColor(COLOR_BTNFACE);
back_brush = new CBrush(color);
return (HBRUSH) (back_brush->m_hObject);
}
}
return(CFormView::OnCtlColor(pDC, pWnd, nCtlColor));
}单说来,用:
来得到文和视图。一个好的方法是它们封装在你的CMyDoc和CMyViewcȝ静态函CQƈ且核对它们是否属于正的RUNTIME_CLASS。然而,假如q个视图不是当前Ȁz视图或者你在运行OLE本地Ȁz,q样不成功?
((CFrameWnd*) AfxGetApp()->m_pMainWnd))->GetActiveDocument()
和:
((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView()
当应用程序调用函数CreateNewFrame()Ӟ该函数就创徏一个框架窗口和在该H口内的视图。框架窗口和它的视图的类型由与CreateNewFrame()函数调用指定的文档相关的文摸板(CDocTemplate)军_?
Visual C++中的CHKBOOK MFC样例E序也演CZ如何为文徏立附加的框架和视图。检查CHKBOOK.CPP文g中的CChkBookApp::OpenDocumentfile()函数?
另一个用函数CreateNewFrame()的例子是MULTVIEWhE序?
CreateNewFrame()函数建立了一个框架和一个视图,而不仅仅是一个视图。假如CreateNewFrame()函数不能完全W合你的需要,可参考CreateNewFrame()函数的源E序来了解对建立l构和视图所必须的步骤?/p>
CDocument::GetFirstViewPosition(); // DOCCORE.CPP
CDocument::GetNextView(); // DOCCORE.CPP
CMultiDocTemplate::GetFirstDocPosition(); // DOCMULTI.CPP
CMultiDocTemplate::GetNextDoc(); // DOCMULTI.CPP
用资源编辑器增加新的资源字串来支持新的文档类。要想知道关于文样板字W串格式的更多内容,请参?如何理解文h字符??br>
用资源编辑器增加附加的应用程序图标和菜单资源。注意,q些资源中每一个的ID都必M在步?中创建的文模板字符串的ID是相同的。这个ID被CmultiDocTemplatecȝ来识别与附加文cd相关的资源?br>
在应用程序的InitInstanceQ)函数中,创徏了另一个CMultiDocTemplate对象q且用CWinApp::AddDocTemplate()函数来注册。例如:CMultiDocTemplate* pDocTemplate2 = new CMultiDocTemplate(
最后,定制的序列化和l图代码加入C的新文和视囄中?
IDR_DOC2TYPE, RUNTIME_CLASS(CDoc2),
RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(CView2));
AddDocTemplate(pDocTemplate2);void CMyApp::GetDocumentList(CObList * pDocList)
{
ASSERT(pDocList->IsEmpty());
POSITION pos = m_templateList.GetHeadPosition();
while (pos)
{
CDocTemplate* pTemplate =
(CDocTemplate*)m_templateList.GetNext(pos);
POSITION pos2 = pTemplate->GetFirstDocPosition();
while (pos2)
{
CDocument * pDocument;
if ((pDocument=pTemplate->GetNextDoc(pos2)) != NULL)
pDocList->AddHead(pDocument);
}
}
}
Function virtual POSITION GetFirstDocPosition() constQ?br>
调用该函数得到在打开的文档列表中与模板相兌的第一个文的位置。返回的POSITION的D够被GetNextDoc成员函数反复使用?
Function Virtual CDocument* GetNextDoc(POSITION& rPosition) constQ?br>
rPostion是前面调用GetNextDoc
或GetFirstDocPosition成员函数q回的POSITION倹{这个g能是NULL。调用该函数来在所有打开的文中q行q代。该函数q?
回被rPosition所标识的文ƈrPosition讄为列表中的下一个文的POSITION倹{假如所索的是列表中的最后一个文
档,rPosition被设ؓI倹{?/p>
void CMyApp::DoSomethingToAllDocs()
{
CObList pDocList;
POSITION pos = GetFirstDocTemplatePosition();
while(pos)
{
CDocTemplate* pTemplate = GetNextDocTemplate(pos);
POSITION pos2 = pTemplate->GetFirstDocPosition();
while(pos2)
{
CDocument* pDocument;
if(pDocument = pTemplate->GetNextDoc(pos2))
pDocList.AddHead(pDocument);
}
}
if(!pDocList.IsEmpty()){
pos = pDocList.GetHeadPosition();
while(pos)
{
//为每一个文调用CDocument函数
( (CDocument*)pDocList.GetNext(pos) )
->UpdateAllViews(NULL);
}
}
]]>
不要以ؓ上面的步骤没?一旦你有问题要重新装windowspȝ,而恰好你又没有linux光盘的话,q个文g有大用?重装windowspȝ会把linux的grub引导l删除的.
一旦重装windowspȝ,没法启动linux的话,首先下蝲一个linuxdos(一个能在windows下查看linux中的文g的东?,用它扑ֈ你做的那个启动文?把它攑ֈ你的windows中的c盘中.再下一个虚拟Y盘vfloppy(可以从http://download.csdn.net/user/syboo/vfloppy下蝲),用虚拟Y盘找C的c盘中的启动文件就行了,q样再怎么重装windowspȝ你也不用怕了.
]]>
如果想下ơ开Z硬盘,可以创徏如下一个空白的文g卛_?br>
$sudo touch /fastboot
如果想下ơ开机检硬盘,可以创徏如下一个空白文件?br>
$sudo touch /forcefsck
如果x开?0ơ检一ơ硬盘,用下面的命o?br>
$sudo tune2fs -c 60
如果想一周检一ơ硬盘,用下面的命o?br>
$sudo tune2fs -i 1w
如果想知道更多tune2fs命o的内容,用下面的命o?br>
$man tune2fs
]]>
]]>
gdb 命o详解
如果提供了函数名作ؓ参数Q则从函数开头显C。如果提供代码行的编号作为参
敎ͼq一行作为开头显C?span lang="EN-US">
]]>