1.如何初始化显示时不显示子视图
在应用程序类的InitInstance函数中,有这么两句:
// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
//添加下面这句话,即可
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;


后续待添加:)


调色板概述

每个应用程序都有自己的调色板,使用调色板时要先向系统申请,调色板分为前台调色板和后台调色板,windows为优先级高的程序分配前台调色板.我们经常会发现当启动一个大一点的程序时,桌面和其他应用程序的颜色变得粗糙起来,就是因为其他应用程序的调色板正在转为后台调色板.

Windows系统内部保留了一个20种颜色的调色板,用来显示窗口,菜单等通用界面每个设备上下文都拥有一个逻辑调色板,如果要使用内部系统调色板(20种颜色)之外的颜色,则应该创建一个新的逻辑调色板并将其选入到设备上下文中.再把设备上下文中的逻辑调色板实现到系统调色板中,新的颜色才能实现.

在逻辑调色板被实现到系统调色板时,Windows会建立一个调色板映射表,当设备上下文用逻辑调色板中的颜色绘图时,GDI绘图函数会查询调色板映射表以把像素值从逻辑调色板的索引转换成系统调色板的索引.

创建调色板BOOL CreatePalette(LPLOGPALETTE lpLogPalette );

其中lpLogPalette是一个指向LOGPALETTE 结构的指针
typedef struct tagLOGPALETTE {
WORD palVersion; //windows版本号,一般是0x300
WORD palNumEntries; //调色板中颜色表项的数目
PALETTEENTRY palPalEntry[1]; //每个表项的颜色和使用方法
} LOGPALETTE;

typedef struct tagPALETTEENTRY {
BYTE peRed; //红(0-255)
BYTE peGreen;// 绿
BYTE peBlue; //蓝
BYTE peFlags; //一般为0
} PALETTEENTRY;

上面只是建立了一个逻辑调色板,而逻辑调色板只是一张孤立的颜色表,并不能对系统产生影响,所以要使用调色板还需要下面这些函数CPalette* SelectPalette(CPalette* pPalette,BOOL bForceBackground );
这个函数用来将一个调色板载入设备上下文,第一个参数是一个调色板指针,第二个参数用来指定调色板作为前景色还是背景色使用,为TURE时,作为背景色使用,为FALSE时,当窗口是活动窗口或活动窗口的子窗口是,调色板将做为前景色使用,否则做为背景色来使用.如果使用调色板的是一个内存设备上下文,则该参数被忽略.UINT RealizePalette( );该函数把设备上下文中的逻辑调色板实现到系统调色板中, 函数的返回值表明调色板映射表中有多少项被改变了
这两个函数的使用如下:
CPalette *pOldPalette ;
CWindowDC dc(this) ;
pOldPalette=dc.SelectPalette(&pal, FALSE) ;
dc.RealizePalette() ;
dc.SelectPalette(pOldPalette, FALSE) ;

如果某一个窗口要显示特殊的颜色,那么一般应该在处理WM_PAINT消息时实现自己的逻辑调色板,也就是说,在OnPaint或OnDraw函数中重绘以前,要调用SelectPalette和RealizePalette,如果窗口显示的颜色比较重要,则要在调用SelectPalette时指定bForceBackground参数为FALSE.
创建调色板的一般步骤:
1 建立一个LOGPALETTE结构和PALETTEENTRY数组
2 对PALETTEENTRY数组进行赋值,即创建调色板颜色表
3 建立CPalette对象并使用CreatePalette函数初始化调色板对象
4 使用SelectPalette函数将设备描述表和调色板联系起来
5 使用CDC中的RealizePalette函数使调色板生效
为了协调各个窗口对系统调色板的使用,Windows在必要的时候会向顶层窗口和重绘窗口发送消息WM_QUERYNEWPALETTE和WM_PALETTECHANGED.当某一顶层或重叠窗口被激活时,会收到WM_QUERYNEWPALETTE消息,在窗口的创建之处也会收到该消息,该消息先于WM_PAINT消息到达窗口,如果活动窗口要使用特殊的颜色,则在收到该消息时应该实现自己的逻辑调色板并重绘窗口.

原作者信息
http://hi.baidu.com/liuhuishan/blog/item/245c774ef477ff01b3de0524.html

滑动条控制(Slider Control)也叫轨道条控制,其主要是用一个带有轨道和滑标的小窗口以及窗口上的刻度,来让用户选择一个离散数据或一个连续的数值区间。通过鼠标或键盘来进行数据的选择操作,这在WIN98/95中的很多应用程序中都可以看到,如控制面板中的鼠标等,滑动条既可以是水平方式的也可以是垂直方式的。滑动条控制的风格如下:
TBS_HORZ 滑动条是水平方向的 TBS_VERT 滑动条是垂直方向的
TBS_LEFT 滑动条位于窗口左侧 TBS_RIGHT 滑动条位于窗口右侧
TBS_TOP 滑动条位于窗口顶部 TBS_BOTTOM 滑动条位于窗口底部
TBS_BOTH 滑动条位于窗口两侧 TBS_AUTOTICKS滑动条具有刻度,默认
TBS_NOTICKS 滑动条不具有刻度
  滑动条的刻度条在每一个数值位置显示一个刻度标记,如果在滑动条上显示某一数值选择区间,则应使用风格TBS_ENABLESELRANGE,此时选择区间两个不再是刻度标记,而是一个小的三角形符号。另外,使用风格TBS_NOTHUMB会使滑标消隐起来。
  滑动条控制在MFC类库中被封装为CSliderCtrl控制,其主要操作是设置刻度范围、绘制刻度标记、设置选择范围和当前滑标位置等。当用户进行交互操作时,滑动条控制将向其父窗口发送消息WM_HSCROLL,所以在应用程序中应重载父窗口的OnHScroll()成员函数,以便对消息进行正确处理系统发送的通知代码、滑标位置和指向CSliderCtrl对象的指针等。由于考虑到和水平卷动杆公用同一个成员函数,OnHScroll()函数参数表中的指针变量被定义为CScrollBar*类型,由于实际上消息是由滑动条产生的,所以在程序中必须把这个指针变量强制转换为CSliderCtrl*类型。滑动条和卷动杆的消息代码和含义都非常类似如TB_BOTTOM等,所以这种处理方法比较合理。SetRange()函数用来设置范围,SetPos()函数用来设置当前位置。
(二)滑动条控制的对象结构
  滑动条控制的建立方法
   CsliderCtrl &SliderCtrl 建立滑动条控制对象结构;Create 建立滑动条控制对象并绑定对象
   滑动条控制类CSliderCtrl::Create的调用格式如下:
  BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
  其中参数dwStyle用来确定滑动条控制风格;参数rect用来确定滑动条控制的大小和位置;参数pParentWnd用来确定滑动条控制的父窗口指针;参数nID用来确定滑动条控制的控制符ID值。
  2、滑动条控制的类属性
  滑动条控制对象的类属性包括取得滑动条大小GetLineSize、设置滑动条大小SetLineSize、取得滑动条页大小GetPageSize、设置滑动条页大小SetPageSize、取得滑动条最大位置GetRangeMax、取得滑动条最小位置GetRangeMin、取得滑动条范围GetRange、设置滑块最小位置SetRangeMin、设置滑块最大位置SetRangeMax、设置滑动条范围SetRange、取得滑块当前位置GetSelection、设置滑块当前位置SetSelection、取得滑动条当前位置GetPos和设置滑动条当前位置SetPos等。
  3、滑动条控制的操作方法
  滑动条控制的操作方法包括清除滑动条当前选择ClearSel、验证滑动条当前位置是否在最大最小位置之间VerifyPos和清除当前刻度标志ClearTics。
  滑动条控制的应用技巧示例
  1、利用应用程序向导AppWizard生成基于对象框的应用程序CSlidDlg;
  2、在对话框中设置滑动条控制,其ID为IDC_SLIDER;
  3、在对话框初始代码中增加控制的范围和位置:
  (1)在SlidDlg.h中设置数据成员,用来表示滑动条的当前值:
