关于“应用WinXP风格界面”的问题

jishiping 2003-04-25 06:13:18
创建一个文本格式的文件(假设名为xp.manifest),内容如下:

<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<assembly xmlns ="urn:schemas-microsoft-com:asm.v1" manifestVersion = "1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="MS.WinXP.xp.exe"
type="win32"
/>
<description>WinXP</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

然后写一个资源文件(.rc文件),增加一个类型是24编号是1的资源:
1 24 "xp.manifest"

将这个资源文件(.rc文件)加入到Project中,这样编译后的程序,在WinXP下控件就有XP风格了。 但是我发现一个问题,如果Form上有TListView控件,并且ViewStyle=vsReport,那么每当窗口激活时,就会出现非法访问内存的问题。如果Form上没有TListView控件,或者TListView控件的属性ViewStyle不为vsReport,则没有问题。哪位知道如何解决这个问题?这里先谢谢大家。
...全文
33 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2003-05-14
  • 打赏
  • 举报
回复
来迟了!
sncel 2003-04-27
  • 打赏
  • 举报
回复
我用BCB6,Delphi7试了在XP下运行都没有问题。
jishiping 2003-04-27
  • 打赏
  • 举报
回复
我又看了一下,在.bpr文件里确实有XPStyle.res",但是Project1.cpp里没有
USERES("XPStyle.res"); 编译出来的程序里,确实没有类型为24、ID为1的资源。
myy 2003-04-27
  • 打赏
  • 举报
回复
J头:我发给你的工程怎么可能没有加 RC 呢?(下面是 .bpr的片段)
不过,我的工程确实是用“全编译”的,可能这才是关键吧。



....
<RESFILES value="Project1.res XPStyle.res"/>
......
<FILE FILENAME="XPStyle.RC" FORMNAME="" UNITNAME="XPStyle.RC" CONTAINERID="RCCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
........
jishiping 2003-04-27
  • 打赏
  • 举报
回复
看来是BCB5的BUG,BCB6已经修正这个BUG了。就此结贴。
jishiping 2003-04-27
  • 打赏
  • 举报
回复
已经知道BCB5与BCB6的不同了,上面的“现在也不清楚BCB5究竟有什么问题”应该去掉。
jishiping 2003-04-27
  • 打赏
  • 举报
回复
To myy and sncel(地狱情人-杨勇):
我一直还在用BCB5,刚才用BCB6试了一下,发现BCB6没有这个问题。现在也不清楚BCB5
究竟有什么问题。至于源程序comctrls.pas的TCustomListView.UpdateColumn函数,我看了
一下,BCB6里确实已经修正了这个错误。
procedure TCustomListView.UpdateColumn(AnIndex: Integer);
const IAlignment: array[Boolean, TAlignment] of LongInt =
((LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_CENTER),
(LVCFMT_RIGHT, LVCFMT_LEFT, LVCFMT_CENTER));
var
Column: TLVColumn;
AAlignment: TAlignment;
begin
if HandleAllocated then
with Column, Columns.Items[AnIndex] do
begin
mask := LVCF_TEXT or LVCF_FMT or LVCF_IMAGE;
iImage := FImageIndex;
pszText := PChar(Caption);
AAlignment := Alignment;
if Index <> 0 then
fmt := IAlignment[UseRightToLeftAlignment, AAlignment]
else fmt := LVCFMT_LEFT;
if FImageIndex <> -1 then
fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES
else //BCB6比BCB5多了这个else语句,FImageIndex==-1时,mask没有LVCF_IMAGE
mask := mask and not LVCF_IMAGE;
if WidthType > ColumnTextWidth then
begin
mask := mask or LVCF_WIDTH;
cx := FWidth;
ListView_SetColumn(Handle, Columns[AnIndex].FOrderTag, Column);
end
else begin
ListView_SetColumn(Handle, Columns[AnIndex].FOrderTag, Column);
if ViewStyle = vsList then
ListView_SetColumnWidth(Handle, -1, WidthType)
else if (ViewStyle = vsReport) and not OwnerData then
ListView_SetColumnWidth(Handle, Columns[AnIndex].FOrderTag, WidthType);
end;
end;
end;
xabcxyz 2003-04-26
  • 打赏
  • 举报
回复
学习,顺便接点分,呵呵。
Friecin 2003-04-26
  • 打赏
  • 举报
回复
为什么这么肯定?
iYoung 2003-04-26
  • 打赏
  • 举报
回复
现在的程序应用这个方法实现 XP 界面都会有一定的问题。等开发工具的发展吧。
Friecin 2003-04-26
  • 打赏
  • 举报
回复
我遇到了一个别的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

在应用XP风格以后,(编辑了xp.manifest,加入了.rc),我的ToolBar(Parent=CoolBar)上的TToolButton却工作不正常。
当鼠标放上去的时候,ToolButton可以浮起来,但是当鼠标点击的时候,ToolButton从效果上却不能按,并且将ToolButton->Style=tbsCheck时,无法相应事件?Why?
help!
Friecin 2003-04-26
  • 打赏
  • 举报
回复
我遇到了一个别的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

在应用XP风格以后,(编辑了xp.manifest,加入了.rc),我的ToolBar(Parent=CoolBar)上的TToolButton却工作不正常。
当鼠标放上去的时候,ToolButton可以浮起来,但是当鼠标点击的时候,ToolButton从效果上却不能按,并且将ToolButton->Style=tbsCheck时,无法相应事件?Why?
help!
jishiping 2003-04-26
  • 打赏
  • 举报
回复
顶一下。
jishiping 2003-04-26
  • 打赏
  • 举报
回复
我不想用其它控件(用其它控件可以做到不在WinXP下也有WinXP的风格),我现在只需要在
WinXP下有XP风格就可以了。但是有TListView控件,并且ViewStyle=vsReport,每当窗口激
活时,就会出现非法访问内存的问题。有谁能够解决这个问题?
jishiping 2003-04-26
  • 打赏
  • 举报
回复
现在还有问题。使用上面的方法,程序采用静态连接可以了。但是如果程序采用动态连接的
话,程序使用的还是Borland的DLL里的旧的TCustomListView的函数,程序仍然会出现非法访
问内存。
qibo999 2003-04-26
  • 打赏
  • 举报
回复
学习,接分.
jishiping 2003-04-26
  • 打赏
  • 举报
回复
To myy:
你的例子里,你忘了将 rc 文件加到 Project 中了,所以编译出来的程序根本没有 XP
风格的界面(主要是指Form上的控件)。我刚才试了一下 COKING(疯间猖越) 说的那个网页
上(http://www.cx66.com/cxgzs/program/delphi/911.htm)提供的方法,将comctrls.pas
拷贝到程序目录下,修改TCustomListView.UpdateColumn函数,然后将comctrls.pas加入到
Project 中,程序真的就没有问题了。但是缺点就是编译好的程序大小增加了200多KB。
myy 2003-04-26
  • 打赏
  • 举报
回复
我的TListView是两行两列的,不过没有关联ImageIndex.
myy 2003-04-26
  • 打赏
  • 举报
回复
J头,你的e-mail......
jishiping 2003-04-26
  • 打赏
  • 举报
回复
To myy:
刚才看了 COKING(疯间猖越) 说的那个帖子,可能是你的TListView中没有任何Item,
或者TListView中的每个Item的ImageIndex>=0。我用那篇文章的方法先试试看。
加载更多回复(14)

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