VC知识库之应用控制

一、如何在程序中获得其他程序的图标?

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 之前来改变窗口属性。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值