//SlidDlg.h
class CSlidDlg:public Cdialog
{ ......//其它代码
public:
int m_nCur;
......//其它代码
}
(2)在SlidDlg.cpp中设置初始状态
BOOL CSlidDlg::OnInitDialog()
{ Cdialog::OnInitDialog();
......//其它代码
//TODO:Add extra initialization here
CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLLIDER);
pSlidCtrl->SetRange(1,5,TRUE);//设置滑动条范围
pSlidCtrl->SetPos(2);//设置滑动条位置
......//其它代码
return TRUE;
}
(3)完善滑动条的消息处理,利用类向导ClassWizard增加对话框窗口的WM_HSCROLL消息处理函数,并取得滑标所指位置值:
void CSlidDlg::OnHScroll(UINT nSBCode,UINT nPos,CScrollBar *pScrollBar)
{ //TODO:Add your message handler?
Cdialog::OnHScroll(nSBCode,nPos,pScrollBar);
CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLLIDER);
m_nCur=pSlidCtrl->GetPos();//取得当前位置值
}
通过浏览器浏览 嵌入java applet的html页面,浏览器会弹出active x安全控制警告,然后要点一下允许继续执行。

本地调试运行都会出现这样的问题,即使是想方设法的把浏览器的安全级别降下来了,也不行的,很麻烦。每次调试java程序都要点一下允许,浏览器实在太傻了。。。

按如下修改ie的设置就不会弹出了
把ie设置->高级->安全 中的“允许活动内容在我的计算机上的文件中运行”这一项打上钩就行了


附:如何修改ie的默认安全等级
很多朋友发现在安装SP2后,我们在修改IE的安全设置低于其默认设置时,系统会提示“无法修改……”的错误,这是由于SP2对用户设置较低的安全级别有所限制。不过这样可能会让我们在访问某些站点的时候失败,我们可以用如下方法修改其默认安全级别:运行 “Regedit”命令打开注册表编辑器,依次定位到“[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3]”,在窗口右边将“MinLevel”修改为“10000”(十六进制),这样大家就可以设置更低的安全级别了。
开始接触各式开发知识的第一周
先学java吧,想做背单词的网站只能从java着手

看完图书馆借的 java程序设计教程

这学期的课程还是压力蛮大的,愁啊,啥时候可以去实习
以前都是自己生成打开的对话框,定义代码如下
CFileDialog dlg(TRUE,
"rtf",
"*.rtf",
OFN_HIDEREADONLY OFN_OVERWRITEPROMPT,
"*.rtf",
this);
dlg.m_ofn.lpstrTitle="请选择文本文件";
char szCurDir[255];
GetCurrentDirectory(255,szCurDir);
dlg.m_ofn.lpstrInitialDir=CString(szCurDir);
if(IDOK!=dlg.DoModal())
return FALSE;

如果用系统的重载,可以省掉写这写代码,而且重载的打开对话框的功能和windows一模一样,比较健全。
但是扩展名匹配就比较麻烦,以前只知道要在向导中填好。

那么万一忘了呢?
还可以这样修改

修改字符串资源
IDR_MAINFRAME为
myTitle\n\n新文件\nmyFile文件 (*.txt)\n.txt\nmyFileID\nDoc Document

关键是中间带.txt的两部分

恩 这个就很方便了:) MFC就是适合傻瓜化操作
关于IDR_MAINFRAME的详细定义可以查看
最近开始找实习,疲于应付各式各样的要求,linux、java、j2ee、各式数据库开发、SOA、WDF等……让我望洋兴叹,颇感无奈。

