`
gaofen100
  • 浏览: 1179995 次
文章分类
社区版块
存档分类
最新评论

VC++问题集7

 
阅读更多

61.图片反色处理。
·要实现图像的反色处理可以有多种实现方法。例如可以获取图片中每个像素点的颜色值,
然后对颜色值进行取反。如下代码:
CDC* pDC = m_image.GetDC();
CRect m_rect;
m_image.GetClientRect(m_rect);
BYTE r,g,b;
for (int i=1; i<]m_rect.Width();i++)
for (int j=1;j<m_rect.Height();j++)
{
COLORREF clr= pDC->GetPixel(i,j);
r = GetRValue(clr);
g = GetGValue(clr);
b = GetBValue(clr);

r = abs(255-r);
g = abs(255-g);
b = abs(255-b);
pDC->SetPixel(i,j,RGB(r,g,b));
}
也可以调用CDC类中的InvertRgn方法,该方法将制定区域的颜色取反。
如下示例代码:
CDC* pDC = m_image.GetDC();
CRect m_rect;
m_image.GetClientRect(m_rect);
CRgn m_rgn;
m_rgn.CreateRectRgn(m_rect.left,m_rect.top,m_rect.right,m_rect.bottom);
pDC->InvertRgn(&m_rgn);

62.如何在VC++ 中显示JPG图片。
·在Visual c++中,MFC类库没有提供相应的控件显示JPG图像。
JPG图像采用压缩形式存储,存储结构复杂。为了简单化,可以采用流的形式读取JPG文件。
首先利用CFile对象读取JPG文件,获取JPG文件的长度,然后利用GlobalAlloc函数在堆中
划分一个和文件大小相同的区域,接着调用GlobalLock函数锁定该区域,返回一个指向堆
的指针,将文件数据写入该区域中,最后调用CreateStreamOnHGlobal函数在堆中创建流
对象,调用OleLoadPicture函数根据流对象创建图像对象IPicture,调用IPicture的
Render方法将如下显示在指定的画布上。
如下示例代码:
void CShowJPGDlg::OnOK()
{
//定义打开文件的对话框,获取文件的路径
CFileDialog m_dlg(TRUE,"JPG",NULL,NULL,"JPG(*.jpg)|*.JPG|gif|*.gif",this);
if (m_dlg.DoModal()==IDOK)
{
CString m_filename =m_dlg.GetPathName();//获取文件路径

m_dir.SetWindowText(m_filename);

CFile m_file(m_filename,CFile::modeRead );//定义文件流对象

//获取文件长度
DWORD m_filelen = m_file.GetLength();

//在堆上分配空间
HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen);

LPVOID pvdata = NULL;
//锁定堆空间,获取指向堆空间的指针
pvdata = GlobalLock(m_hglobal);

//将文件数据读区到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream* m_stream;

GlobalUnlock(m_hglobal);

//在堆中创建流对象
CreateStreamOnHGlobal(m_hglobal,TRUE,&m_stream);

//利用流加载图像
OleLoadPicture(m_stream,m_filelen,TRUE,IID_IPicture,(LPVOID*)&m_picture);

m_picture->get_Width(&m_width);
m_picture->get_Height(&m_height);

CDC* dc = GetDC();

m_IsShow = TRUE;
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT,0,(int)(m_height/26.45)-rect.Height());
SetScrollRange(SB_HORZ,0,(int)(m_width/26.45)-rect.Width());

m_picture->Render(*dc,1,50,(int)(m_width/26.45),(int)(m_height/26.45),
0,m_height,m_width,-m_height,NULL);

}
}
63.如何通过一个点坐标知道点所处在的窗口?
我们可以通过ChildWindowFromPoint函数来实现。
ChildWindowFromPoint  Windows API 函数。
 函数原型:HWND ChildWindowFromPoint (HWND hWnd, LONG xPoint, LONG yPoint);
  函数功能:返回父窗口中包含了指定点的第一个子窗口的句柄。
  函数参数:hWnd 父窗口的句柄
  xPoint 点的X坐标,以像素为单位
  yPoint 点的Y坐标,以像素为单位
  返回值:发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd(父窗口的句柄)。如指定点位于父窗口外部,则返回零。

64.如何实现旋转的文字?
要实现字体的旋转,首先创建一个字体,在创建字体时指定倾斜角,然后利用设备上下文
选中字体,最后输出文字就可以了。文字就会在某一位置按照字体指定的角度倾斜。
创建一个字体可以调用CFont类的CreateFont方法。

65.如何获取当前系统字体列表。
Windows操作系统提供了一个EnumFontFamiliesEx函数,该函数用于获取系统字体列表。
具体语法请查阅MSDN。
如下示例代码:
CStringList fontlist;
//下面是定义的一个回调函数
int CALLBACK EnumFontList (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType, LPARAM lParam)
{
POSITION pos = fontlist.Find(lpelfe->elfLogFont.lfFaceName);
if (pos == NULL)
fontlist.AddTail(lpelfe->elfLogFont.lfFaceName);
return 1 ;
}
LOGFONT m_logfont;//定义一个用于描述字体信息的LOGFONT结构体指针。如果设置
memset(&m_logfont,0,sizeof(m_logfont));//LOGFONT结构的lfCharset成员为DEFAULT_CHARSET
m_logfont.lfCharSet = DEFAULT_CHARSET;//函数将列举所有字符的字体,否则只列举
//指定的字符集字体。
m_logfont.lfFaceName[0] =NULL;

EnumFontFamiliesEx(dc->m_hDC,&m_logfont,(FONTENUMPROC)EnumFontList,100,0);

66.让一个矩形向中心缩小
要让一个矩形向中心缩小指定的像素我们可以调用GetClientRect函数,此函数的具体使用
方法请查阅MSDN。
如下示例:
m_demo.GetClientRect(m_rect);//两个变量都是矩形
m_rect.DeflateRect(1,1,1,1);
67.如何实现空心文字?
Windows提供了一个空心字体---华文彩云,该字体在设备上输出时是空心的,效果比较好。
现在我们来实现宋体空心文本。
要实现字体的空心显示,可以利用设备上下文CDC类的通道方法。CDC类提供了多个通道方法,
其主要方法如下:
1)BeginPath//该方法用于开始一个通道。
2)EndPath//该方法用于结束一个通道。
3)StrokePath//该方法用当前的画笔绘制一个通道。
示例程序如下:
CDC* pDC = GetDC();
CRect m_rect;
GetClientRect(m_rect);
m_font.CreateFont(-32,-28,0,0,600,0,0,0,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_ROMAN,"宋体");
pDC->BeginPath();
pDC->SelectObject(&m_font);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(100,70,"明日科技");
CPen pen(PS_SOLID,1,RGB(255,0,255));
pDC->SelectObject(&pen);
pDC->EndPath();
m_font.Detach();
pDC->StrokePath();
68.如何提取并保存应用程序图标
提取应用程序的图标可以利用ExtractIcon API函数来实现。具体语法请查看MSDN。
函数返回一个图标的句柄。
保存应用程序的图标会比较复杂,需要了解图标的结构。图标文件由三部分组成,

第一部分
是图标文件头,结构如下:
typedef struct
{
WORD idReserved; //保留,(必须是0)
WORD idType; //资源类型(1标识ICON)
WORD idCount; //文件所含图片的数量

ICONDIREDTRY idEntries[1]; //每个图片的入口
}ICONDIR,*LPICONDIR;
一个图标文件可以包含多个图标,成员idCount用于确定文件包含的图标数量。

第二部分是图标资源索引目录,结构如下:
typedef struct
{
byte bwidth; // 图像宽度,以像素为单位
byte bheight; // 图像高度,以像素为单位
byte bcolorcount; //图像中的颜色数,如果是大于8的位图,此值为零
byte breserved; //保留,必须为零
WORD wplanes; //位面数,一般为1
WORD wbitcount; //每像素所占位数
DWORD dwbytesinres; // 资源的字节数
DWORD dwimageoffset; //图像数据距离资源开始处偏移位置
} icondirentry, *lpicondirentry;

第三部分是图标数据,结构如下:
typedef struct
{
LPBITMAPINFO icheader; // 位图信息头,可参照上节的位图头信息结构
RGBQUAD iccolors; //色彩表,同位图的色彩表。
LPBYTElpXOR;
LPBYTElpAND;
// AND掩码
} iconimage, *lpiconimage;

69.创建状态栏并显示相关信息?
如下示例为创建具有4个窗口的状态栏
UINT array[5];
for (int i=0;i<5;i++)
{
array[i] = 1001+i;
}
先定义状态栏变量 CStatusBar m_statusbar;
调用Create函数,m_statusbar.Create(this); //创建状态栏窗口
m_statusbar.SetIndicators(array,sizeof(array)/sizeof(UINT)); //添加面板
for (int n = 0; n<4;n++)
{
m_statusbar.SetPaneInfo(n,array[n],0,155);//设置面板宽度
}
m_statusbar.SetPaneInfo(3,array[3],0,700);
//设置状态栏中显示的信息
CTime time;
time=time.GetCurrentTime();
CString stime;
stime.Format("当前时间:%s",time.Format("%y-%m-%d %H:%M:%S"));
m_statusbar.SetPaneText(0,stime);
...
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);重新定位

70. Windows Media Player 控件的主要方法
1.GetMute 获得静音属性
2.GetPlayState 获得播放状态
3.GetVolume 获得音量
4.Open 打开播放文件
5.Pause 暂停
6.Play 播放
8.SetShowControls 设置十分显示控制面板

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics