一、如何在程序中获得其他程序的图标?
void CHsView::OnDraw(CDC* pDC)
{
HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
if(hIcon && hIcon !=(HICON) -1)
{
pDC->DrawIcon(10,10,hIcon);
}
CHsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
二、如何编程结束应用程序?
AfxGetMainWnd()->SendMessage(WM_CLOSE);
三、如何获得应用程序的实例句柄?
HANDLE hInstance=AfxGetInstanceHandle();
四、怎样加载其他的应用程序?
三个SDK函数 WinExec, ShellExecute,CreateProcess可以使用。WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如泥用 SW_SHOWMAXMIZED方式去加载一个无最大化按钮的程序,就是Neterm,calc等等,就不会出现正常的窗体,但是已经被加到任务列表里了。
WinExec("D://PowerWord 2006//Xdict.exe",SW_SHOWMAXIMIZED);
ShellExecute较 WinExex灵活一点,可以指定工作目录,下面的Example就是直接打开 c:/temp/1.txt,而不用加载与 txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口,来显示Readme or Faq,我猜就是这么作的啦.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c://temp"),SW_SHOWMAXMIZED)
注意:C://TEMP//1.TXT必须存在才能打开
CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:
STARTUPINFO stinfo
//启动窗口的信息
PROCESSINFO procinfo //进程的信息
CreateProcess(NULL,_T("notepad.exe"),NULL,NULL,FALSE,NORMAL_PRIORITY_ CLASS,NULL,NULL, &stinfo,&procinfo)
五、确定应用程序的路径?
TCHAR exeFullPath[MAX_PATH]; //
GetModuleFileName(NULL,exeFullPath,MAX_PATH); // exeFullPath的内容就是函数返回的结果
六、获得各种目录信息
Windows目录: Use "GetWindowsDirectory"
Windows下的system目录: Use "GetSystemDirectory"
temp目录: Use "GetTempPath"
当前目录: Use "GetCurrentDirectory"
请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区后两个相反
TCHAR exeFullPath[MAX_PATH];
GetWindowsDirectory(exeFullPath,MAX_PATH);
GetSystemDirectory(exeFullPath,MAX_PATH);
GetTempPath(MAX_PATH,exeFullPath);
GetCurrentDirectory(MAX_PATH,exeFullPath);
可以按F5逐步调试,观察exeFullPath值的变化.
七、如何访问预定义的GDI对象
void CHsView::OnDraw(CDC* pDC)
{
CHsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//Determine size of view.
CRect reView;
GetClientRect(reView);
// Use stock black pen and stock gray brush to draw ellipse.
pDC->SelectStockObject(BLACK_PEN);
// Draw the ellipse.
pDC->Ellipse(reView);
}
//也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:
void CHsView::OnDraw(CDC* pDC)
{
CHsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//Determine size of view.
CRect reView;
GetClientRect(reView);
// Use background color for tooltips brush.
CBrush *pOrgBrush = pDC->SelectObject(CBrush::FromHandle(::GetSysColorBrush(COLOR_INFOBK)));
// Draw the ellipse.
pDC->Ellipse(reView);
// Restore original brush.
pDC->SelectObject(pOrgBrush);
}
八、当向列表框中添加多个项时如何防止闪烁
//Disable redrawing.
pListBox->SetRedraw (FALSE);
//Fill in the list box gere
//Enable drwing and make sure list box is redrawn.
pListBox->SetRedraw (TRUE);
pListBox->Invalidate ();
九、如何更新翻转背景颜色的文本
调用CDC:: SetBkMode并传送OPAQUE用当前的背景颜色填充背景,或者调用CDC::SetBkMode并传送TRANSPAARENT使背景保持不变,这两种方法都可以设置背景模式。下例设置背景模式为TRANSPARENT,可以两次更新串,用花色带黑阴影更新文本。黑色串在红色串之后,但由于设置了背景模式仍然可见
void CHsView::OnDraw(CDC* pDC)
{
CHsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//Determint size of view.
CRect rcView;
GetClientRect(rcView);
//Create sample string to display.
CString str (_T ("Awesome Shadow Text..."));
//Set the background mode to transparent.
pDC->SetBkMode(TRANSPARENT);
//Draw black shadow text.
rcView.OffsetRect (1, 1);
pDC->SetTextColor (RGB (0, 0, 0));
pDC->DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
//Draw red text.
rcView.OffsetRect (-1,-1);
pDC->SetTextColor (RGB (255, 0, 0));
pDC->DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
十、如何检索原先的Task Manager应用程序使用的任务列表
原先的Task Manager应用程序显示顶层窗口的列表。为了显示该列表,窗口必须可见、包含一个标题以及不能被其他窗口拥有。调用CWnd:: GetWindow可以检索顶层窗口的列表,调用IsWindowVisible、GetWindowTextLength以及GetOwner可以确定窗口是否应该在列表中。下例将把TaskManager窗口的标题填充到列表中。
void GetTadkList(CListBox *list)
{
CString strCaption;
// Caption of window.
list->ResetContent();
// Clear list box.
// Get first Window in window list.
ASSERT_VALID(AfxGetMainWnd());
CWnd *pWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
// Walk window list.
while(pWnd)
{
// I window visible,has a captio,and does not have an owner?
if(pWnd->IsWindowVisible() && pWnd->GetWindowTextLength() && !pWnd->GetOwner())
{
// Add caption o window to list box.
pWnd->GetWindowText(strCaption);
list->AddString(strCaption);
}
// Get next window in window list.
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
}
void CAboutDlg::OnButton1()
{
// TODO: Add your control notification handler code here
GetTadkList(&m_list); // 在窗体上添加一个ListBox控件,并设置其这量为Control m_list
//CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE,NORMAL_PRIORITY_ CLASS,NULL,NULL, &stinfo,&procinfo);
}
十一、MessageBox与AfxMessageBox的区别:
在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框? |
MessageBox函数来自CWnd类,所以你只能在从CWnd继承的类( 如CView )中调用它。但是,MFC 也提供了 AfxMessageBox 函数,你可以在任何地方调用它。 |
十二、虚拟函数PreCreateWindow是干什么用的?
PreCreateWindow 允许你在调用 CreateWindow 之前来改变窗口属性。