现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

vc++经典技巧总结(九)

2012-08-10 22:31 工业·编程 ⁄ 共 3434字 ⁄ 字号 暂无评论

51. 如何获得其他程序的图标,并显示在View中
[问题提出]
有的时候,如:类资源管理器会遇到获得程序图标并显示的操作,如何实现呢?
[解决方法]
SDK函数SHGetFileInfo来获得有关文件的很多信息:如大小图标,属性,类型等. 
[程序实现]
建立名为My的SDI工程.在OnPaint()函数中加入:
void CMyView::OnPaint() 
{
  CPaintDC dc(this); // device context for painting
  HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); 
  if (hIcon && hIcon!=(HICON)-1) 
  dc.DrawIcon(10,10,hIcon); 
  // TODO: Add your message handler code here
  // Do not call CView::OnPaint() for painting messages
}
说明:_T("NotePad.exe")指的是要获得什么程序的图标.
或者在OnDraw()中(此时必须保证没有OnPaint()函数,想想为何?)
void CMyView::OnDraw(CDC* pDC)
{
  CMyDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: add draw code for native data here
  HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); 
  if (hIcon &&hIcon!=(HICON)-1) 
  pDC->DrawIcon(10,10,hIcon); 
}
52 .RichEdit
在Dialog(FormView中打开)中加入CRichEdit控件后,这个dialog 为什么打不开如何处理?
[解决方法]
在函数:InitInstance的第一句加入AfxInitRichEdit();
53. 如何使FormView中显示dialog时,不是凹的?
[问题提出]
为什么FormView中显示dialog时,是凹的,能不能不这样
[解决方法]
在Dialog的属性中:
增加属性WS_BORDER  或者 WS_EX_WINDOWEDGE
用程序实现:
pView->ModifyStyle(,WS_BORDER) 或者pView->ModifyStyleEx(,WS_EX_WINDOWEDGE )
54. 如何改变窗口标题?
[问题提出]
在应用程序的不同运行时期,要反映当前状态往往会修改应用程序标题.
[解决方法]
在MFC类库中提供了CWnd::SetWindowText函数,通过该函数可以改变任何窗体(包括控件)的标题.
改变主窗体的标题:
CWnd *m_pMainWnd;
m_pMainWnd=AfxGetMainWnd();
m_pMainWnd->SetWindowText(_T("改变标题"));
当改变多视MDI的子窗口的标题时,用:
GetParentFrame()->SetWindowText(_T("MDI Child改变标题"));
当改变按钮的标题时(假设按钮的ID=IDC_BUTTON1):
GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("Button 改变标题"));
运行看看.
55.图标透明
(1).Windows中的图标其实是有两个图像组成的,其中一个用于与它要显示的位置的图像做“AND”操作,另一个作“XOR”操作。
透明:用“白色”AND,用“黑色”XOR
反色:用“白色”AND,用“白色”XOR
正常色:用“黑色”AND,用正常颜色XOR.
(2). WIN9X中好像是对像素的操作实现透明的
WIN2K中就有API直接实现透明了!
WIN2K中
GetWindowLong
SetWindowLong
SetLayeredWindowAttributes
三个API就可以实现透明了!
(3) 
::DrawIconEx(pDC->GetSafeHdc(),point.x,point.y,icon,icosize,icosize,0,NULL,DI_NORMAL);
56.ASSERT()是干什么用的
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序: 
...... 
ASSERT( n != 0); 
k = 10/ n; 
...... 
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。 
assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。
56. 将RADIO控件初始状态设置成为选中
1、"在OnInitialDialog中用CButton::CheckRadioButton(...)
2、"在OnInitialDialog中用CButton::SetCheck(...)
3、"关联一个整型值,在构造函数中设为0。
57.获得视图
CFrameWnd* pFrameWnd = (CFrameWnd*)theApp.GetMainWnd();
CMyView* pView = (CMyView*)pFrameWnd->GetActiveView();
58.如何得到屏幕的真实尺寸
[问题提出]
我的屏幕是1024*800,如何得到屏幕的真实大小,我用GetSystemMetrics(SM_CYFULLSCREEN)得到的高度总是小于800
[问题解答]
GetSystemMetrics(SM_CYFULLSCREEN)得到的只是屏幕用户区的大小。要得到屏幕的真实大小需要使用
GetDeviceCaps函数,该API函数原型是这样的:
int GetDeviceCaps(
HDC hdc,  // handle to DC
int nIndex  // index of capability
);
///得到屏幕尺寸的代码如下
void CMyDlg::OnPaint() 
{
  CPaintDC dc(this); 
  int cx = ::GetDeviceCaps(dc.m_hDC,HORZRES);///得到宽度
  int cy = ::GetDeviceCaps(dc.m_hDC,VERTRES);///得到高度
  CDialog::OnPaint();
59. 修改标题栏高度
NONCLIENTMETRICS nm
调用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)
重设SystemParametersInfo(SPI_SETNONCLIENTMETRICS,sizeof(nm),&nm,0)
60. 如何实现“气球式”工具提示。
本程序介绍一个与CToolTipCtrl相似的类CTooolTipWnd。 
使用该类的方法如下: 
1. 增加ToolTipWnd.cpp到工程文件。 
2. 在头文件中添加#include "ToolTipWnd.h" 。
3. 在类声明中添加: 
CToolTipWnd m_BalloonToolTip; 
4. 在OnInitDialog(对话框)或OnInitialUpdate(表单视)中添加下面代码: 
m_BalloonToolTip.Create(this); 
m_BalloonToolTip.AddTool(GetDlgItem(), , [text color]); 
eg. 
m_BalloonToolTip.AddTool(GetDlgItem(IDC_EDIT1),"Tooltip", RGB(255,0,0)); 
第三个参数为可选,缺省为RGB(0, 0, 0)。缺省文本颜色可以用SetDefTextColor进行设置。 
4. 重载PreTranslateMessage并添加下面代码: 
if(m_BalloonToolTip)
m_BalloonToolTip.RelayEvent(pMsg);

给我留言

留言无头像?