浩瀚的知识海洋,渺小的我们穷尽一生也只能取其一粟;但是正是这些千千万万的渺小,才能汇积成沧海。我总是羡慕于巅峰的秀丽,在惊叹中梦呓、自卑,却忘了这最基本的道理。不要再被形形色色的名目牵着走,一步一步来吧,人所能成就的,其实始终在自己的脚下,在滴答声中前行或溜走,或者弯弯曲曲的始终走不直。

千里之行,始于足下。

本周及下周任务
到下周六之前,继续完善图像编辑软件。
学习oracle的 sql语法和函数
反正很少在blog上写心情文章,于是决定写成IT技术blog吧,把学习的心得和计划贴在这里,将来学有所成的时候回顾一下,也可以小小感叹一下。


多媒体编程
实验一 报告
2008212519_王俊华



多媒体编程实验一报告


实验过程



  1. 分析bmp文件格式
    ,格式见附录一


  2. 以最精简最实用的结构定义CBmp类,将作业中所需的操作封装到该类


  3. 实现文档/视图结构


  4. 在实验中记录遇到的问题






程序框架


文档/视图结构


CBmp类封装了对Bmp文件的读操作和显示,以及将当前取得的RGB值转化为亮度值


详细结构如图一



图一


CBmpViewerDoc 中添加
CBmp *bmp 成员,作为载入的位图对象存储,实现如下两个成员函数:



  1. 菜单
    作业
    ->信息头分析
    OnToText(); //解析bmp文件头信息,并写入文本


  2. 菜单
    作业
    ->RGB转成YUV
    OnToYUV(); //bmp图片像素阵列输出亮度值到文本






CBmpViewerview
中修改OnDraw()
函数,以显示bmp图片;


CBmpViewerview
中修改OnInitialUpdate()
函数,以实现滚屏视图;





软件操作方法



  1. 显示
    通过文件
    ->打开
    bmp图片即可


  2. 读取头文件
    菜单 作业
    ->信息头分析
    然后在打开的文件夹里
    选择合适的
    txt文本
    或者直接新建


  3. bmp图片像素阵列输出亮度值到文本
    菜单 作业
    ->RGB转成YUV






实验中遇到的问题及相关解决方法



  1. CString的格式化输出



%c 单个字符


%d 十进制整数


%f 十进制浮点数


%o 八进制数


%s 字符串


%u 无符号十进制数


%x 十六进制数


%% 输出百分号%





一个格式说明可以带有几个修饰符,用来指定显示宽度,小数尾数及左对齐等:


- 左对齐


+ 在一个带符号数前加'+''-'



  1. 域宽用前导零来填充,而不是用空白符






域宽是一个整数,设置了打印一个格式化字符串的最小域。精度使用小数点后加数字表示的,给出每个转换说明符所要输出的字符个数。


注意:带修饰符的显示可能不正常。


数据格式说明由“%”开头,形式为
%<数据输出宽度说明><格式符>,数据格式说明用在需要输出变量或运算数值结果的时候,它的个数与输出表列的个数一一对应。


数据宽度说明中如果实际数据小于宽度,则根据宽度是否大于零而左补空格或右补空格。如果实际数据大于宽度,按实际位数输出。如果缺省宽度说明,则按实际宽度输出。


CString.format('%10f',
a);


10表示把a10个字符宽度格式化


%f形式输出,则小数部分为6位;






%10f


a的整数部分位数+小数点(1)+小数部分位数大于等于10,则按实际a的形式格式化;


a的整数部分位数+小数点(1)+小数部分位数小于10,则在前面补空格,补足10位;






%.7f


a的小数部分位数若大于7,则截取7位小数,整数部分不变;


a的小数部分位数若小于等于7,则不满7位的部分后面以0补足;





