51. 定义一个对话框类,创建时根据其ID创建。
m_frame.Create(IDD_DIALOGFRAME);
m_frame.ShowWindow(SW_SHOW);
m_frame.ShowScrollBar(SB_VERT,false);//不显示滚动条
m_frame.ShowScrollBar(SB_HORZ,false);
m_picture.SetParent(&m_frame);//把一个位图控件与这个对话框相连
52.设置滚动信息
m_frame.GetClientRect(rect);
int xpos = m_frame.GetScrollPos(SB_HORZ);
if (xpos !=0)
m_frame.ScrollWindow(xpos,0); //恢复窗口的水平滚动区域
int ypos = m_frame.GetScrollPos(SB_VERT);
if (ypos !=0)
m_frame.ScrollWindow(0,ypos); //恢复窗口的垂直滚动区域
SCROLLINFO vinfo;
vinfo.cbSize = sizeof(vinfo);
vinfo.fMask = SIF_ALL;
vinfo.nPage = bmp.bmHeight/10;
vinfo.nMax= bmp.bmHeight-rect.Height()+bmp.bmHeight/10;
vinfo.nMin = 0;
vinfo.nTrackPos = 0;
vinfo.nPos = 0;
//设置垂直滚动条信息
m_frame.SetScrollInfo(SB_VERT,&vinfo);
vinfo.fMask = SIF_ALL;
vinfo.nPage = bmp.bmWidth/10;
vinfo.nMax= bmp.bmWidth-rect.Width()+bmp.bmWidth/10;
vinfo.nMin = 0;
vinfo.nPos = 0;
vinfo.nTrackPos = 0;
vinfo.cbSize = sizeof(vinfo);
//设置水平滚动条信息
m_frame.SetScrollInfo(SB_HORZ,&vinfo);
53.如何实现自定义滚动条
要实现自定义的滚动条控件,主要有三种方法。一是利用钩子技术重新绘制滚动条,
该方法实现起来比较复杂。
二是获得滚动条的显示区域,将其扣除,然后在该区域显示自定义的滚动条控件。
三是自定义一个滚动条控件,将其与对话框中的某个控件关联,在创建滚动条控件时,
将对话框中的某个控件隐藏,并在该控件的位置显示滚动条控件。
54.画图时最好先用pDC->SetViewportOrg(100,245);来设置一下坐标原点,不然会默认为最左上角的
一点为原点。
55.如何实现浮雕效果
浮雕效果实际上是将图片中每一点像素都进行了处理,首先循环遍历每一点的像素,
分别取出像素的R、G、B元素值把这些值减去相邻像素的元素值再加上128,
因为这些元素值的取值在0--255之间,所以计算后超出了255将元素值赋值为255,
小于0则赋值0.将这3个元素值重新组合赋予原来的像素。
56.如何使鼠标移到窗口前显示沙漏标。
可以通过调用BeginWaitCursor函数,去除沙漏标可以调用EndWaitCursor函数。
57.如何查找一个目录下的所有文件或文件夹。
我们来分析下面的代码吧
CString CBmpView::Search(CString curstr)//传当前路径名
{
long handle;//用来标识打开的文件
if(curstr.IsEmpty())//如果传过来的路径名为空
return "";
if(_getcwd( buffer, 1000)==NULL)//获取当前工作路径
{
AfxMessageBox("没有当前路径,请打开一个图像文件!");
return "";
}
CString m_sPartname;
int len = curstr.GetLength();
int i;
for(i = len-1;curstr[i] != '//';i--)
m_sPartname.Insert(0,curstr[i]);
i++;
while(i--<0)
buffer[i]=curstr[i];
if (_chdir(buffer) != 0)//改变当前的工作路径
return "";
bool b_notfinde=false;//先标识文件没找到
struct _finddata_t filestruct;//用于存放文件的信息
// 开始查找工作, 找到当前目录下的第一个实体(文件或子目录),
// ″*″表示查找任何的文件或子目录, filestruct为查找结果
handle = _findfirst("*", &filestruct);
do{
if((handle ==-1)) // 当handle为-1, 表示当前目录为空, 则结束查找而返回
break;
// 检查找到的第一个实体是否是一个目录
if( ::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY )
{
continue ;
}
CString Filename=filestruct.name;
{
CString tailstr;
//获取文件扩展名
tailstr = Filename.Mid(Filename.GetLength()-3);
tailstr.MakeUpper();
Filename.MakeUpper();
m_sPartname.MakeUpper();
if(tailstr=="BMP")
{
if(b_notfinde==false)
{
if(m_sPartname==Filename)//标识为找到了,
//进入下一次循环找下一个文件。
b_notfinde=true;
}
else
{
_findclose(handle);
return Filename;
}
}
}
} while(_findnext(handle, &filestruct)==0);
_findclose(handle);
this->KillTimer(1);
AfxMessageBox("已经到达最后一个图像文件!");
return "";
}
58.滚动条的使用的示例代码
void CBmpDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int pos,min,max,thumbwidth;
SCROLLINFO vinfo;
GetScrollInfo(SB_HORZ,&vinfo);
pos = vinfo.nPos;
min = vinfo.nMin;
max = vinfo.nMax;
thumbwidth = vinfo.nPage;
switch (nSBCode)
{
break;
case SB_THUMBTRACK: //拖动滚动块
ScrollWindow(-(nPos-pos),0);
SetScrollPos(SB_HORZ,nPos);
break;
case SB_LINELEFT : //单击左箭头
SetScrollPos(SB_HORZ,pos-1);
if (pos !=0)
ScrollWindow(1,0);
break;
case SB_LINERIGHT: //单击右箭头
SetScrollPos(SB_HORZ,pos+1);
if (pos+thumbwidth <max)
ScrollWindow(-1,0);
break;
case SB_PAGELEFT: //在滚动块的左方空白滚动区域单击,增量为6
SetScrollPos(SB_HORZ,pos-6);
if (pos+thumbwidth >0)
ScrollWindow(6,0);
break;
case SB_PAGERIGHT: //在滚动块的右方空白滚动区域单击,增量为6
SetScrollPos(SB_HORZ,pos+6);
if (pos+thumbwidth <max)
ScrollWindow(-6,0);
break;
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
59.放大和缩小图片
可以使用StretchBlt,StretchBlt函数可以根据设置的比例大小重画图片。
60.如何获取位图大小?
获取位图大小,最简单的方法就是使用Picture空间,当Picture空间加载图像时,
会自动调整空间的大小,其大小就是图像的大小。
例如:
m_image.SetBitmap(m_hbitmap)//m_hbitmap是位图句柄
CRect m_bitrect;
m_image.GetWindowRect(m_bitrect);
还可以通过Cbitmap累的GetObject方法获取位图大小。
例如:
CBitmap bitmap;
BITMAPINFO bInfo;
bitmap.Attach(m_hbitmap);
bitmap.GetObject(sizeof(bInfo),&bInfo);
int x=bInfo.bmiHeader.biWidth;
int y=bInfo.bmiHeader.biHeight;