線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4388
推到 Plurk!
推到 Facebook!

如何 disable TOpenDialog 上的 『建立新資料夾』這個button ?

答題得分者是:taishyang
Eigen
初階會員


發表:19
回覆:36
積分:26
註冊:2002-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-07 18:00:17 IP:210.202.xxx.xxx 訂閱
我利用 opendialog 讓使用者來開啟記錄檔

但是我不希望使用者在該目錄下 『建立新資料夾』

請問, opendialog 上 右上往左數過來第二個 『建立資料夾』這個 button 要如何 disable ?

非常感謝~~
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-07 18:17:29 IP:61.64.xxx.xxx 訂閱
你不希望使用者在該目錄下 『建立新資料夾』

但 disable 這個 button 真的有用嗎?

如果沒用,那你豈不在浪費時間,除非你只是在研究 disable 該 button 的方法

針對不希望使用者在該目錄下 『建立新資料夾』
你需要 GroupPolicy 來處理

不然 CMD, Explorer 許多方式都可以,在在該目錄下 『建立新資料夾』

===================引 用 Eigen 文 章===================
我利用 opendialog 讓使用者來開啟記錄檔

但是我不希望使用者在該目錄下 『建立新資料夾』

請問, opendialog 上 右上往左數過來第二個 『建立資料夾』這個 button 要如何 disable ?

非常感謝~~
Eigen
初階會員


發表:19
回覆:36
積分:26
註冊:2002-12-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-08 02:53:03 IP:220.142.xxx.xxx 訂閱
我不是要讓 pc 沒有新增資料夾的功能

我是要讓,類似這樣 TOpenDialog 的畫面,其中最右上數過來第二個 『建立新資料夾』的功能失效

www.bytescout.com/images/examples/moviesextractor_youtube_video_save_as_flv_dlg.png



因為我做的功能是『開啟舊檔』,那『建立新資料夾』就是不需要的功能,