str.Format(_T('Left-justified
integer: %.6d\n'), b);


%.6d


若整数b不满6位则在最高为前面补0


若整数b大于等于6位则形式不变;





%6d


若整数b不满6,则在最高位前面补上空格,是之格式化为6个字符宽度;


若整数b大于等于6位则形式不变。






  1. CFile 遇到的文件读写错误和指针定位



CFile定义的文件,在读写操作结束的时候一定要close(),否则会造成文件共享错误;


文件读写是从类型或者结构的末端开始的。


CFile->Read()
读取文件结束后,指针就停留在结构末端,下一次读取的时候不用调用seek
重新定位文件指针。






  1. 指针转换的学习




ptrHeader
= (BITMAPFILEHEADER*) bmPtr;



ptrInfo
= (BITMAPINFO*) &bmPtr[sizeof(BITMAPFILEHEADER)];



ptrBits
= &bmPtr[ptrHeader->bfOffBits];



指针可以根据结构的长度
自动截断原指针所指向结构的长度



可以方便的把某个指针的一部分快速的赋给另一个指针







  1. Dib位图显示




int
StretchDIBits(



HDC
hdc, // handle to DC



int
XDest, // x-coord of destination upper-left corner



int
YDest, // y-coord of destination upper-left corner



int
nDestWidth, // width of destination rectangle



int
nDestHeight, // height of destination rectangle



int
XSrc, // x-coord of source upper-left corner



int
YSrc, // y-coord of source upper-left corner



int
nSrcWidth, // width of source rectangle



int
nSrcHeight, // height of source rectangle



CONST
VOID *lpBits, // bitmap bits



CONST
BITMAPINFO *lpBitsInfo, // bitmap data



UINT
iUsage, // usage options



DWORD
dwRop // raster operation code



);







int
SetDIBitsToDevice(



HDC
hdc, // handle to DC



int
XDest, // x-coord of destination upper-left corner



int
YDest, // y-coord of destination upper-left corner



DWORD
dwWidth, // source rectangle width



DWORD
dwHeight, // source rectangle height



int
XSrc, // x-coord of source lower-left corner



int
YSrc, // y-coord of source lower-left corner



UINT
uStartScan, // first scan line in array



UINT
cScanLines, // number of scan lines



CONST
VOID *lpvBits, // array of DIB bits



CONST
BITMAPINFO *lpbmi, // bitmap information



UINT
fuColorUse // RGB or palette indexes



);



  1. 调色板的创建



调色板的存在到底有什么用处,还不是很清楚,只是猜测可能每次在dc上画图,用逻辑调色板修改系统调色板,可以将系统调色板缺少的颜色都补上,使得图片显色的时候保真。


调色板是通过logPalette创建的。把代码贴在这里,以防遗忘……






附录一


位图文件分为四部分:


1)位图文件头BITMAPFILEHEADER


  位图文件头BITMAPFILEHEADER是一个结构体,长度为14字节,定义为:


typedef struct
tagBITMAPFILEHEADER


{


 WORD
bfType; //文件类型,必须是0x424D,即字符串"BM"


 DWORD
bfSize; //文件大小,包括BITMAPFILEHEADER14个字节


 WORD
bfReserved1; //保留字


 WORD
bfReserved2; //保留字


 DWORD
bfOffBits; //从文件头到实际的位图数据的偏移字节数


} BITMAPFILEHEADER;





2)位图信息头BITMAPINFOHEADER


  位图信息头BITMAPINFOHEADER也是一个结构体,长度为40字节,定义为:


typedef struct
tagBITMAPINFOHEADER


{


 DWORD
biSize; //本结构的长度,为40


 LONG
biWidth; //图象的宽度,单位是象素


 LONG
biHeight; //图象的高度,单位是象素


 WORD
biPlanes; //必须是1


 WORD
biBitCount;


 //表示颜色时要用到的位数,1(单色),
4(16),
8(256),
24(真彩色)


 DWORD
biCompression;


 //指定位图是否压缩,有效的值为BI_RGBBI_RLE8BI_RLE4BI_BITFIELDS等,BI_RGB表示不压缩


 DWORD
biSizeImage;


 //实际的位图数据占用的字节数,即
biSizeImage=biWidth’ ×
biHeightbiWidth’biWidth
按照4的整倍数调整后的结果


 LONG
biXPelsPerMeter; //目标设备的水平分辨率,单位是每米的象素个数


 LONG
biYPelsPerMeter; //目标设备的垂直分辨率,单位是每米的象素个数


 DWORD
biClrUsed; //位图实际用到的颜色数,0表示颜色数为2biBitCount


 DWORD
biClrImportant; //位图中重要的颜色数,0表示所有颜色都重要


} BITMAPINFOHEADER;





