关于Dialog的问题

weibz0525 2002-10-09 08:58:00
我想改变SaveDialog1中"保存"那个按钮的caption,代码如下
void __fastcall TForm1::SavePictureDialog1Show(TObject *Sender)
{
HWND h;
h=FindWindow(0,"另存为");
h=FindWindowEx(h,0,"Button","保存(&S)");
SetWindowText(h,"存储");
}
可就是不对,在OpenDialog中一这种方法的就没问题,我试过不是FindWindow的问题,
应该是FindWindowsEx的问题。难道不是Button吗??请各位前辈指导!
...全文
72 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
weibz0525 2002-10-14
  • 打赏
  • 举报
回复
to 斑竹;
那为什么我那种方法不对呢??
jishiping 2002-10-14
  • 打赏
  • 举报
回复
CommDlg_OpenSave_SetControlText 出自 commdlg.h
bluebird97073 2002-10-14
  • 打赏
  • 举报
回复
CommDlg_OpenSave_SetControlText 出之哪里?
clong320 2002-10-14
  • 打赏
  • 举报
回复
季老大 绝了!
jishiping 2002-10-14
  • 打赏
  • 举报
回复
上面有一点说错了,"帮助"按钮的ID应该是 pshHelp 。
jishiping 2002-10-14
  • 打赏
  • 举报
回复
补充说明一下,CommDlg_OpenSave_SetControlText是一个宏,它实际上是发
送消息CDM_SETCONTROLTEXT,用这个消息可以更改OpenSave对话框上的任意
一个控件的文字。IDOK是"打开"(或者保存)按钮的ID,IDCANCEL是"取消"
按钮的ID,IDHELP是"帮助"按钮的ID,还有其他一些标签的ID,请参见头文
件 dlgs.h 的内容。
bluebird97073 2002-10-14
  • 打赏
  • 举报
回复
季老大 牛!
jishiping 2002-10-14
  • 打赏
  • 举报
回复
用API很简单啊:
void __fastcall TForm1::SaveDialog1Show(TObject *Sender)
{
CommDlg_OpenSave_SetControlText(GetParent(SaveDialog1
->Handle), IDOK, "存储(&S)");
}
clong320 2002-10-14
  • 打赏
  • 举报
回复
to 楼主:
试过了,绝对没有问题,我用的是BCB5.5。 要说没道理,那可能是BCB之过啊?

void __fastcall TForm1::SaveDialog1Show(TObject *Sender)
{
HWND h;
AnsiString sStr, dStr;

sStr = "取消";
dStr = "保存(&S)";
h=FindWindow(NULL,"另存为");
h=FindWindowEx(h,NULL,"Button",sStr.c_str());
SetWindowText(h,"存储(&S)");
}
weibz0525 2002-10-14
  • 打赏
  • 举报
回复
还是斑竹说的详细,透彻,这个问题困扰我很久了,今天终于弄了个明白。揭贴
Sephil 2002-10-14
  • 打赏
  • 举报
回复
用GetDlgItem
jishiping 2002-10-14
  • 打赏
  • 举报
回复
你那个方法,当时确实是将"保存"那个按钮的caption改掉了。但是每当文件/
目录更改时,系统会自动更改"保存"按钮的caption。最简单的就是,当你选
择一个文件时,"保存"按钮的caption为"保存",当你选择一个目录时,你会
看到"保存"按钮的caption变为"打开"。这就验证了我上面说的当文件/目录更
改时,系统会自动更改"保存"按钮的caption。由于你直接通过窗口的句柄用
API函数SetWindowText来改变"保存"按钮的caption,而系统并不知道你做的
改动,所以系统还是使用原来的Caption。而通过Open/Save对话框的专有消
息,通知系统改动"保存"按钮的caption,系统就会使用改动后的Caption。在
对话框的OnShow事件后,系统至少会发生1次文件/目录改变的消息,这时"保
存"按钮的caption就会被系统又改掉了,所以当对话框出现时,“保存”按钮
的caption就已经变成缺省的“保存”了。
weibz0525 2002-10-13
  • 打赏
  • 举报
回复
to aawolf:
EnumChildWindows不会用哦。参数我改了,在opendialog1下好使,在savedialog1下就不好使哦
qdxby 2002-10-13
  • 打赏
  • 举报
回复
TO weibz0525(小虫)
哦,我理解错了。
看起来没错啊。是不是&应该换成别的符号?
aawolf 2002-10-13
  • 打赏
  • 举报
回复
不知道在干什么,还是用EnumChildWindows好了。FindWindowEx是可以这么用的,你把第三个参数改成0,试一下。
weibz0525 2002-10-13
  • 打赏
  • 举报
回复
to 足球小子:
那怎么可以呢?我的目的就是要改变"保存"那个按钮的Text,去掉他不把窗口的Text该掉了吗?
qdxby 2002-10-13
  • 打赏
  • 举报
回复
void __fastcall TForm1::SavePictureDialog1Show(TObject *Sender)
{
HWND h;
h=FindWindow(0,"另存为");
h=FindWindowEx(h,0,"Button","保存(&S)");//可以不用这一句吧
SetWindowText(h,"存储");
}
albert 2002-10-09
  • 打赏
  • 举报
回复
我加了个Timer1上去,让它去改就行。如果不用Timer1,也可以改过来,但好象很快有改回“保存(&S)”了。郁闷!:(
albert 2002-10-09
  • 打赏
  • 举报
回复
试一下:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

HWND hButton;
static BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam);

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
hButton = NULL;

Timer1->Interval = 200;
Timer1->Enabled = true;

SaveDialog1->Execute();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SaveDialog1Show(TObject *Sender)
{
HWND h;
h=FindWindow(0,"Áí´æÎª");
EnumChildWindows(h, (WNDENUMPROC)EnumChildProc, (long)0);
}
//---------------------------------------------------------------------------

BOOL CALLBACK EnumChildProc( HWND hwnd, // handle to child window
LPARAM lParam // application-defined value
)
{
char sWindowClass[256];
char sWindowText[256];
AnsiString strWindowClass;
AnsiString strWindowName;

::GetClassName(hwnd, sWindowClass, 256);

strWindowClass = sWindowClass;
if (strWindowClass == _T("Button"))// || strWindowClass == _T("ComboBox"))
{
GetWindowText(hwnd, sWindowText, 256);
strWindowName = AnsiString(sWindowText);
if (AnsiPos("±£´æ", strWindowName) > 0)
{
hButton = hwnd;
SetWindowText(hwnd,"Test");
}
}
return TRUE;
}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (hButton)
{
SetWindowText(hButton,"Test");
Timer1->Enabled = false;
}
}
//---------------------------------------------------------------------------
bluebird97073 2002-10-09
  • 打赏
  • 举报
回复
HWND h;
h=FindWindow(0,"另存为");
h=FindWindowEx(h,0,"Button","保存(&S)");
if(SetWindowText(h,"存储"))
Beep();
事实上SetWindowText(h,"存储")调用成功~但是text却没改变~
迷惑~~~
加载更多回复(3)

13,873

社区成员

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

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