所以我才會想將 TOpenDialog 的這個 功能關掉(和 pc 其它軟體、設定一點關系都沒有,只是因為我要做一個開啟舊檔的畫面

而這個 『建立新資料夾』的功能變得很礙眼。

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-01-08 10:09:04 IP:61.64.xxx.xxx 訂閱
你覺得他礙眼,那自己寫一個吧,花不了幾分鐘

===================引 用 Eigen 文 章===================
我不是要讓 pc 沒有新增資料夾的功能

我是要讓,類似這樣 TOpenDialog 的畫面,其中最右上數過來第二個 『建立新資料夾』的功能失效

www.bytescout.com/images/examples/moviesextractor_youtube_video_save_as_flv_dlg.png



因為我做的功能是『開啟舊檔』,那『建立新資料夾』就是不需要的功能,

所以我才會想將 TOpenDialog 的這個 功能關掉(和 pc 其它軟體、設定一點關系都沒有,只是因為我要做一個開啟舊檔的畫面

而這個 『建立新資料夾』的功能變得很礙眼。
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-01-08 18:49:29 IP:61.222.xxx.xxx 訂閱
[code delphi]
uses CommCtrl;

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Execute;
end;

procedure TForm1.OpenDialog1Show(Sender: TObject);
const
TB_BTN_NEWFOLDER = 40962;
var
hWndToolbar, wnd: HWND;
tbInfo: TTBButtonInfoA;
begin
tbInfo.cbSize := SizeOf(TTBButtonInfo);
tbInfo.dwMask := TBIF_STATE;
tbinfo.fsState := TBSTATE_HIDDEN or TBSTATE_INDETERMINATE;

hWndToolbar := FindWindowEx(GetParent((Sender as TOpenDialog).Handle), 0,'ToolbarWindow32', nil);
SendMessage(hWndToolbar, TB_SETBUTTONINFO, TB_BTN_NEWFOLDER ,LParam(@tbinfo));
end;

[/code]


爽快結案是種美德。
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-01-08 19:01:00 IP:122.124.xxx.xxx 訂閱
COOL~~~

借用前輩的程式,改成BCB版本提供給有需要的網友
void __fastcall TForm1::OpenDialog1Show(TObject *Sender)
{
const int TB_BTN_NEWFOLDER = 40962;
HWND hWndToolbar, wnd;
TTBButtonInfoA tbInfo;
tbInfo.cbSize = sizeof(TTBButtonInfo);
tbInfo.dwMask = TBIF_STATE;
tbInfo.fsState = TBSTATE_HIDDEN | TBSTATE_INDETERMINATE;
hWndToolbar = FindWindowEx(GetParent(((TOpenDialog*)Sender)->Handle),
0, "ToolbarWindow32", NULL);
SendMessage(hWndToolbar, TB_SETBUTTONINFO, TB_BTN_NEWFOLDER, LPARAM(&tbInfo));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->Execute();
}


===================引 用 RootKit 文 章===================
[code delphi]
uses CommCtrl;

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Execute;
end;

procedure TForm1.OpenDialog1Show(Sender: TObject);
const
TB_BTN_NEWFOLDER = 40962;
var
hWndToolbar, wnd: HWND;
tbInfo: TTBButtonInfoA;
begin
tbInfo.cbSize := SizeOf(TTBButtonInfo);
tbInfo.dwMask := TBIF_STATE;
tbinfo.fsState := TBSTATE_HIDDEN or TBSTATE_INDETERMINATE;

hWndToolbar := FindWindowEx(GetParent((Sender as TOpenDialog).Handle), 0,'ToolbarWindow32', nil);
SendMessage(hWndToolbar, TB_SETBUTTONINFO, TB_BTN_NEWFOLDER ,LParam(@tbinfo));
end;

[/code]


爽快結案是種美德。
Eigen
初階會員


發表:19
回覆:36
積分:26
註冊:2002-12-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-01-10 14:01:03 IP:210.202.xxx.xxx 訂閱
謝謝

在 opendialog onshow 加入程式,可以達到我的要求

一開始我 我google search "TTBButtonInfoA" 跟本查不到任何有用的資料

後來 我 search TBSTATE_HIDDEN TBSTATE_INDETERMINATE 終於找到足夠的參考資料

我大概看懂這個程式的寫法,附上參考的資料給大家參考

http://study.qqcf.com/web/522/97283.htm

第6章 演练CToolBar
6.1 工具条控制的主要功能
所谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮、检查盒按钮、无线按钮等。工具条对象类派生于主窗口架框类CframeWnd或CMDIFrameWnd,其类控制CToolBar::GetToolBarCtrl是MFC类库中封装的一个成员函数,允许使用类库中提供的一般控制和附加功能,CtoolBar类控制成员控制提供了Windows一般控制的所有功能,然而,通过调用 GetToolBarCtrl成员函数取得引用后,可以使工具条具有更强的特性。
工具条的创建具有四个步聚:首先是建立工具条资源;然后建立工具条对象结构;其次通过调用建立函数建立工具条对象并绑定;最后调用LoadToolBar调入工具条资源。
另外,还可以通过直接加载位图的方法来建立,步骤如下:首先建立工具条对象;然后通过调用建立函数建立工具条并绑定对象;其次调入包含按钮的位图;最后利用SetButtons 函数设置按钮的风格并与位图建立联系。
其中,所有按钮位图均存放在一个位图文件中,按钮位图的大小相同,默认为16点宽、15点高,位图必须从左至右存放。设置按钮函数具有指向一组控制标识符ID的指针和索引值,用来确定每个按钮的位置,如果存在分隔符ID_SEPARATOR, 那么该图像就不存在索引值。正常情况下工具条中的按钮都是单排从左至右排列的,可以通过SetButtonInfo函数改变排序规则。 工具条中最终形成的按钮大小相同,均为24 x 22 象素,每个按钮只对象一幅图像。工具条中的按钮默认为下推按钮,通过设置TBBS_CHECKBOX风格可以实现检查盒按钮,通过调用SetRadio成员函数可以实现无线按钮。
6.2 工具条控制的对象结构
6.2.1 工具条的对象结构
6.2.1.1 工具条的建立方法
CToolBar &ToolBar 建立工具条对象结构
Create 建立工具条对象并绑定
工具条类CToolBar::Create 的调用格式如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
UINT nID = AFX_IDW_TOOLBAR );
其中参数pParentWnd用来确定指向工具条父窗口的指针;参数dwStyle用来确定工具条的风格,其取值如下;参数nID用来确定工具条子窗口的标识符。
CBRS_TOP 表示工具条在框架窗口的顶部
CBRS_BOTTOM 表示工具条在框架窗口的底部
CBRS_NOALIGN 表示工具条在父窗口改变大小时不响应
CBRS_TOOLTIPS 表示工具条具有动态提示功能
CBRS_SIZE_DYNAMIC 表示工具条是静态的不能改变
CBRS_SIZE_FIXED 表示工具条是动态的可以改变
CBRS_FLOATING 表示工具条是浮动的
CBRS_FLYBY 表示状态条上显示工具条中按钮的信息
CBRS_HIDE_INPLACE 表示工具条隐藏
除以上函数外,还包括设置按钮和位图的大小SetSizes、设置工具条的高度SetHeight、调入工具条资源LoadToolBar、调入工具条按钮位图LoadBitmap、设置工具条按钮位图SetBitmap、设置工具条中位图按钮的风格和索引值SetButtons等控制函数。
6.2.1.2 工具条的类属性
工具条控制类的属性包括取得标识符ID对象按钮索引CommandToIndex、取得索引对应的命令标识符ID或分隔符GetItemID、取得索引对应的矩形区域GetItemRect、取得按钮风格 GetButtonStyle、设置按钮风格SetButtonStyle、取得按钮的ID标识-风格-图象数GetButtonInfo、设置按钮ID标识-风格-图象数SetButtonInfo、取得按钮提示文本GetButtonText、设置按钮提示文本SetButtonText和取得工具条直接存取控制GetToolBarCtrl等。
6.2.2 工具条控制的对象结构
6.2.2.1 工具条控制的建立方法
CToolBarCtrl &ToolBarCtrl 建立工具条控制对象结构
Create 建立工具条控制对象并绑定
工具条控制类CToolBarCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定工具条控制的风格,必须存在WS_CHILD风格;参数rect用来确定工具条控制的大小和位置;参数pParentWnd用来确定工具条控制的父窗口指针,不能为NULL;参数nID用来确定工具条控制的标识符。
可以利用WS_CHILD、WS_VISIBLE和WS_DISABLED来设置工具条窗口的风格,但必须合理设置如下控制风格:
CCS_ADJUSTABLE 允许用户处理工具条窗口大小,如果存在工具条窗口必须处理相应信
CCS_BOTTOM 使控制处于父窗口客户区域底部并与窗口同样宽
CCS_NODIVIDER 禁止在控制的顶部绘制2个象素的高亮条
CCS_NOHILITE 禁止在控制的顶部绘制1个象素的高亮条
CCS_NOMOVEY 使控制改变大小和移动时自动水平对齐,垂直对齐必须处理WM_SIZE消息
如果CCS_NORESIZE风格有效,则该风格无效
CCS_NOPARENTALIGN禁止控制自动移到父窗口顶部或底部,如果CCS_TOP或 CCS_BOTTOM风格
有效,则高度调整为默认而宽度可以改变
CCS_NORESIZE 禁止设置新的大小或无效值时使用默认宽度和高度值,而使用建立值
CCS_TOP 使控制自动停靠在父窗口客户区域顶部并与父窗口同样宽度
最后,还必须利用下面的风格来控制工具条
TBSTYLE_TOOLTIPS 使工具条建立并管理动态提示控制
TBSTYLE_WRAPABLE 使工具条控制按钮具有多行排列格式
6.2.2.2 工具条控制中的数据结构
工具条控制中最常用的数据结构为TBBUTTON,其具体结构如下:
typedef struct _TBBUTTON {
int iBitmap; // 基于0的位图索引值
int idCommand; // 按钮按下时发送的命令值
BYTE fsState; // 按钮的状态
BYTE fsStyle; // 按钮的风格
DWORD dwData; // 应用程序定义的数据
int iString; // 基于0的按钮标签字符串索引值
} TBBUTTON;
其中按钮状态fsState的值如下:
TBSTATE_CHECKED 表示按钮具有TBSTYLE_CHECKED风格并且被按下
TBSTATE_ENABLED 表示按钮允许接受输入,否则变灰不接受任何输入
TBSTATE_HIDDEN 表示按钮不可见并且不接受任何输入
TBSTATE_INDETERMINATE 表示按钮是变灰的
TBSTATE_PRESSED 表示按钮正被按下
TBSTATE_WRAP 表示按钮具有换行特性,该按钮必须具有TBSTATE_ENABLED状态
按钮风格style可以是下列值的组合:
TBSTYLE_BUTTON 表示建立标准下推按钮
TBSTYLE_CHECK 表示建立检查状态按钮
TBSTYLE_CHECKGROUP表示建立检查按钮群
TBSTYLE_GROUP 表示建立按下状态按钮群
TBSTYLE_SEP 表示建立按钮分隔符
6.2.2.3 工具条控制的类属性
工具条控制的类属性必然的联系判断按钮使能状态IsButtonEnabled、判断按钮检查状态 IsButtonChecked、判断按钮按下状态IsButtonPressed、判断按钮是否隐藏IsButtonHidden、判断按钮变灰状态IsButtonIndeterminate、设置按钮状态SetState、取得按钮状态GetState、取得按钮有关信息GetButton、取得按钮总数GetButtonCount、取得按钮矩形区域GetItemRect、设置按钮结构大小SetButtonStructSize、设置按钮大小SetButtonSize、设置按钮位图大小SetBitmapSize、取得按钮提示控制GetToolTips、设置按钮提示控制SetToolTips等。
6.2.2.4 工具条控制类的操作方法
工具条控制类的操作方法包括使能按钮EnableButton、检查按钮CheckButton、按下按钮PressButton、隐藏按钮HideButton、变灰按钮Indeterminate、增加按钮AddButtons、插入按钮InsertButton、删除按钮DeleteButton、取得控制符ID对应的索引CommandToIndex、恢复工具条状态RestoreState、保存工具条状态SaveState和重新确定工具条大小AutoSize等。
6.3 工具条控制的应用技巧
可以这样说,工具条和上述常用控制是应用程序中不可缺少的功能元素,它的优劣会直接影响程序的基本
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-01-10 14:08:04 IP:118.169.xxx.xxx 訂閱
分數應該是屬於RootKit前輩的,我只是翻成BCB而已 ^^|
Eigen
初階會員


發表:19
回覆:36
積分:26
註冊:2002-12-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-01-10 16:49:59 IP:210.202.xxx.xxx 訂閱
問題是我看不懂 delphi  呀   

只好委屈 RootKit
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-01-11 18:35:50 IP:61.222.xxx.xxx 訂閱
沒關係地!.....  頂多把你列入本人拒答黑名單。
哈...哈...哈..........

===================引 用 Eigen 文 章===================
問題是我看不懂 delphi 呀

只好委屈 RootKit
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-01-28 23:54:07 IP:123.195.xxx.xxx 訂閱
那請問有什麼辦法可以在所有程式的 OpenDialog 裡頭,都加上自己的按鈕,並為這個按鈕加上自己想要的功能嗎?
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-01-02 11:23:35 IP:203.73.xxx.xxx 訂閱
請問40962這個值是如何找出來的? 以及如何找出來有哪些 Button 可用?
TB_BTN_NEWFOLDER = 40962;

謝謝
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2024-11-21 22:09:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!