3)调色板Palette


  调色板Palette针对的是需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有biClrUsed个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节,定义为:


typedef struct
tagRGBQUAD


{


 BYTE
rgbBlue; //蓝色分量


 BYTE
rgbGreen; //绿色分量


 BYTE
rgbRed; //红色分量


 BYTE
rgbReserved; //保留值


} RGBQUAD;


4)实际的位图数据ImageDate


  对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的RGB值:


  a.单色位图:用1bit就可以表示象素的颜色索引值;


  b.16色位图:用4bit可以表示象素的颜色索引值;


  c.
256色位图:1个字节表示1个象素的颜色索引值;


  d.真彩色:3个字节表示1个象素的颜色RGB值。


  此外,位图数据每一行的字节数必须为4的整倍数,如果不是,则需要补齐。奇怪的是,位图文件中的数据是从下到上(而不是从上到下)、从左到右方式存储的。


详细位移结构见表01



01
位图文件结构内容摘要








































































































































 



偏移量



域的名称



大小



内容




 



 



 



图象文件





0000h



文件标识



2
bytes




两字节的内容用来识别位图的类型:



BM'
Windows
3.1x, 95, NT, ...



BA'
OS/2
Bitmap Array



CI'
OS/2
Color Icon



CP'
OS/2
Color Pointer



IC'
OS/2
Icon



PT'
OS/2
Pointer



注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识"BM"就行。



 



0002h



File
Size



1
dword



用字节表示的整个文件的大小



 



0006h



Reserved



1
dword



保留,必须设置为0



 



000Ah



Bitmap
Data Offset



1
dword



从文件开始到位图数据开始之间的数据(bitmap
data)
之间的偏移量



 



000Eh



Bitmap
Header Size



1
dword




位图信息头(Bitmap
Info Header)
的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:



28h - Windows
3.1x, 95, NT, ...



0Ch - OS/2 1.x



F0h - OS/2 2.x



注:在Windows95982000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。



 



0012h



Width



1
dword



位图的宽度,以象素为单位



 



0016h



Height



1
dword



位图的高度,以象素为单位



 



001Ah



Planes



1
word



位图的位面数(注:该值将总是1





图象



信息







 



 



001Ch



Bits
Per Pixel



1
word




每个象素的位数



1 -
单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)



4 - 16 色位图



8 - 256 色位图



16 - 16bit
高彩色位图



24 - 24bit
真彩色位图



32 - 32bit
增强型真彩色位图



 



001Eh



Compression



1
dword




压缩说明:



0 - 不压缩
(使用BI_RGB表示)



1 - RLE
8-
使用8RLE压缩方式(BI_RLE8表示)



2 - RLE
4-
使用4RLE压缩方式(BI_RLE4表示)



3 -
Bitfields-
位域存放方式(BI_BITFIELDS表示)



 



0022h



Bitmap
Data Size



1
dword



用字节数表示的位图数据的大小。该数必须是4的倍数



 



0026h



HResolution



1
dword



用象素/米表示的水平分辨率



 



002Ah



VResolution



1
dword



用象素/米表示的垂直分辨率



 



002Eh



Colors



1
dword



位图使用的颜色数。如8-比特/象素表示为100h或者
256.



 



0032h



Important
Colors



1
dword



指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要



调色板数据



根据BMP版本的不同而不同



Palette



N
* 4 byte




调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:


Frame1



图象数据



根据BMP版本及调色板尺寸的不同而不同



Bitmap
Data



xxx
bytes



该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。








~
1
~